'use client'; import { Suspense, useEffect, useState } from 'react'; import Link from 'next/link'; import { useSearchParams } from 'next/navigation'; import DicePlane from './diceplane'; import { DEFAULT_ASSETS, getAssets } from './asset-storage'; import { useRoom } from '@/lib/rooms/client'; import { SHOW_DEBUG_UI } from '@/lib/ui/debug'; function GamePageInner() { const searchParams = useSearchParams(); const roomId = searchParams.get('roomId'); const [backgroundSrc, setBackgroundSrc] = useState(DEFAULT_ASSETS.background); const [ready, setReady] = useState(false); const [simAmount, setSimAmount] = useState(1000); const [settingsOpen, setSettingsOpen] = useState(false); const [addDiceCount, setAddDiceCount] = useState(1); const [addDiceHint, setAddDiceHint] = useState(null); const { room, error, consumeDice, simulateDonation, addDice } = useRoom(roomId); const chzzkOn = Boolean(room?.settings.chzzkEnabled); const manualMode = Boolean(roomId) && room != null && !chzzkOn; useEffect(() => { setBackgroundSrc(getAssets().background); setReady(true); }, []); useEffect(() => { if (!settingsOpen) setAddDiceHint(null); }, [settingsOpen]); const onAddDice = async () => { if (!roomId || !chzzkOn) return; const count = Math.max(1, Math.trunc(addDiceCount) || 1); const result = await addDice(count); if (!result.ok) { setAddDiceHint(result.error || '추가 실패'); return; } setAddDiceHint(`주사위 +${count} 추가했습니다.`); }; return (
{ready && ( // eslint-disable-next-line @next/next/no-img-element )}
{SHOW_DEBUG_UI && (
{roomId && chzzkOn && (

주사위 큐: {room?.diceQueue ?? '…'}

{room?.settings.channelId && (

채널 ID: {room.settings.channelId}

)} {room && (

{room.channelName || room.settings.channelId || '—'} · {room.chatStatus} {` · ${room.settings.cheesePerDice}원/${ room.settings.multiplyByCheese ? `배수${room.settings.maxMultiplier > 0 ? `≤${room.settings.maxMultiplier}` : ''}` : '1회' }`}

)} {error &&

{error}

} {room?.chatError &&

{room.chatError}

} {room?.lastDonations?.[0] && (

최근: {room.lastDonations[0].donatorNickname}{' '} {room.lastDonations[0].payAmount}원 → +{room.lastDonations[0].diceAdded}

)}
setSimAmount(Number(e.target.value) || 1)} className="w-24 rounded border border-white/20 bg-black/50 px-2 py-1 text-white" />
)} {manualMode && (

수동 모드

치지직·채팅 연동 없음 · 주사위는 자유롭게 굴릴 수 있습니다.

{error &&

{error}

}
)}
)}
setSettingsOpen((v) => !v)} className="rounded-md bg-black/70 px-3 py-1.5 text-sm font-semibold text-white shadow-md hover:bg-black/85" > 설정 } />
{settingsOpen && (
setSettingsOpen(false)} >
e.stopPropagation()} >

설정

홈으로 {roomId && chzzkOn ? (

주사위 큐 수동 추가

현재 큐: {room?.diceQueue ?? 0}

setAddDiceCount(Number(e.target.value) || 1)} className="w-20 rounded border border-white/20 bg-black/50 px-2 py-1.5 text-sm text-white" />
{addDiceHint && (

{addDiceHint}

)}
) : (

{manualMode ? '수동 모드에서는 주사위 큐 없이 바로 굴릴 수 있습니다.' : '치지직 연동 방에 입장하면 여기서 주사위 카운트를 추가할 수 있습니다.'}

)}
)}
); } export default function GamePage() { return ( 불러오는 중…
} > ); }