'use client'; import { useEffect, useRef } from 'react'; import { useStore } from '@/lib/store'; import { api } from '@/lib/api'; import Sidebar from '@/components/Sidebar'; import MessageList from '@/components/MessageList'; import MessageInput from '@/components/MessageInput'; import SettingsPanel from '@/components/SettingsPanel'; export default function Home() { const { settings, setSettings, setConversations, setCurrentId, setMessages, currentId, settingsOpen, setSettingsOpen, sidebarOpen, setSidebarOpen, } = useStore(); // SSE — listen for dream notifications const sseRef = useRef(null); useEffect(() => { function connect() { const es = new EventSource('/api/events'); sseRef.current = es; es.onmessage = (e) => { try { const data = JSON.parse(e.data); if (data.type === 'dream') { if ('Notification' in window && Notification.permission === 'granted') { new Notification('Bird dreamed', { body: `${data.mode?.toUpperCase()} dream delivered — ${data.filename}`, icon: '/icon-192.png', }); } } } catch {} }; es.onerror = () => { es.close(); setTimeout(connect, 10000); }; } if ('Notification' in window) { Notification.requestPermission(); } connect(); return () => sseRef.current?.close(); }, []); useEffect(() => { api.getSettings().then(s => { setSettings(s); document.documentElement.setAttribute('data-theme', s.theme || 'light'); document.documentElement.setAttribute('data-font', s.font_size || 'medium'); }).catch(console.error); // Clear stale persisted conversations then fetch fresh setConversations([]); api.getConversations().then(setConversations).catch(console.error); }, []); useEffect(() => { document.documentElement.setAttribute('data-theme', settings.theme || 'light'); document.documentElement.setAttribute('data-font', settings.font_size || 'medium'); }, [settings.theme, settings.font_size]); useEffect(() => { if (currentId) { api.getMessages(currentId).then(setMessages).catch(console.error); } else { setMessages([]); } }, [currentId]); return (
{/* Mobile sidebar overlay */} {sidebarOpen && (
setSidebarOpen(false)} /> )} {/* Sidebar — desktop: toggleable, mobile: slide-over */}
setSidebarOpen(false)} />
{/* Main — shrinks when settings opens */}
{/* Topbar */}
{/* Sidebar toggle */} Aaron AI {' '}— personal knowledge assistant
{/* Settings panel — pushes content, doesn't cover */}
); }