journal-quest / src /components /GameScreen.tsx
MATSUMURA Taishi
Revamp to 簿記3級 第1問(仕訳)exam format
f31cb63
Raw
History Blame Contribute Delete
2.21 kB
import { useGame } from '../store/gameStore'
import { isBalanced } from '../lib/judge'
import { BalanceBar } from './BalanceBar'
import { EventCard } from './EventCard'
import { DropZone } from './DropZone'
import { CardTray } from './CardTray'
import { Result } from './Result'
export function GameScreen() {
const phase = useGame((s) => s.phase)
const submit = useGame((s) => s.submit)
const back = useGame((s) => s.backToSelect)
const debit = useGame((s) => s.placedDebit)
const credit = useGame((s) => s.placedCredit)
const canSubmit = debit.length > 0 && credit.length > 0 && isBalanced(debit, credit)
const showResult = phase === 'result'
return (
<div className="mx-auto flex min-h-screen max-w-4xl flex-col gap-4 px-4 py-5">
<div className="flex items-center justify-between">
<button
onClick={back}
className="text-sm text-slate-400 hover:text-slate-200"
>
← 論点選択
</button>
<ScoreBadge />
</div>
<BalanceBar />
<EventCard />
<div className="flex flex-col gap-4 sm:flex-row">
<DropZone side="debit" />
<DropZone side="credit" />
</div>
{showResult ? (
<Result />
) : (
<>
<CardTray />
<button
onClick={submit}
disabled={!canSubmit}
className="rounded-2xl bg-emerald-500 py-4 text-lg font-black text-slate-900 shadow-lg transition enabled:hover:bg-emerald-400 disabled:cursor-not-allowed disabled:bg-slate-700 disabled:text-slate-500"
>
{canSubmit
? '仕訳を確定する ✓'
: debit.length === 0 || credit.length === 0
? '借方・貸方の両方にカードを置こう'
: '借方合計と貸方合計を一致させよう'}
</button>
</>
)}
</div>
)
}
function ScoreBadge() {
const solved = useGame((s) => s.solved)
const correct = useGame((s) => s.correct)
if (solved === 0) return <span />
return (
<span className="rounded-full bg-slate-800 px-3 py-1 text-xs text-slate-300">
{correct} / {solved} 正解
</span>
)
}