UNPKG

@medalsocial/meda

Version:

Shared Meda UI shell and runtime package.

56 lines (55 loc) 2.54 kB
'use client'; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useCallback } from 'react'; import { cn } from '../lib/utils.js'; import { CalendarToolbar } from './calendar-toolbar.js'; import { DayView } from './day-view.js'; import { addDays, addMonths } from './internal/date.js'; import { MonthView } from './month-view.js'; import { DEFAULT_CALENDAR_LABELS } from './types.js'; import { WeekView } from './week-view.js'; export function Calendar({ view = 'month', date, events, onDateChange, onViewChange, onEventClick, onSlotClick, weekStartsOn = 0, locale = 'en-US', labels: labelOverrides, className, renderEvent, }) { const labels = { ...DEFAULT_CALENDAR_LABELS, ...labelOverrides }; const handlePrev = useCallback(() => { if (!onDateChange) return; if (view === 'month') { onDateChange(addMonths(date, -1)); } else if (view === 'week') { onDateChange(addDays(date, -7)); } else { onDateChange(addDays(date, -1)); } }, [view, date, onDateChange]); const handleNext = useCallback(() => { if (!onDateChange) return; if (view === 'month') { onDateChange(addMonths(date, 1)); } else if (view === 'week') { onDateChange(addDays(date, 7)); } else { onDateChange(addDays(date, 1)); } }, [view, date, onDateChange]); const handleToday = useCallback(() => { onDateChange?.(new Date()); }, [onDateChange]); const handleViewChange = useCallback((next) => { onViewChange?.(next); }, [onViewChange]); const sharedProps = { date, events, onEventClick, onSlotClick, locale, labels, renderEvent, }; return (_jsxs("div", { "data-slot": "calendar", className: cn('@container/calendar flex flex-col gap-3', className), children: [_jsx(CalendarToolbar, { date: date, view: view, onPrev: handlePrev, onNext: handleNext, onToday: handleToday, onViewChange: onViewChange ? handleViewChange : undefined, locale: locale, labels: labels }), view === 'month' && (_jsx(MonthView, { ...sharedProps, weekStartsOn: weekStartsOn, onDateClick: onDateChange ? (d) => onDateChange(d) : undefined })), view === 'week' && (_jsx(WeekView, { ...sharedProps, weekStartsOn: weekStartsOn, onDateClick: onDateChange ? (d) => onDateChange(d) : undefined })), view === 'day' && _jsx(DayView, { ...sharedProps })] })); }