/** * Блок «Календарь занятий» — обёртка над LessonsCalendar. * Используется в Dashboard и других страницах. */ 'use client'; import React from 'react'; import { format, startOfDay } from 'date-fns'; import { LessonsCalendar } from '@/components/dashboard/LessonsCalendar'; import { LoadingSpinner } from '@/components/common/LoadingSpinner'; export interface CalendarLesson { id: number | string; title?: string; start_time: string; end_time: string; status?: string; client?: number; client_name?: string; subject?: string; } export interface CalendarProps { /** Занятия для отображения в календаре */ lessons: CalendarLesson[]; /** Идёт загрузка занятий */ lessonsLoading?: boolean; /** Выбранная дата (подсветка в календаре) */ selectedDate: Date; /** Клик по ячейке дня или по слоту */ onSelectSlot?: (date: Date) => void; /** Клик по событию (занятию) */ onSelectEvent?: (lesson: { id: string }) => void; /** Смена видимого месяца (start/end месяца) */ onMonthChange?: (start: Date, end: Date) => void; } export const Calendar: React.FC = ({ lessons, lessonsLoading = false, selectedDate, onSelectSlot, onSelectEvent, onMonthChange, }) => { const mappedLessons = React.useMemo( () => lessons.map((lesson) => ({ id: String(lesson.id), title: lesson.title || 'Занятие', start_time: lesson.start_time, end_time: lesson.end_time, status: (lesson.status || 'scheduled') as 'scheduled' | 'in_progress' | 'completed' | 'cancelled', client: lesson.client_name ? { id: String(lesson.client ?? ''), name: lesson.client_name, first_name: lesson.client_name.split(' ')[0] || lesson.client_name, last_name: lesson.client_name.split(' ').slice(1).join(' ') || '', } : undefined, })), [lessons] ); return (
{lessonsLoading ? ( ) : ( { try { const d = startOfDay(date); if (!Number.isNaN(d.getTime())) onSelectSlot?.(d); } catch { /* игнор невалидной даты */ } }} onSelectEvent={onSelectEvent} onMonthChange={onMonthChange} /> )}
); };