import { useState, useEffect } from "react"; import { Game, Source, GameList as GameListProto } from "../items"; import { apiFetch } from "./api"; export function GameList() { const [games, setGames] = useState([]); const [title, setTitle] = useState(""); const [source, setSource] = useState(Source.STEAM); const [multiplayer, setMultiplayer] = useState(false); const [minPlayers, setMinPlayers] = useState(1); const [maxPlayers, setMaxPlayers] = useState(1); const [price, setPrice] = useState(0); const [remoteId, setRemoteId] = useState(0); const [message, setMessage] = useState(""); const fetchGames = () => { apiFetch("/api/games") .then((res) => res.arrayBuffer()) .then((buffer) => { try { const list = GameListProto.decode(new Uint8Array(buffer)); setGames(list.games); } catch (e) { console.error("Failed to decode games:", e); } }) .catch(console.error); }; useEffect(() => { fetchGames(); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const game = { title, source, multiplayer, minPlayers, maxPlayers, price, remoteId, }; try { const encoded = Game.encode(game).finish(); const res = await apiFetch("/api/game", { method: "POST", headers: { "Content-Type": "application/octet-stream", }, body: encoded, }); if (res.ok) { setMessage("Game added successfully!"); setTitle(""); fetchGames(); // Reset other fields if needed } else { setMessage("Failed to add game."); } } catch (err) { console.error(err); setMessage("Error adding game."); } }; return (

Add New Game

{message &&

{message}

}

Existing Games

    {games.map((game) => (
  • {game.title} ({game.source === Source.STEAM ? "Steam" : "Roblox"})
  • ))}
); }