refactor(game status): transient vs synced state now defined

This commit is contained in:
DecDuck
2024-12-23 20:44:02 +11:00
parent 64ebc191bf
commit 42c0198f1d
14 changed files with 220 additions and 145 deletions

View File

@ -1,14 +1,36 @@
import { invoke } from "@tauri-apps/api/core";
import { listen } from "@tauri-apps/api/event";
import type { Game, GameStatus } from "~/types";
import type { Game, GameStatus, GameStatusEnum } from "~/types";
const gameRegistry: { [key: string]: Game } = {};
const gameStatusRegistry: { [key: string]: Ref<GameStatus> } = {};
type OptionGameStatus = { [key in GameStatusEnum]: { version_name?: string } };
export type SerializedGameStatus = [
{ type: GameStatusEnum },
OptionGameStatus | null
];
const parseStatus = (status: SerializedGameStatus): GameStatus => {
if (status[0]) {
return {
type: status[0].type,
};
} else if (status[1]) {
const [[gameStatus, options]] = Object.entries(status[1]);
return {
type: gameStatus as GameStatusEnum,
...options,
};
} else {
throw new Error("No game status");
}
};
export const useGame = async (id: string) => {
if (!gameRegistry[id]) {
const data: { game: Game; status: GameStatus } = await invoke(
const data: { game: Game; status: SerializedGameStatus } = await invoke(
"fetch_game",
{
id,
@ -16,11 +38,13 @@ export const useGame = async (id: string) => {
);
gameRegistry[id] = data.game;
if (!gameStatusRegistry[id]) {
gameStatusRegistry[id] = ref(data.status);
gameStatusRegistry[id] = ref(parseStatus(data.status));
listen(`update_game/${id}`, (event) => {
const payload: { status: GameStatus } = event.payload as any;
gameStatusRegistry[id].value = payload.status;
const payload: {
status: SerializedGameStatus;
} = event.payload as any;
gameStatusRegistry[id].value = parseStatus(payload.status);
});
}
}