import { useState, useEffect } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { Game, Source } from "../items"; import { apiFetch, get_is_admin } from "./api"; import { LoadingState, EmptyState, ErrorState } from "./components/EmptyState"; interface Props { onShowToast?: (message: string, type?: "success" | "error" | "info") => void; } export function GameDetails({ onShowToast }: Props) { const { title } = useParams<{ title: string }>(); const navigate = useNavigate(); const [game, setGame] = useState(null); const [loading, setLoading] = useState(!!title); const [error, setError] = useState(title ? null : "Game title is missing"); const isAdmin = get_is_admin(); useEffect(() => { if (!title) return; (async () => { try { const res = await apiFetch(`/api/game/${encodeURIComponent(title)}`); if (!res.ok) { if (res.status === 404) { throw new Error("Game not found"); } throw new Error("Failed to load game"); } const buffer = await res.arrayBuffer(); setGame(Game.decode(new Uint8Array(buffer))); } catch (err) { console.error(err); setError(err instanceof Error ? err.message : "Failed to load game"); } finally { setLoading(false); } })(); }, [title]); const handleDelete = async () => { if ( !confirm( `Are you sure you want to delete "${game?.title}"? This action cannot be undone.` ) ) { return; } try { const res = await apiFetch(`/api/game/${encodeURIComponent(title || "")}`, { method: "DELETE", }); if (res.ok) { onShowToast?.(`"${game?.title}" deleted successfully`, "success"); navigate("/games"); } else { onShowToast?.("Failed to delete game", "error"); } } catch (err) { console.error(err); onShowToast?.("An error occurred while deleting the game", "error"); } }; if (loading) return ; if (error) return window.location.reload()} />; if (!game) return ; const getExternalLink = () => { if (game.source === Source.STEAM) { return `https://store.steampowered.com/app/${game.remoteId}`; } else if (game.source === Source.ROBLOX) { return `https://www.roblox.com/games/${game.remoteId}`; } return "#"; }; return (

{game.title}

{isAdmin && (
)}
Source:{" "} {game.source === Source.STEAM ? "Steam" : "Roblox"}
Players: {game.minPlayers} - {game.maxPlayers}
Price: ${game.price}
); }