// 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 (