aboutsummaryrefslogtreecommitdiffhomepage
path: root/frontend/app/routes/admin.games_.$gameId.tsx
blob: 34860abda91b61a4804a3eec47cec4e105a866fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import type {
	ActionFunctionArgs,
	LoaderFunctionArgs,
	MetaFunction,
} from "@remix-run/node";
import { Form, useLoaderData } from "@remix-run/react";
import { adminApiGetGame, adminApiPutGame } from "../.server/api/client";
import { isAuthenticated } from "../.server/auth";

export const meta: MetaFunction<typeof loader> = ({ 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 { user, token } = await isAuthenticated(request, {
		failureRedirect: "/login",
	});
	if (!user.is_admin) {
		throw new Error("Unauthorized");
	}
	const { gameId } = params;
	const { game } = await adminApiGetGame(token, Number(gameId));
	return { game };
}

export async function action({ request, params }: ActionFunctionArgs) {
	const { user, token } = await isAuthenticated(request, {
		failureRedirect: "/login",
	});
	if (!user.is_admin) {
		throw new Error("Unauthorized");
	}
	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<typeof loader>()!;

	return (
		<div>
			<div>
				<h1>[Admin] Game Edit {game.display_name}</h1>
				<ul>
					<li>ID: {game.game_id}</li>
					<li>State: {game.state}</li>
					<li>Display Name: {game.display_name}</li>
					<li>Duration Seconds: {game.duration_seconds}</li>
					<li>
						Started At:{" "}
						{game.started_at
							? new Date(game.started_at * 1000).toString()
							: "-"}
					</li>
					<li>Problem ID: {game.problem ? game.problem.problem_id : "-"}</li>
				</ul>
				<div>
					<Form method="post">
						<div>
							<button
								type="submit"
								name="action"
								value="open"
								disabled={game.state !== "closed"}
							>
								Open
							</button>
						</div>
						<div>
							<button
								type="submit"
								name="action"
								value="start"
								disabled={game.state !== "waiting_start"}
							>
								Start
							</button>
						</div>
					</Form>
				</div>
			</div>
		</div>
	);
}