@medalsocial/meda
Version:
Shared Meda UI shell and runtime package.
56 lines (55 loc) • 2.54 kB
JavaScript
'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 })] }));
}