import { useState, useEffect } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { Game, Source } from "../items"; import { apiFetch, get_is_admin } from "./api"; 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(true); const isAdmin = get_is_admin(); useEffect(() => { if (!title) return; apiFetch(`/api/game/${encodeURIComponent(title)}`) .then(async (res) => { if (!res.ok) throw new Error("Game not found"); return Game.decode(new Uint8Array(await res.arrayBuffer())); }) .then((data) => { setGame(data); setLoading(false); }) .catch((err) => { console.error(err); 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
Loading...
; if (!game) return
Game not found
; 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}
View on {game.source === Source.STEAM ? "Steam" : "Roblox"}
); }