import type { ActionFunctionArgs, LoaderFunctionArgs, MetaFunction, } from "@remix-run/node"; import { Form, useLoaderData } from "@remix-run/react"; import { adminApiGetGame, adminApiPutGame } from "../.server/api/client"; import { ensureAdminUserLoggedIn } from "../.server/auth"; export const meta: MetaFunction = ({ data }) => { return [ { title: data ? `[Admin] Game Edit ${data.game.display_name} | iOSDC Japan 2024 Albatross.swift` : "[Admin] Game Edit | iOSDC Japan 2024 Albatross.swift", }, ]; }; export async function loader({ request, params }: LoaderFunctionArgs) { const { token } = await ensureAdminUserLoggedIn(request); const { gameId } = params; const { game } = await adminApiGetGame(token, Number(gameId)); return { game }; } export async function action({ request, params }: ActionFunctionArgs) { const { token } = await ensureAdminUserLoggedIn(request); const { gameId } = params; const formData = await request.formData(); const action = formData.get("action"); const nextState = action === "open" ? "waiting_entries" : action === "start" ? "prepare" : null; if (!nextState) { throw new Error("Invalid action"); } await adminApiPutGame(token, Number(gameId), { state: nextState, }); return null; } export default function AdminGameEdit() { const { game } = useLoaderData()!; return (

[Admin] Game Edit {game.display_name}

  • ID: {game.game_id}
  • State: {game.state}
  • Display Name: {game.display_name}
  • Duration Seconds: {game.duration_seconds}
  • Started At:{" "} {game.started_at ? new Date(game.started_at * 1000).toString() : "-"}
  • Problem ID: {game.problem ? game.problem.problem_id : "-"}
); }