import * as React from "react" import { cn } from "@/lib/utils" export type CalendarSchedulerEvent = { id: string title: React.ReactNode date: string time?: string tone?: "default" | "success" | "warning" | "danger" durationMinutes?: number description?: React.ReactNode meta?: React.ReactNode badge?: React.ReactNode icon?: React.ReactNode disabled?: boolean hidden?: boolean className?: string } export type CalendarSchedulerProps = React.ComponentProps<"div"> & { events: CalendarSchedulerEvent[] days?: string[] view?: "day" | "week" | "month" variant?: "board" | "agenda" density?: "compact" | "default" | "comfortable" title?: React.ReactNode description?: React.ReactNode actions?: React.ReactNode empty?: React.ReactNode selectedEventId?: string defaultSelectedEventId?: string onSelectedEventChange?: (eventId: string, event: CalendarSchedulerEvent) => void onCreateEvent?: (date: string) => void onEventClick?: (event: CalendarSchedulerEvent) => void renderEvent?: (event: CalendarSchedulerEvent, state: { selected: boolean }) => React.ReactNode createLabel?: React.ReactNode showCount?: boolean dayClassName?: string eventClassName?: string formatDay?: (day: string) => React.ReactNode } const toneClassName = { default: "border-border bg-muted", success: "border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-900 dark:bg-emerald-950 dark:text-emerald-300", warning: "border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-300", danger: "border-red-200 bg-red-50 text-red-700 dark:border-red-900 dark:bg-red-950 dark:text-red-300", } function CalendarScheduler({ events, days, view = "week", variant = "board", density = "default", title, description, actions, empty = "No events scheduled.", selectedEventId, defaultSelectedEventId, onSelectedEventChange, onCreateEvent, onEventClick, renderEvent, createLabel = "Create event", showCount = true, dayClassName, eventClassName, formatDay, className, ...props }: CalendarSchedulerProps) { const [internalSelectedEventId, setInternalSelectedEventId] = React.useState(defaultSelectedEventId) const currentSelectedEventId = selectedEventId ?? internalSelectedEventId const visibleEvents = events.filter((event) => !event.hidden) const visibleDays = days ?? Array.from(new Set(visibleEvents.map((event) => event.date))) const selectEvent = (event: CalendarSchedulerEvent) => { if (event.disabled) return if (selectedEventId === undefined) setInternalSelectedEventId(event.id) onSelectedEventChange?.(event.id, event) onEventClick?.(event) } if (visibleDays.length === 0) { return (
{empty}
{onCreateEvent ? : null}{description}
: null}