import React, { useState, useEffect } from 'react'; import { User, Building2, ShieldCheck, LogOut, KeyRound, CheckCircle2, AlertCircle, Eye, EyeOff, Loader2 } from 'lucide-react'; import { HybridBackend } from '../services/backend.ts'; import { GoogleConnectButton } from '../components/GoogleConnectButton.tsx'; import { useToast } from '../contexts/ToastContext.tsx'; import { APP_VERSION } from '../constants.ts'; export const ConfiguracoesView: React.FC = () => { const [connectedAccounts, setConnectedAccounts] = useState([]); const [credsStatus, setCredsStatus] = useState<{ configured: boolean; clientIdHint: string | null; fromEnv: boolean } | null>(null); const [clientId, setClientId] = useState(''); const [clientSecret, setClientSecret] = useState(''); const [showSecret, setShowSecret] = useState(false); const [savingCreds, setSavingCreds] = useState(false); const currentRole = HybridBackend.getCurrentRole(); const userName = HybridBackend.getCurrentUserName(); const userEmail = HybridBackend.getCurrentUser(); const activeWorkspace = HybridBackend.getActiveWorkspace(); const clinColor = activeWorkspace?.cor || '#2563eb'; const toast = useToast(); const authHeader = { 'Authorization': `Bearer ${localStorage.getItem('SCOREODONTO_AUTH_TOKEN')}`, 'Content-Type': 'application/json' }; const fetchGoogleStatus = async () => { try { const res = await fetch('/api/auth/google/status'); setConnectedAccounts(await res.json()); } catch {} }; const fetchCredsStatus = async () => { try { const res = await fetch('/api/settings/google-credentials', { headers: authHeader }); if (res.ok) setCredsStatus(await res.json()); } catch {} }; useEffect(() => { fetchGoogleStatus(); if (currentRole === 'admin') fetchCredsStatus(); }, []); const handleSaveCreds = async () => { if (!clientId.trim() || !clientSecret.trim()) { toast.error('PREENCHA OS DOIS CAMPOS.'); return; } setSavingCreds(true); try { const res = await fetch('/api/settings/google-credentials', { method: 'POST', headers: authHeader, body: JSON.stringify({ clientId: clientId.trim(), clientSecret: clientSecret.trim() }) }); if (res.ok) { toast.success('CREDENCIAIS SALVAS!'); setClientId(''); setClientSecret(''); await fetchCredsStatus(); } else { const d = await res.json(); toast.error(d.error || 'ERRO AO SALVAR.'); } } catch { toast.error('FALHA NA CONEXÃO.'); } finally { setSavingCreds(false); } }; const handleLogout = () => { if (window.confirm('TEM CERTEZA QUE DESEJA SAIR DO SISTEMA?')) { HybridBackend.logout(); } }; return (

Configurações

Gerencie seu perfil e integrações

{APP_VERSION}
{/* Perfil */}

Perfil

{userName || '—'}

{userEmail || '—'}

{currentRole}
{/* Unidade ativa */}

Unidade Ativa

{activeWorkspace?.nome || 'Sem unidade vinculada'}

{activeWorkspace?.id && (

ID: {activeWorkspace.id}

)}
{/* Integrações — só para admin */} {currentRole === 'admin' && (

Integrações Google

{/* Credenciais OAuth */}
Credenciais OAuth 2.0
{credsStatus?.configured ? (
{credsStatus.fromEnv ? 'Via ENV' : 'Configurado'}
) : (
Não configurado
)}
{credsStatus?.configured && credsStatus.clientIdHint && !credsStatus.fromEnv && (

Client ID atual

{credsStatus.clientIdHint}

)} {credsStatus?.fromEnv && (

Credenciais carregadas via variável de ambiente. Para substituir, preencha os campos abaixo.

)}
setClientId(e.target.value)} placeholder={credsStatus?.configured ? 'Deixe vazio para manter atual' : 'xxxxxxxxxxxx.apps.googleusercontent.com'} className="w-full border border-gray-200 rounded-xl px-4 py-2.5 text-sm font-mono focus:ring-2 focus:ring-blue-100 focus:border-blue-300 outline-none transition-all" />
setClientSecret(e.target.value)} placeholder={credsStatus?.configured ? 'Deixe vazio para manter atual' : 'GOCSPX-...'} className="w-full border border-gray-200 rounded-xl px-4 py-2.5 pr-10 text-sm font-mono focus:ring-2 focus:ring-blue-100 focus:border-blue-300 outline-none transition-all" />

Obtenha as credenciais em{' '} console.cloud.google.com {' '}→ APIs & Services → Credentials → OAuth 2.0 Client ID. Adicione{' '} https://scoreodonto.com/api/oauth2callback {' '}como URI de redirecionamento autorizado.

{/* Conectar conta Google */}

Conta conectada

a.owner_id === 'admin' || a.owner_id === userEmail)} onStatusChange={fetchGoogleStatus} />
)} {/* Segurança */}

Segurança

Sessão ativa e autenticada
); };