import { useEffect, useState, useCallback } from 'react'; import { TimerView } from './components/TimerView'; import { TaskList } from './components/TaskList'; import { SettingsPanel } from './components/SettingsPanel'; import { NotificationOverlay } from './components/NotificationOverlay'; import { useTimerEvents } from './hooks/useTimerEvents'; import { useTaskStore } from './store/taskStore'; import { useSettingsStore } from './store/settingsStore'; function GearIcon() { return ( ); } function App() { const [settingsOpen, setSettingsOpen] = useState(false); const [notifVisible, setNotifVisible] = useState(false); const [notifTaskId, setNotifTaskId] = useState(null); const fetchTasks = useTaskStore((s) => s.fetchTasks); const fetchSettings = useSettingsStore((s) => s.fetchSettings); // Bootstrap data on mount useEffect(() => { fetchTasks(); fetchSettings(); }, [fetchTasks, fetchSettings]); const handleCompleted = useCallback((taskId: string | null) => { setNotifTaskId(taskId); setNotifVisible(true); }, []); useTimerEvents(handleCompleted); return ( {/* Sidebar */} {/* Main area */} {/* Top bar */} setSettingsOpen(true)} title="Settings" style={{ display: 'flex', alignItems: 'center', padding: '6px', border: 'none', background: 'transparent', color: 'var(--fg-3)', cursor: 'pointer', borderRadius: 'var(--r-2)', transition: 'color 0.15s ease', }} onMouseEnter={(e) => { (e.currentTarget as HTMLButtonElement).style.color = 'var(--fg-1)'; }} onMouseLeave={(e) => { (e.currentTarget as HTMLButtonElement).style.color = 'var(--fg-3)'; }} > {/* Timer */} {/* Overlays */} setSettingsOpen(false)} /> setNotifVisible(false)} /> ); } export default App;