// WaSecretariaView — painel da Secretária IA (motor) no scoreodonto. Estágio 1: // chat de teste via proxy POST /api/nw/v1/secretaria/ask. A configuração do // cérebro/agente vive no motor (acessível ao super-admin). import React, { useRef, useState } from 'react'; import { PageHeader } from '../components/PageHeader.tsx'; const API = (import.meta as any).env?.VITE_API_URL || '/api'; async function ask(chatId: string, message: string) { const token = localStorage.getItem('SCOREODONTO_AUTH_TOKEN'); const res = await fetch(`${API}/nw/v1/secretaria/ask`, { method: 'POST', headers: { 'Content-Type': 'application/json', ...(token ? { Authorization: `Bearer ${token}` } : {}) }, body: JSON.stringify({ chatId, message, contactName: 'Teste (painel)' }), }); if (!res.ok) throw new Error(`${res.status} ${await res.text().catch(() => '')}`.slice(0, 200)); return res.json(); } export const WaSecretariaView: React.FC = () => { const [turns, setTurns] = useState>([]); const [text, setText] = useState(''); const [busy, setBusy] = useState(false); const [err, setErr] = useState(null); const chatId = useRef(`painel-${Date.now()}`); const endRef = useRef(null); const send = async () => { if (!text.trim() || busy) return; const q = text.trim(); setText(''); setBusy(true); setErr(null); try { const r = await ask(chatId.current, q); setTurns((p) => [...p, { q, a: r.reply ?? JSON.stringify(r) }]); setTimeout(() => endRef.current?.scrollIntoView(), 50); } catch (e: any) { setErr(String(e.message)); } finally { setBusy(false); } }; return (
{err &&
Erro: {err}
}
{!turns.length &&
Faça uma pergunta para testar a Secretária (ex.: "Quais procedimentos vocês fazem e os valores?").
} {turns.map((t, i) => (
{t.q}
{t.a}
))} {busy &&
Secretária digitando…
}
setText(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && send()} placeholder="Pergunte algo…" style={{ flex: 1, padding: '8px 12px', borderRadius: 8, border: '1px solid #d1d5db' }} />
); };