'use client'; import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { useAuth } from '@/contexts/AuthContext'; import { useSelectedChild } from '@/contexts/SelectedChildContext'; import { getHomework, getHomeworkById, type Homework, } from '@/api/homework'; import { HomeworkDetailsModal } from './HomeworkDetailsModal'; import { SubmitHomeworkModal } from './SubmitHomeworkModal'; import { DashboardLayout } from '@/components/dashboard/ui'; import { LoadingSpinner } from '@/components/common/LoadingSpinner'; function formatDate(s: string | null): string { if (!s) return '—'; const d = new Date(s); return isNaN(d.getTime()) ? '—' : d.toLocaleDateString('ru-RU', { day: 'numeric', month: 'long', year: 'numeric' }); } function formatTime(s: string | null): string { if (!s) return '—'; const d = new Date(s); return isNaN(d.getTime()) ? '—' : d.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' }); } function getHomeworkStatus(hw: Homework): 'pending' | 'submitted' | 'returned' | 'reviewed' { if (hw.status !== 'published') return 'pending'; if (hw.checked_submissions > 0 && hw.checked_submissions === hw.total_submissions) return 'reviewed'; if (hw.returned_submissions > 0 && hw.returned_submissions === hw.total_submissions) return 'returned'; if (hw.total_submissions > 0) return 'submitted'; return 'pending'; } export function HomeworkPageContent() { const { user } = useAuth(); const { selectedChild } = useSelectedChild(); const [homework, setHomework] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [selectedHomework, setSelectedHomework] = useState(null); const [detailsOpen, setDetailsOpen] = useState(false); const [detailsLoading, setDetailsLoading] = useState(false); const [submitId, setSubmitId] = useState(null); const [submitOpen, setSubmitOpen] = useState(false); const loadHomework = useCallback(async () => { try { setLoading(true); const res = await getHomework({ page_size: 1000, ...(user?.role === 'parent' && selectedChild?.id && { child_id: selectedChild.id }), }); setHomework(res.results); } catch (e) { setError(e instanceof Error ? e.message : 'Ошибка загрузки'); } finally { setLoading(false); } }, [user?.role, selectedChild?.id]); useEffect(() => { loadHomework(); }, [loadHomework]); const userRole = user?.role ?? ''; const pending = useMemo(() => homework.filter((hw) => getHomeworkStatus(hw) === 'pending' && hw.status === 'published'), [homework]); const submitted = useMemo(() => homework.filter((hw) => getHomeworkStatus(hw) === 'submitted'), [homework]); const returned = useMemo(() => homework.filter((hw) => getHomeworkStatus(hw) === 'returned'), [homework]); const reviewed = useMemo(() => homework.filter((hw) => getHomeworkStatus(hw) === 'reviewed'), [homework]); /** Только для ментора: черновики «заполнить позже» — ожидают заполнения задания. */ const fillLater = useMemo( () => (userRole === 'mentor' ? homework.filter((hw) => hw.fill_later === true) : []), [homework, userRole] ); /** Только для ментора: задания, у которых есть хотя бы одно решение с черновиком от ИИ. */ const aiDraft = useMemo( () => (userRole === 'mentor' ? homework.filter((hw) => (hw.ai_draft_count ?? 0) > 0) : []), [homework, userRole] ); const handleViewDetails = useCallback(async (hw: Homework) => { try { setDetailsLoading(true); const full = await getHomeworkById(hw.id); setSelectedHomework(full); setDetailsOpen(true); } catch { setSelectedHomework(hw); setDetailsOpen(true); } finally { setDetailsLoading(false); } }, []); const handleSubmit = useCallback((hw: Homework) => { setSubmitId(hw.id); setSubmitOpen(true); }, []); const HomeworkCard = ({ hw, badge, onView, onSubmit, }: { hw: Homework; badge: string; onView: () => void; onSubmit?: () => void; }) => (
{badge}

{hw.title}

{userRole === 'client' && (
person {hw.mentor.first_name} {hw.mentor.last_name}
)} {userRole === 'mentor' && hw.total_submissions > 0 && (
Решений: {hw.total_submissions}
)} {hw.deadline && ( <>
calendar_today {formatDate(hw.deadline)} {formatTime(hw.deadline)}
)} {hw.student_score?.score != null && (
Оценка: {hw.student_score.score} / 5
)}
{userRole === 'client' && onSubmit && getHomeworkStatus(hw) === 'pending' && ( )}
); const Column = ({ title, count, items, getBadge, }: { title: string; count: number; items: Homework[]; getBadge: (hw: Homework) => string; }) => (

{title} {count > 0 ? `(${count})` : ''}

{items.map((hw) => ( handleViewDetails(hw)} onSubmit={userRole === 'client' ? () => handleSubmit(hw) : undefined} /> ))} {items.length === 0 && (

Нет заданий

)}
); return ( {error && (
{error}
)} {loading ? (
) : homework.length === 0 ? (

Нет заданий

) : (
{userRole === 'mentor' && fillLater.length > 0 && ( 'Заполнить позже'} /> )} {pending.length > 0 && ( (hw.is_overdue ? 'Просрочено' : 'Домашнее задание')} /> )} {submitted.length > 0 && ( 'На проверке'} /> )} {userRole === 'mentor' && aiDraft.length > 0 && ( 'Черновик от ИИ'} /> )} {returned.length > 0 && ( 'На доработке'} /> )} {reviewed.length > 0 && ( 'Проверено'} /> )}
)} { setDetailsOpen(false); setSelectedHomework(null); }} onSuccess={loadHomework} /> { setSubmitOpen(false); setSubmitId(null); }} onSuccess={loadHomework} />
); }