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);