"use client"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { useCalendar } from "./CalendarContext"; import { Calendar as CalendarIcon, Clock, MapPin, ExternalLink, } from "lucide-react"; import { format, isSameDay, parseISO } from "date-fns"; import { ScrollArea } from "@/components/ui/scroll-area"; import { siteUrls } from "@/lib/config/sites"; function getEventDate(event: { start: { dateTime?: string; date?: string } }): Date { if (event.start.dateTime) { return parseISO(event.start.dateTime); } if (event.start.date) { return parseISO(event.start.date); } return new Date(); } function formatEventTime(event: { start: { dateTime?: string; date?: string }; end: { dateTime?: string; date?: string }; }): string { if (event.start.date && !event.start.dateTime) { return "All day"; } const start = event.start.dateTime ? parseISO(event.start.dateTime) : null; const end = event.end.dateTime ? parseISO(event.end.dateTime) : null; if (!start) return "TBD"; if (end) { return `${format(start, "h:mm a")} - ${format(end, "h:mm a")}`; } return format(start, "h:mm a"); } function formatEventDate(event: { start: { dateTime?: string; date?: string }; }): string { if (event.start.dateTime) { return format(parseISO(event.start.dateTime), "EEEE, MMMM d, yyyy"); } if (event.start.date) { return format(parseISO(event.start.date), "EEEE, MMMM d, yyyy"); } return "TBD"; } function getCalendarColor(calendarName: string): string { const colors: Record = { personal: "bg-pink-500/10 text-pink-500 border-pink-500/20", work: "bg-blue-500/10 text-blue-500 border-blue-500/20", health: "bg-green-500/10 text-green-500 border-green-500/20", social: "bg-purple-500/10 text-purple-500 border-purple-500/20", family: "bg-yellow-500/10 text-yellow-500 border-yellow-500/20", task: "bg-orange-500/10 text-orange-500 border-orange-500/20", }; const lower = calendarName.toLowerCase(); for (const [key, color] of Object.entries(colors)) { if (lower.includes(key)) return color; } return "bg-muted text-muted-foreground border-muted"; } function groupEventsByDate(events: ReturnType["events"]) { const groups: { date: Date; label: string; events: typeof events }[] = []; for (const event of events) { const eventDate = getEventDate(event); const today = new Date(); today.setHours(0, 0, 0, 0); let label: string; if (isSameDay(eventDate, today)) { label = "Today"; } else if (isSameDay(eventDate, new Date(today.getTime() + 86400000))) { label = "Tomorrow"; } else { label = format(eventDate, "EEEE, MMMM d"); } const existingGroup = groups.find((g) => isSameDay(g.date, eventDate)); if (existingGroup) { existingGroup.events.push(event); } else { groups.push({ date: eventDate, label, events: [event] }); } } return groups; } export function EventList() { const { events } = useCalendar(); const groupedEvents = groupEventsByDate(events); if (events.length === 0) { return (

No upcoming events

Events from your Google Calendar will appear here

); } return (
{groupedEvents.map((group) => (

{group.label}

{group.events.map((event) => ( ))}
))}
); } function EventCard({ event, }: { event: ReturnType["events"][0]; }) { const eventDate = getEventDate(event); const isAllDay = !!event.start.date && !event.start.dateTime; return (
{format(eventDate, "MMM")} {format(eventDate, "d")}

{event.summary}

{event.calendarName}
{event.description && (

{event.description}

)}
{formatEventTime(event)} {!isAllDay && ( {formatEventDate(event)} )} {event.location && ( {event.location} )}
); }