// Aura Chatbox Widget // Fetches config from dashboard API, routes messages through backend. const DASHBOARD = 'https://aura.auraajenticai.cloud' const ChatboxWidget = () => { const [config, setConfig] = React.useState(null) const [open, setOpen] = React.useState(false) const [messages, setMessages] = React.useState([]) const [input, setInput] = React.useState('') const [loading, setLoading] = React.useState(false) const [isAfterHours, setIsAfterHours] = React.useState(false) const messagesEndRef = React.useRef(null) React.useEffect(() => { fetch(`${DASHBOARD}/api/public/chatbox`) .then(r => r.ok ? r.json() : null) .then(cfg => { if (!cfg) return setConfig(cfg) if (cfg.isEnabled) { const afterHours = checkAfterHours(cfg.businessHours) setIsAfterHours(afterHours) setMessages([{ role: 'bot', text: cfg.welcomeMessage }]) } }) .catch(() => {}) }, []) React.useEffect(() => { if (open && messagesEndRef.current) { messagesEndRef.current.scrollIntoView({ behavior: 'smooth' }) } }, [messages, open]) function checkAfterHours(businessHours) { if (!businessHours) return false const days = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'] const now = new Date() const day = days[now.getDay()] const hours = businessHours[day] if (!hours || hours === 'closed') return true const [open, close] = hours.split('-').map(t => { const [h, m] = t.split(':').map(Number) return h * 60 + (m || 0) }) // UTC+6 Bangladesh time const bdMin = ((now.getUTCHours() + 6) % 24) * 60 + now.getUTCMinutes() return bdMin < open || bdMin >= close } async function sendMessage() { if (!input.trim() || loading || isAfterHours) return const text = input.trim() setInput('') setMessages(prev => [...prev, { role: 'user', text }]) setLoading(true) try { const res = await fetch(`${DASHBOARD}/api/public/chatbox/chat`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ message: text }), }) const data = await res.json() setMessages(prev => [...prev, { role: 'bot', text: data.reply || config?.fallbackMessage }]) } catch { setMessages(prev => [...prev, { role: 'bot', text: config?.fallbackMessage || "I'll get back to you soon." }]) } finally { setLoading(false) } } function onKey(e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); sendMessage() } } if (!config?.isEnabled) return null return (
{/* Chat window */} {open && (
{/* Header */}
Aura AI
{isAfterHours ? 'After hours' : 'Online'}
{/* Messages */}
{messages.map((m, i) => (
{m.text}
))} {loading && (
•••
)} {isAfterHours && (
{config.afterHoursMessage}
)}
{/* Input */}
setInput(e.target.value)} onKeyDown={onKey} disabled={isAfterHours || loading} placeholder={isAfterHours ? 'Chat unavailable right now' : 'Ask me anything…'} style={{ flex: 1, padding: '8px 12px', background: 'rgba(255,255,255,0.05)', border: '1px solid rgba(255,255,255,0.1)', borderRadius: 8, color: '#f4f5f7', fontSize: 13, outline: 'none', }} />
)} {/* Toggle button */}
) } window.ChatboxWidget = ChatboxWidget