import { motion } from 'framer-motion' import { useStatement } from '../store/statementStore' import { useNav } from '../store/navStore' import type { StatementCell } from '../types' import { EventCard } from './EventCard' import { SpinBox } from './SpinBox' export function StatementScreen() { const { phase, problem, inputs, result, setInput, submit, retry, backToSelect } = useStatement() const { setSection } = useNav() if (!problem) return null const isResult = phase === 'result' return (
{result && ( {result.score} / {result.total} 正解 )}
{/* 問題文・試算表資料 */} {/* 貸借対照表 */}
貸 借 対 照 表
{problem.bs_rows.map((row, ri) => { const leftOk = result ? result.rowResults.find((r) => r.rowIndex === ri)?.leftOk ?? true : null const rightOk = result ? result.rowResults.find((r) => r.rowIndex === ri)?.rightOk ?? true : null return ( {/* 左: ラベル */} {/* 左: 金額 */} {/* 右: 金額 */} ) })}
資産の部 金額 負債・純資産の部 金額
{renderLabelCell(row.left.label, `bs_${ri}_left_label`, inputs, setInput, isResult)} {renderAmountCell(row.left.amount, `bs_${ri}_left_amount`, `bs_${ri}_left_amount2`, inputs, setInput, isResult)} {/* 右: ラベル */} {renderLabelCell(row.right.label, `bs_${ri}_right_label`, inputs, setInput, isResult)} {renderAmountCell(row.right.amount, `bs_${ri}_right_amount`, `bs_${ri}_right_amount2`, inputs, setInput, isResult)}
{/* 結果 */} {isResult && result && (
{result.correct ? '🎉' : '🤔'} {result.correct ? '正解!' : `${result.score} / ${result.total} 問正解`}

解説

{problem.explanation}
)} {!isResult && ( )}
) } function renderLabelCell( cell: StatementCell, key: string, inputs: Record, setInput: (k: string, v: string | number) => void, locked: boolean, ): React.ReactNode { if (cell.type === 'given_label') { if (!cell.value) return return {String(cell.value)} } if (cell.type === 'blank_account') { return ( setInput(key, e.target.value)} placeholder="( )" className="w-16 rounded border border-slate-500 bg-slate-900/70 px-2 py-0.5 text-slate-100 outline-none focus:border-cyan-400 disabled:opacity-60" /> {cell.suffix && {cell.suffix}} ) } return null } function renderAmountCell( cell: StatementCell, key: string, key2: string, inputs: Record, setInput: (k: string, v: string | number) => void, locked: boolean, ): React.ReactNode { if (cell.type === 'given_amount') { if (cell.value === null || cell.value === undefined) return return ¥{Number(cell.value).toLocaleString()} } if (cell.type === 'blank_amount') { return ( setInput(key, Number(e.target.value))} placeholder="0" className="w-32 rounded border border-slate-500 bg-slate-900/70 px-2 py-0.5 text-right tabular-nums text-slate-100 outline-none focus:border-cyan-400 disabled:opacity-60" /> ) } if (cell.type === 'blank_contra') { return ( setInput(key, Number(e.target.value))} placeholder="0" className="w-24 rounded border border-slate-500 bg-slate-900/70 px-2 py-0.5 text-right tabular-nums text-slate-100 outline-none focus:border-cyan-400 disabled:opacity-60" /> {cell.answer2 !== undefined && ( <> setInput(key2, Number(e.target.value))} placeholder="純額" className="w-24 rounded border border-slate-500 bg-slate-900/70 px-2 py-0.5 text-right tabular-nums text-slate-100 outline-none focus:border-cyan-400 disabled:opacity-60" /> )} ) } return null }