"use client"; import { useEffect, useState } from "react"; import type { FormEvent } from "react"; import AnswerForm from "@/components/game/AnswerForm"; import FeedbackPanel from "@/components/game/FeedbackPanel"; import ScoreSummary from "@/components/game/ScoreSummary"; import StageIndicator from "@/components/game/StageIndicator"; import KatexRenderer from "@/components/math/KatexRenderer"; import { useGameStore } from "@/store/gameStore"; import type { ProblemCount } from "@/store/gameStore"; function parseAnswer(value: string) { const trimmed = value.trim(); if (!/^-?\d+$/.test(trimmed)) return null; return Number(trimmed); } interface PlayClientProps { problemCount: ProblemCount; } export default function PlayClient({ problemCount }: PlayClientProps) { const session = useGameStore((state) => state.session); const selectedProblemCount = useGameStore( (state) => state.selectedProblemCount, ); const setProblemCount = useGameStore((state) => state.setProblemCount); const initSession = useGameStore((state) => state.initSession); const submitAnswer = useGameStore((state) => state.submitAnswer); const nextProblem = useGameStore((state) => state.nextProblem); const resetSession = useGameStore((state) => state.resetSession); const [answerA, setAnswerA] = useState(""); const [answerB, setAnswerB] = useState(""); const [inputError, setInputError] = useState(""); const sessionProblemCount = session?.problems.length ?? null; const currentProblem = session?.problems[session.currentIndex] ?? null; const currentResult = session?.results[session.currentIndex] ?? null; const isComplete = Boolean( session && session.currentIndex >= session.problems.length, ); const sessionNeedsInit = sessionProblemCount !== problemCount; const correctCount = session?.results.filter((result) => result?.correct).length ?? 0; const totalCount = session?.problems.length ?? 0; useEffect(() => { if (selectedProblemCount !== problemCount) { setProblemCount(problemCount); } if (sessionNeedsInit) { initSession(problemCount); } }, [ initSession, problemCount, selectedProblemCount, sessionProblemCount, sessionNeedsInit, setProblemCount, ]); useEffect(() => { setAnswerA(""); setAnswerB(""); setInputError(""); }, [currentProblem?.key]); function handleSubmit(event: FormEvent) { event.preventDefault(); if (currentResult || !currentProblem) return; const parsedA = parseAnswer(answerA); const parsedB = parseAnswer(answerB); if (parsedA === null || parsedB === null) { setInputError("두 칸 모두 정수로 입력하세요."); return; } setInputError(""); submitAnswer({ a: parsedA, b: parsedB }); } if (!session || sessionNeedsInit) { return (

문제를 준비하고 있습니다.

); } if (isComplete) { return ( ); } if (!currentProblem) { return (

현재 문제를 불러올 수 없습니다.

); } const submitted = currentResult !== null; const isLastProblem = session.currentIndex === session.problems.length - 1; return (

괄호 음수 분배

문제 풀이

괄호를 풀어 두 항을 순서대로 입력하세요.

{currentResult ? ( ) : null}
); }