import { useState } from 'react' import { useNavigate } from '@tanstack/react-router' import { useQuery } from '@tanstack/react-query' import { cn } from '@/lib/utils' import { fetchTestWithParts } from '@/features/toeic/api/test-list-api' import { fetchQuestionsForTest } from '@/hooks/use-questions' import { useTestStore } from '@/store/test-store' import { useRequireAuth } from '@/hooks/use-require-auth' interface Props { testId: number } export function ToeicTestDetail({ testId }: Props) { const navigate = useNavigate() const { startExam } = useTestStore() const { requireAuth } = useRequireAuth() const [selectedParts, setSelectedParts] = useState([]) const [loading, setLoading] = useState(false) const { data, isLoading } = useQuery({ queryKey: ['test-detail', testId], queryFn: () => fetchTestWithParts(testId), }) function togglePart(partNumber: number) { setSelectedParts(prev => prev.includes(partNumber) ? prev.filter(p => p !== partNumber) : [...prev, partNumber] ) } async function handleStart(mode: 'full' | 'parts') { if (!requireAuth()) return if (mode === 'parts' && selectedParts.length === 0) return if (!data) return setLoading(true) try { const partNumbers = mode === 'full' ? undefined : selectedParts const parts = await fetchQuestionsForTest(testId, partNumbers) const totalSeconds = mode === 'full' ? data.test.durationMinutes * 60 : selectedParts.length * 10 * 60 startExam({ testId, testName: data.test.title, parts, totalSeconds }) navigate({ to: '/toeic/session' }) } finally { setLoading(false) } } if (isLoading) { return (
) } if (!data) return null const { test, parts } = data return (
{/* Back + title */}

{test.title}

{test.totalQuestions} câu · {test.durationMinutes} phút

{/* Full test card */}
military_tech
military_tech

Thi Toàn Bộ

{test.totalQuestions} câu · {test.durationMinutes} phút · Toàn bộ {parts.length} parts

Mô phỏng bài thi TOEIC thực tế với giới hạn thời gian.

{/* Part selection card */}
checklist

Chọn Part Luyện Tập

Chọn các part muốn luyện tập

{parts.map((part) => { const checked = selectedParts.includes(part.partNumber) return ( ) })}
) }