/** * Блок «Список занятий на выбранный день» / «Форма создания/редактирования» с анимацией cube. * Используется в Dashboard и других страницах. */ 'use client'; import React, { useState } from 'react'; import { format, startOfDay, addDays, subDays } from 'date-fns'; import { ru } from 'date-fns/locale'; import { LessonCard } from '@/components/dashboard/LessonCard'; import { StudentSelect } from '@/components/dashboard/StudentSelect'; import { SubjectSelect } from '@/components/dashboard/SubjectSelect'; import { LoadingSpinner } from '@/components/common/LoadingSpinner'; import { Switch } from '@/components/common/Switch'; import { DatePicker } from '@/components/common/DatePicker'; import { TimePicker } from '@/components/common/TimePicker'; import type { LessonPreview } from '@/api/dashboard'; import type { Student } from '@/api/students'; import type { Subject, MentorSubject } from '@/api/subjects'; export interface CheckLessonFormData { client: string; title: string; description: string; start_date: string; start_time: string; duration: number; price: number | undefined; is_recurring: boolean; } export interface CheckLessonProps { /** Выбранная дата */ selectedDate: Date; /** Дата для отображения в заголовке (например, displayDate) */ displayDate: Date; /** Идёт загрузка занятий */ lessonsLoading: boolean; /** Занятия на выбранный день */ lessonsForSelectedDate: LessonPreview[]; /** Открыта ли форма (создание/редактирование) — переворот cube */ isFormVisible: boolean; /** Предыдущий день */ onPrevDay: () => void; /** Следующий день */ onNextDay: () => void; /** Добавить занятие (открыть форму создания) */ onAddLesson: () => void; /** Клик по карточке занятия (открыть форму редактирования или просмотра) */ onLessonClick: (lesson: { id: string }) => void; /** Ментор — может добавлять и редактировать; для остальных только просмотр */ isMentor?: boolean; /** Кнопка «Добавить» и компоненты загружены */ buttonComponentsLoaded?: boolean; // Форма formComponentsLoaded: boolean; lessonEditLoading: boolean; isEditingMode: boolean; formLoading: boolean; formError: string | null; formData: CheckLessonFormData; setFormData: React.Dispatch>; selectedSubjectId: number | null; selectedMentorSubjectId: number | null; onSubjectChange: (subjectId: number | null, mentorSubjectId: number | null) => void; students: Student[]; subjects: Subject[]; mentorSubjects: MentorSubject[]; onSubmit: (e: React.FormEvent) => void; onCancel: () => void; /** Удалить занятие (только в режиме редактирования). deleteAllFuture — удалить всю цепочку постоянных. */ onDelete?: (deleteAllFuture: boolean) => void; } export const CheckLesson: React.FC = ({ selectedDate, displayDate, lessonsLoading, lessonsForSelectedDate, isFormVisible, onPrevDay, onNextDay, onAddLesson, onLessonClick, isMentor = false, buttonComponentsLoaded = false, formComponentsLoaded, lessonEditLoading, isEditingMode, formLoading, formError, formData, setFormData, selectedSubjectId, selectedMentorSubjectId, onSubjectChange, students, subjects, mentorSubjects, onSubmit, onCancel, onDelete, }) => { const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const navDisabled = lessonsLoading || isFormVisible; const formDisabled = formLoading || lessonEditLoading; const headerDateLabel = React.useMemo(() => { const now = new Date(); const sameYear = displayDate?.getFullYear?.() === now.getFullYear(); const fmt = sameYear ? 'd MMMM' : 'd MMMM yyyy'; try { return format(displayDate, fmt, { locale: ru }); } catch { return ''; } }, [displayDate]); const handleDeleteClick = () => { if (!onDelete) return; if (formData.is_recurring) { setShowDeleteConfirm(true); } else { if (typeof window !== 'undefined' && window.confirm('Удалить занятие?')) { onDelete(false); } } }; const handleDeleteConfirm = (deleteAllFuture: boolean) => { onDelete?.(deleteAllFuture); setShowDeleteConfirm(false); }; return (
{/* Лицевая сторона: Список занятий */}

{headerDateLabel}

{/* Контент (скроллится) */}
{lessonsLoading ? ( ) : lessonsForSelectedDate.length === 0 ? (

Нет занятий на этот день

) : (
{lessonsForSelectedDate.map((lesson) => ( onLessonClick(lesson) : undefined} /> ))}
)}
{/* Footer — кнопка «Добавить занятие» только для ментора */} {buttonComponentsLoaded && isMentor && (
)}
{/* Обратная сторона: Форма создания/редактирования */}
{!formComponentsLoaded || (isEditingMode && lessonEditLoading) ? ( ) : ( <>

{isEditingMode ? 'Редактировать занятие' : 'Создать занятие'}

{formError && (
{formError}
)}
setFormData((prev) => ({ ...prev, client: value }))} disabled={formLoading || isEditingMode} required />
{ if (value != null) { const s = subjects.find((x) => x.id === value); if (s) onSubjectChange(value, null); else onSubjectChange(null, value); } else { onSubjectChange(null, null); } }} disabled={formLoading} required />