import React, { useState, useEffect } from 'react'; import { X, ChevronLeft, ChevronRight, Save, Mail, Calendar, Settings as GearIcon, CheckCircle2 } from 'lucide-react'; import { HybridBackend } from '../services/backend.ts'; import { Settings, Dentista } from '../types.ts'; import { useToast } from '../contexts/ToastContext.tsx'; import { GoogleConnectButton } from './GoogleConnectButton.tsx'; import { Link as LinkIcon, Copy, Share2 } from 'lucide-react'; interface AgendaSettingsModalProps { isOpen: boolean; onClose: () => void; dentists: Dentista[] | null; } export const AgendaSettingsModal: React.FC = ({ isOpen, onClose, dentists }) => { const [page, setPage] = useState(1); const [config, setConfig] = useState({ clinicEmail: '', clinicCalendarId: '', googleApiKey: '', googleCalendarIds: {} }); const [isSaving, setIsSaving] = useState(false); const [connectedAccounts, setConnectedAccounts] = useState([]); const toast = useToast(); // Escopo: tudo (status Google, convites, settings) é da clínica/workspace ativa. const clinicaId = HybridBackend.getActiveWorkspace()?.id; const fetchGoogleStatus = async () => { try { const response = await fetch(`/api/auth/google/status${clinicaId ? `?clinicaId=${clinicaId}` : ''}`); const data = await response.json(); setConnectedAccounts(Array.isArray(data) ? data : []); } catch (error) { console.error("Erro ao buscar status do Google:", error); } }; useEffect(() => { if (isOpen) { const loadSettings = async () => { try { const settings = await HybridBackend.getSettings(); setConfig({ clinicEmail: settings.clinicEmail || '', clinicCalendarId: settings.clinicCalendarId || '', googleApiKey: settings.googleApiKey || '', googleCalendarIds: settings.googleCalendarIds || {} }); } catch (error) { console.error("Erro ao carregar configurações:", error); } }; loadSettings(); fetchGoogleStatus(); setPage(1); // Reset to first page } }, [isOpen]); const copyInviteLink = (dentistId: string) => { const url = `/api/auth/google/url?dentistId=${dentistId}${clinicaId ? `&clinicaId=${clinicaId}` : ''}`; navigator.clipboard.writeText(url); toast.success("LINK DE CONVITE COPIADO!"); }; const handleSave = async () => { setIsSaving(true); try { await HybridBackend.saveSettings(config); toast.success("CONFIGURAÇÕES SALVAS COM SUCESSO!"); onClose(); } catch (error) { toast.error("ERRO AO SALVAR CONFIGURAÇÕES."); } finally { setIsSaving(false); } }; if (!isOpen) return null; const totalPages = 2; // Conta admin/clínica conectada NESTA clínica: usa o owner_id real (email) p/ o // disconnect funcionar; 'admin' fica só no connect (o backend resolve o email). const adminAccount = connectedAccounts.find(a => a.owner_id && a.owner_id.includes('@')); return (
{/* Header */}

Configurações da Agenda

Integrações e Comunicação

{/* Progress Bar */}
{/* Content Area - Horizontal Slider Simulation */}
{/* Page 1: Clinic Emails */}

E-mails da Clínica

setConfig({ ...config, clinicEmail: e.target.value.toUpperCase() })} />

* Este e-mail será usado para alertas de sistema e envio de comprovantes.

{/* Page 3: Google Calendar Mapping */}

Agendas dos Dentistas

Abrir Google Calendar

Conectar Google Agenda

É só clicar e autorizar com a conta Google. Você NÃO precisa criar projeto, ativar API nem colar nenhum ID — a integração já está pronta.

Os agendamentos são copiados para o Google (backup) e o paciente recebe convite + lembretes (1 dia e 1h antes). Se já estava conectado, reconecte uma vez para liberar a escrita.

{/* ADMIN / CLINIC CONNECTION */}

Sua Conta (Administrador)

Contas dos Dentistas

{dentists?.length ? dentists.map((dentist) => { const isConnected = connectedAccounts.some(a => a.owner_id === dentist.id); return (
{dentist.nome}
{isConnected ? ( Conectado ) : ( Não Vinculado )}
{!isConnected && ( )}
); }) : (

Nenhum dentista cadastrado.

)}
{/* Footer Navigation */}
{page > 1 && ( )}
{page < totalPages ? ( ) : ( )}
); };