'use client' import { useEffect, useState } from 'react' import { Terminal, type TerminalLine } from '@/components/ui/terminal' import type { EventDto } from '@/lib/game/events' // EVENT LOG tab — live data. Fetches /api/events on mount (Radix Tabs unmounts inactive tabs, so it // refetches whenever the tab is opened). One terminal line per event: T // , newest first. export function EventLogPanel() { const [lines, setLines] = useState(null) const [error, setError] = useState(null) useEffect(() => { let cancelled = false fetch('/api/events') .then(async (res) => { if (!res.ok) throw new Error(`HTTP ${res.status}`) return (await res.json()) as EventDto[] }) .then((events) => { if (!cancelled) { setLines( events.map((e) => ({ type: e.type === 'new_game' ? 'system' : 'output', text: `T${e.turn} // ${e.message.toUpperCase()}`, timestamp: new Date(e.createdAt).toLocaleTimeString('en-GB', { hour12: false }), })) ) } }) .catch((err: unknown) => { if (!cancelled) setError(err instanceof Error ? err.message : String(err)) }) return () => { cancelled = true } }, []) if (error) { return (
{error.toUpperCase()}
) } if (!lines) { return (
LOADING EVENT LOG…
) } return ( ) }