import React, { useState } from 'react'; import { Building2, ArrowRight, Shield, MapPin, BadgeCheck, Palette, Save, Loader2 } from 'lucide-react'; import { HybridBackend } from '../services/backend.ts'; import { PageHeader } from '../components/PageHeader.tsx'; import { useToast } from '../contexts/ToastContext.tsx'; // Cores profissionais permitidas const PRESET_COLORS = [ { name: 'Azul Score', value: '#2563eb' }, { name: 'Verde Esmeralda', value: '#059669' }, { name: 'Indigo Premium', value: '#4f46e5' }, { name: 'Vinho Elegante', value: '#9f1239' }, { name: 'Slate Moderno', value: '#334155' }, { name: 'Laranja Vibrante', value: '#ea580c' }, { name: 'Teal Clínico', value: '#0d9488' }, { name: 'Roxo Nobre', value: '#7c3aed' }, ]; export const ClinicasView: React.FC = () => { const workspaces = HybridBackend.getWorkspaces(); const activeWorkspace = HybridBackend.getActiveWorkspace(); const toast = useToast(); const currentRole = HybridBackend.getCurrentRole(); const isAdmin = currentRole === 'admin' || currentRole === 'donoclinica'; const [isEditingColor, setIsEditingColor] = useState(null); const [savingColor, setSavingColor] = useState(false); const handleSwitch = (workspaceId: string) => { if (activeWorkspace?.id === workspaceId) { toast.info("VOCÊ JÁ ESTÁ NESTA UNIDADE."); return; } HybridBackend.switchWorkspace(workspaceId); toast.success("TROCANDO DE UNIDADE..."); }; const handleUpdateColor = async (workspaceId: string, color: string) => { setSavingColor(true); try { const res = await fetch(`http://localhost:3005/api/clinicas/${workspaceId}/color`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cor: color }) }); if (res.ok) { toast.success("COR DA UNIDADE ATUALIZADA!"); // Atualizar o localStorage local para refletir a mudança sem refresh imediato no objeto workspaces const updatedWorkspaces = workspaces.map(w => w.id === workspaceId ? { ...w, cor: color } : w); localStorage.setItem('SCOREODONTO_WORKSPACES', JSON.stringify(updatedWorkspaces)); // Se a clínica editada for a ativa, atualizamos ela também if (activeWorkspace?.id === workspaceId) { localStorage.setItem('SCOREODONTO_ACTIVE_WORKSPACE', JSON.stringify({ ...activeWorkspace, cor: color })); } setIsEditingColor(null); // Forçamos um reload após um pequeno delay para aplicar as cores globalmente via CSS/Variables se necessário setTimeout(() => window.location.reload(), 1000); } else { toast.error("ERRO AO SALVAR COR."); } } catch (err) { toast.error("ERRO DE CONEXÃO."); } finally { setSavingColor(false); } }; return (
{workspaces.map((ws) => { const isActive = activeWorkspace?.id === ws.id; const clinColor = ws.cor || '#2563eb'; return (
{isActive && ( ATIVA )} {isAdmin && ( )}

{ws.nome}

{isEditingColor === ws.id ? (

Escolha a cor da marca

{PRESET_COLORS.map(c => ( ))}
) : ( <>
Unidade Operacional

Seu Perfil

{ws.role}

)}
); })}

Identidade Visual Dinâmica

A cor escolhida será aplicada automaticamente em toda a interface desta clínica.

{PRESET_COLORS.slice(0, 4).map(c => (
))}
); };