import { useState, useRef, useEffect } from 'react'; import { MessageCircle, X, Send, Flame } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { api } from '@/lib/api'; import { useAuth } from '@/lib/auth'; import { useTenant } from '@/lib/tenant'; export type AdminChatPage = 'billing' | 'settings' | 'templates' | 'agent' | 'onboarding' | 'general'; interface ChatMessage { role: 'user' | 'assistant'; text: string; } interface AdminChatProps { page: AdminChatPage; } export default function AdminChat({ page }: AdminChatProps) { const { t } = useTranslation(); const { token, user } = useAuth(); const { selectedOrgId } = useTenant(); const [open, setOpen] = useState(false); const [messages, setMessages] = useState([]); const [input, setInput] = useState(''); const [loading, setLoading] = useState(false); const chatEndRef = useRef(null); const PAGE_CONFIG: Record = { billing: { title: t('admin_chat.billing_title'), subtitle: t('admin_chat.billing_subtitle'), questions: [ t('admin_chat.billing_q1'), t('admin_chat.billing_q2'), t('admin_chat.billing_q3'), t('admin_chat.billing_q4'), ], }, settings: { title: t('admin_chat.settings_title'), subtitle: t('admin_chat.settings_subtitle'), questions: [ t('admin_chat.settings_q1'), t('admin_chat.settings_q2'), t('admin_chat.settings_q3'), t('admin_chat.settings_q4'), ], }, templates: { title: t('admin_chat.templates_title'), subtitle: t('admin_chat.templates_subtitle'), questions: [ t('admin_chat.templates_q1'), t('admin_chat.templates_q2'), t('admin_chat.templates_q3'), t('admin_chat.templates_q4'), ], }, agent: { title: t('admin_chat.agent_title'), subtitle: t('admin_chat.agent_subtitle'), questions: [ t('admin_chat.agent_q1'), t('admin_chat.agent_q2'), t('admin_chat.agent_q3'), t('admin_chat.agent_q4'), ], }, onboarding: { title: t('admin_chat.onboarding_title'), subtitle: t('admin_chat.onboarding_subtitle'), questions: [ t('admin_chat.onboarding_q1'), t('admin_chat.onboarding_q2'), t('admin_chat.onboarding_q3'), t('admin_chat.onboarding_q4'), ], }, general: { title: t('admin_chat.general_title'), subtitle: t('admin_chat.general_subtitle'), questions: [ t('admin_chat.general_q1'), t('admin_chat.general_q2'), t('admin_chat.general_q3'), t('admin_chat.general_q4'), ], }, }; const config = PAGE_CONFIG[page]; useEffect(() => { setMessages([]); setInput(''); }, [page]); useEffect(() => { if (open) chatEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages, open]); const send = async (question?: string) => { const q = (question ?? input).trim(); if (!q || loading || !selectedOrgId || !token) return; setInput(''); setMessages(prev => [...prev, { role: 'user', text: q }]); setLoading(true); try { const res = await api.post('/v1/billing/chat', { question: q, language: (user as any)?.language ?? 'FR', page, }, token, selectedOrgId); setMessages(prev => [...prev, { role: 'assistant', text: res.answer }]); } catch { setMessages(prev => [...prev, { role: 'assistant', text: t('admin_chat.error') }]); } finally { setLoading(false); } }; return ( <> {/* Floating button */} {/* Chat panel */} {open && (
{/* Header */}

{config.title}

{config.subtitle}

{/* Quick questions (only when no messages yet) */} {messages.length === 0 && (
{config.questions.map(q => ( ))}
)} {/* Messages */}
{messages.length === 0 && (

{t('admin_chat.choose_or_write')}

)} {messages.map((msg, i) => (
{msg.text}
))} {loading && (
)}
{/* Input */}
setInput(e.target.value)} onKeyDown={e => e.key === 'Enter' && send()} placeholder={t('admin_chat.input_placeholder')} className="flex-1 text-xs border border-slate-200 rounded-xl px-3 py-2 outline-none focus:ring-2 focus:ring-indigo-300 focus:border-indigo-300" disabled={loading} />
)} ); }