import React, { useState, useEffect } from 'react'; import { Target, Plus, Edit, Trash2, Loader2, X, Users } from 'lucide-react'; import { getOrigins, createOriginGroup, updateOriginGroup, deleteOriginGroup, createOriginItem, updateOriginItem, deleteOriginItem, getTeams } from '../services/dataService'; import { OriginGroupDef, OriginItemDef } from '../types'; export const Origins: React.FC = () => { const [originGroups, setOriginGroups] = useState([]); const [teams, setTeams] = useState([]); const [selectedGroupId, setSelectedGroupId] = useState(null); const [loading, setLoading] = useState(true); const [isModalOpen, setIsModalOpen] = useState(false); const [editingItem, setEditingItem] = useState(null); const [formData, setFormData] = useState({ name: '' }); const [isSaving, setIsSaving] = useState(false); // Group creation state const [isGroupModalOpen, setIsGroupModalOpen] = useState(false); const [groupName, setGroupName] = useState(''); const tenantId = localStorage.getItem('ctms_tenant_id') || ''; const loadData = async () => { setLoading(true); const [fetchedGroups, fetchedTeams] = await Promise.all([ getOrigins(tenantId), getTeams(tenantId) ]); setOriginGroups(fetchedGroups); setTeams(fetchedTeams); if (!selectedGroupId && fetchedGroups.length > 0) { setSelectedGroupId(fetchedGroups[0].id); } setLoading(false); }; useEffect(() => { loadData(); }, [tenantId]); const selectedGroup = originGroups.find(g => g.id === selectedGroupId); // --- Group Handlers --- const handleCreateGroup = async (e: React.FormEvent) => { e.preventDefault(); setIsSaving(true); try { const res = await createOriginGroup({ name: groupName, tenantId }); setSelectedGroupId(res.id); setIsGroupModalOpen(false); setGroupName(''); loadData(); } catch (err) { alert("Erro ao criar grupo de origens."); } finally { setIsSaving(false); } }; const handleDeleteGroup = async (id: string) => { if (originGroups.length <= 1) { alert("Você precisa ter pelo menos um grupo de origens ativo."); return; } if (confirm('Tem certeza que deseja excluir este grupo e todas as suas origens?')) { await deleteOriginGroup(id); setSelectedGroupId(null); loadData(); } }; const handleToggleTeam = async (teamId: string) => { if (!selectedGroup) return; const currentTeamIds = selectedGroup.teamIds || []; const newTeamIds = currentTeamIds.includes(teamId) ? currentTeamIds.filter(id => id !== teamId) : [...currentTeamIds, teamId]; // Optimistic const newGroups = [...originGroups]; const idx = newGroups.findIndex(g => g.id === selectedGroup.id); newGroups[idx].teamIds = newTeamIds; setOriginGroups(newGroups); await updateOriginGroup(selectedGroup.id, { teamIds: newTeamIds }); }; // --- Item Handlers --- const handleSaveItem = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedGroup) return; setIsSaving(true); try { if (editingItem) { await updateOriginItem(editingItem.id, formData); } else { await createOriginItem(selectedGroup.id, formData); } setIsModalOpen(false); loadData(); } catch (err: any) { alert(err.message || "Erro ao salvar origem."); } finally { setIsSaving(false); } }; const handleDeleteItem = async (id: string) => { if (confirm('Tem certeza que deseja excluir esta origem?')) { await deleteOriginItem(id); loadData(); } }; const openItemModal = (item?: OriginItemDef) => { if (item) { setEditingItem(item); setFormData({ name: item.name }); } else { setEditingItem(null); setFormData({ name: '' }); } setIsModalOpen(true); }; if (loading && originGroups.length === 0) return
; return (
{/* Sidebar: Groups List */}

Configurações

{originGroups.map(g => ( ))}
{/* Main Content: Selected Group Details */}
{selectedGroup ? ( <>

{selectedGroup.name}

Gerencie as origens deste grupo e quais times as utilizam.

{/* Teams Assignment */}

Times Atribuídos

{teams.length === 0 ? (

Nenhum time cadastrado na organização.

) : (
{teams.map(t => { const isAssigned = selectedGroup.teamIds?.includes(t.id); return ( ); })}
)}

Times não atribuídos a um grupo específico usarão o grupo padrão.

{/* Origin Items */}

Fontes de Tráfego

{selectedGroup.items?.map((o) => (
{o.name}
))} {(!selectedGroup.items || selectedGroup.items.length === 0) && (
Nenhuma origem configurada neste grupo.
)}
) : (
Selecione ou crie um grupo de origens.
)}
{/* Group Creation Modal */} {isGroupModalOpen && (

Novo Grupo

setGroupName(e.target.value)} placeholder="Ex: Origens B2B" className="w-full bg-white dark:bg-dark-input border border-zinc-200 dark:border-dark-border p-3 rounded-lg text-sm text-zinc-900 dark:text-zinc-100 focus:ring-2 focus:ring-brand-yellow/20 outline-none transition-all" required />
)} {/* Item Modal */} {isModalOpen && (

{editingItem ? 'Editar Origem' : 'Nova Origem'}

setFormData({...formData, name: e.target.value})} placeholder="Ex: Facebook Ads" className="w-full bg-white dark:bg-dark-input border border-zinc-200 dark:border-dark-border p-3 rounded-lg text-sm text-zinc-900 dark:text-zinc-100 focus:ring-2 focus:ring-brand-yellow/20 outline-none transition-all" required />
)}
); };