import { useState, useEffect, useRef } from 'react' import { Link } from 'react-router-dom' import { Bell, CheckCircle, Clock } from 'lucide-react' import { sessionsApi } from '@/api/sessions' import type { Session } from '@/types/session' function timeAgo(dateStr: string): string { const diff = Math.floor((Date.now() - new Date(dateStr).getTime()) / 1000) if (diff < 60) return 'just now' if (diff < 3600) return `${Math.floor(diff / 60)}m ago` if (diff < 86400) return `${Math.floor(diff / 3600)}h ago` return `${Math.floor(diff / 86400)}d ago` } export function NotificationsPanel() { const [open, setOpen] = useState(false) const [sessions, setSessions] = useState([]) const [hasNew, setHasNew] = useState(false) const ref = useRef(null) useEffect(() => { sessionsApi.list({ size: 8 }) .then(data => { setSessions(data) // Mark as "new" if any session was updated in the last hour const oneHourAgo = Date.now() - 3600000 setHasNew(data.some(s => new Date(s.started_at).getTime() > oneHourAgo)) }) .catch(() => {}) }, []) useEffect(() => { const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false) } if (open) document.addEventListener('mousedown', handler) return () => document.removeEventListener('mousedown', handler) }, [open]) return (
{open && (

Activity

setOpen(false)} className="text-[0.6875rem] text-muted-foreground hover:text-foreground" > View All
{sessions.length === 0 ? (
No recent activity
) : (
{sessions.map(session => ( setOpen(false)} className="flex items-start gap-3 px-4 py-3 hover:bg-accent/50 transition-colors" >
{session.completed_at ? ( ) : ( )}

{session.tree_snapshot?.name || 'Session'}

{session.completed_at ? `Completed ${timeAgo(session.completed_at)}` : `Started ${timeAgo(session.started_at)}`} {session.client_name && ` ยท ${session.client_name}`}

))}
)}
)}
) }