import { useState, useEffect } from 'react'; import { format } from 'date-fns'; import { useNavigate } from 'react-router-dom'; import { Calendar } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { cn } from '@/lib/utils'; interface DashboardEvent { id: number; title: string; start_datetime: string; end_datetime: string; all_day: boolean; color?: string; is_starred?: boolean; } interface CalendarWidgetProps { events: DashboardEvent[]; } function getEventTimeState(event: DashboardEvent, now: Date) { if (event.all_day) return 'all-day' as const; const start = new Date(event.start_datetime).getTime(); const end = new Date(event.end_datetime).getTime(); const current = now.getTime(); if (current >= end) return 'past' as const; if (current >= start && current < end) return 'current' as const; return 'future' as const; } function getProgressPercent(event: DashboardEvent, now: Date): number { if (event.all_day) return 0; const start = new Date(event.start_datetime).getTime(); const end = new Date(event.end_datetime).getTime(); if (end <= start) return 0; const current = now.getTime(); if (current >= end) return 100; if (current <= start) return 0; return Math.round(((current - start) / (end - start)) * 100); } export default function CalendarWidget({ events }: CalendarWidgetProps) { const navigate = useNavigate(); const todayStr = format(new Date(), 'yyyy-MM-dd'); const [clientNow, setClientNow] = useState(() => new Date()); useEffect(() => { const interval = setInterval(() => setClientNow(new Date()), 60_000); return () => clearInterval(interval); }, []); const hasCurrentEvent = events.some((e) => getEventTimeState(e, clientNow) === 'current'); return (
Today's Events
{events.length === 0 ? (

Enjoy the free time

) : (
{events.map((event) => { const timeState = getEventTimeState(event, clientNow); const progress = getProgressPercent(event, clientNow); const isCurrent = timeState === 'current'; const isPast = timeState === 'past'; return (
navigate('/calendar', { state: { date: todayStr, view: 'timeGridDay', eventId: event.id } })} className={cn( 'flex items-center gap-2 py-1.5 rounded-md hover:bg-card-elevated transition-colors duration-150 cursor-pointer relative pl-3.5', isCurrent && 'bg-accent/[0.05]', isPast && 'opacity-50' )} > {/* Time progress bar — always rendered for consistent layout */}
{!event.all_day && (
)}
{event.all_day ? 'All day' : `${format(new Date(event.start_datetime), 'h:mm a')} – ${format(new Date(event.end_datetime), 'h:mm a')}`} {event.title}
); })}
)} ); }