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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
import createClient from "openapi-fetch";
import { createContext } from "react";
import { API_BASE_PATH } from "../config";
import type { paths } from "./schema";
const apiOrigin =
import.meta.env.VITE_API_BASE_URL ??
(import.meta.env.DEV ? "http://localhost:8004" : "");
const client = createClient<paths>({
baseUrl: `${apiOrigin}${API_BASE_PATH}`,
credentials: "include",
});
export async function apiLogin(username: string, password: string) {
const { data, error } = await client.POST("/login", {
body: {
username,
password,
},
});
if (error) throw new Error(error.message);
return data;
}
export async function apiLogout() {
const { error } = await client.POST("/logout");
if (error) throw new Error(error.message);
}
export async function apiGetMe() {
const { data, error } = await client.GET("/me");
if (error) return null;
return data;
}
class AuthenticatedApiClient {
async getGames() {
const { data, error } = await client.GET("/games");
if (error) throw new Error(error.message);
return data;
}
async getGame(gameId: number) {
const { data, error } = await client.GET("/games/{game_id}", {
params: {
path: { game_id: gameId },
},
});
if (error) throw new Error(error.message);
return data;
}
async getGamePlayLatestState(gameId: number) {
const { data, error } = await client.GET(
"/games/{game_id}/play/latest_state",
{
params: {
path: { game_id: gameId },
},
},
);
if (error) throw new Error(error.message);
return data;
}
async postGamePlayCode(gameId: number, code: string) {
const { error } = await client.POST("/games/{game_id}/play/code", {
params: {
path: { game_id: gameId },
},
body: { code },
});
if (error) throw new Error(error.message);
}
async postGamePlaySubmit(gameId: number, code: string) {
const { data, error } = await client.POST("/games/{game_id}/play/submit", {
params: {
path: { game_id: gameId },
},
body: { code },
});
if (error) throw new Error(error.message);
return data;
}
async getGameWatchRanking(gameId: number) {
const { data, error } = await client.GET("/games/{game_id}/watch/ranking", {
params: {
path: { game_id: gameId },
},
});
if (error) throw new Error(error.message);
return data;
}
async getGameWatchLatestStates(gameId: number) {
const { data, error } = await client.GET(
"/games/{game_id}/watch/latest_states",
{
params: {
path: { game_id: gameId },
},
},
);
if (error) throw new Error(error.message);
return data;
}
async getTournament(tournamentId: number) {
const { data, error } = await client.GET("/tournaments/{tournament_id}", {
params: {
path: { tournament_id: tournamentId },
},
});
if (error) throw new Error(error.message);
return data;
}
}
const apiClient = new AuthenticatedApiClient();
export function createApiClient() {
return apiClient;
}
export const ApiClientContext = createContext<AuthenticatedApiClient | null>(
null,
);
|