From 0ef66cdc10abdb74a2c16580e880bb289cba57e4 Mon Sep 17 00:00:00 2001 From: Maieul BOYER Date: Tue, 6 Jan 2026 16:29:04 +0100 Subject: [PATCH] feat(pong): add way to view game list --- frontend/src/pages/index.ts | 1 + .../src/pages/pongHistory/pongHistory.html | 18 ++++ frontend/src/pages/pongHistory/pongHistory.ts | 87 +++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 frontend/src/pages/pongHistory/pongHistory.html create mode 100644 frontend/src/pages/pongHistory/pongHistory.ts diff --git a/frontend/src/pages/index.ts b/frontend/src/pages/index.ts index f0b1f2b..b750328 100644 --- a/frontend/src/pages/index.ts +++ b/frontend/src/pages/index.ts @@ -7,6 +7,7 @@ import './signin/signin.ts' import './ttt/ttt.ts' import './profile/profile.ts' import './logout/logout.ts' +import './pongHistory/pongHistory.ts' // ---- Initial load ---- setTitle(""); diff --git a/frontend/src/pages/pongHistory/pongHistory.html b/frontend/src/pages/pongHistory/pongHistory.html new file mode 100644 index 0000000..2bb2251 --- /dev/null +++ b/frontend/src/pages/pongHistory/pongHistory.html @@ -0,0 +1,18 @@ +
+
+

+ Pong Match History For + +

+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/pages/pongHistory/pongHistory.ts b/frontend/src/pages/pongHistory/pongHistory.ts new file mode 100644 index 0000000..cbbf069 --- /dev/null +++ b/frontend/src/pages/pongHistory/pongHistory.ts @@ -0,0 +1,87 @@ +import { addRoute, type RouteHandlerParams, type RouteHandlerReturn } from "@app/routing"; +import page from './pongHistory.html?raw'; +import { isNullish } from "@app/utils"; +import client from "@app/api"; +import { updateUser } from "@app/auth"; + + +function getHHMM(d: Date): string { + let h = d.getHours(); + let m = d.getMinutes(); + return `${h < 9 ? '0' : ''}${h}:${m < 9 ? '0' : ''}${m}` +} + +async function pongHistory(_url: string, args: RouteHandlerParams): Promise { + if (isNullish(args.userid)) + args.userid = 'me'; + let user = await updateUser(); + if (isNullish(user)) { + return { html: ' You aren\'t logged in ' }; + } + + let userInfoRes = await client.getUser({user: args.userid}); + if (userInfoRes.kind !== 'success') + { + return { html: ' You tried to open a game history with no data :(' }; + } + let userInfo = userInfoRes.payload; + let res = await client.pongHistory({ user: args.userid }); + if (res.kind === 'failure' || res.kind === 'notLoggedIn') { + // todo: make a real page on no data + return { html: ' You tried to open a game history with no data :(' }; + } + let games = res.payload.data; + games.reverse(); + + let gameElement = games.map(g => { + let rdate = Date.parse(g.date); + if (Number.isNaN(rdate)) return undefined; + let date = new Date(rdate); + const e = document.createElement('div'); + let color = 'bg-amber-200'; + if (!g.local) { + let youwin = false; + + if (g.left.id === user.id && g.outcome === 'winL') + youwin = true; + else if (g.right.id === user.id && g.outcome === 'winR') + youwin = true; + + if (youwin) + color = 'bg-green-300'; + else + color = 'bg-red-300'; + } + e.className = + 'grid grid-cols-[1fr_auto_1fr] items-center rounded-lg px-4 py-3 ' + color; + + e.innerHTML = ` +
+
${g.left.name}
+
${g.left.score}
+
+ +
${date.toDateString()}
${getHHMM(date)}
+ +
+
${g.right.name}
+
${g.right.score}
+
`; + return e; + }).filter(v => !isNullish(v)); + + return { + html: page, postInsert: async (app) => { + if (!app) return; + const matchBox = app.querySelector("#matchList"); + if (!matchBox) return; + gameElement.forEach(c => matchBox.appendChild(c)); + const userBox = app.querySelector("#name"); + if (!userBox) return; + userBox.innerText = userInfo.name; + } + }; +} + +addRoute('/pong/games', pongHistory); +addRoute('/pong/games/:userid', pongHistory);