From 1a08d06be929900fb8d8b61a1ac0611005c277e8 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 20 Mar 2025 19:41:38 +0900 Subject: feat: show submission date on ranking --- frontend/app/api/schema.d.ts | 2 + frontend/app/components/Gaming/RankingTable.tsx | 66 ++++++++++++++++++++++ .../GolfWatchAppGamingMultiplayer.tsx | 44 +-------------- 3 files changed, 70 insertions(+), 42 deletions(-) create mode 100644 frontend/app/components/Gaming/RankingTable.tsx (limited to 'frontend') diff --git a/frontend/app/api/schema.d.ts b/frontend/app/api/schema.d.ts index b5ec26b..0cace21 100644 --- a/frontend/app/api/schema.d.ts +++ b/frontend/app/api/schema.d.ts @@ -207,6 +207,8 @@ export interface components { player: components["schemas"]["User"]; /** @example 100 */ score: number; + /** @example 946684800 */ + submitted_at: number; }; }; responses: { diff --git a/frontend/app/components/Gaming/RankingTable.tsx b/frontend/app/components/Gaming/RankingTable.tsx new file mode 100644 index 0000000..e712ed9 --- /dev/null +++ b/frontend/app/components/Gaming/RankingTable.tsx @@ -0,0 +1,66 @@ +import React from "react"; +import type { components } from "../../api/schema"; + +type RankingEntry = components["schemas"]["RankingEntry"]; + +type Props = { + ranking: RankingEntry[]; +}; + +function TableHeaderCell({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} + +function TableBodyCell({ children }: { children: React.ReactNode }) { + return ( + {children} + ); +} + +function formatUnixTimestamp(timestamp: number) { + const date = new Date(timestamp * 1000); + + const year = date.getFullYear(); + const month = (date.getMonth() + 1).toString().padStart(2, "0"); + const day = date.getDate().toString().padStart(2, "0"); + const hours = date.getHours().toString().padStart(2, "0"); + const minutes = date.getMinutes().toString().padStart(2, "0"); + + return `${year}-${month}-${day} ${hours}:${minutes}`; +} + +export default function RankingTable({ ranking }: Props) { + return ( +
+ + + + 順位 + プレイヤー + スコア + 提出時刻 + + + + {ranking.map((entry, index) => ( + + {index + 1} + + {entry.player.display_name} + {entry.player.label && ` (${entry.player.label})`} + + {entry.score} + + {formatUnixTimestamp(entry.submitted_at)} + + + ))} + +
+
+ ); +} diff --git a/frontend/app/components/GolfWatchApps/GolfWatchAppGamingMultiplayer.tsx b/frontend/app/components/GolfWatchApps/GolfWatchAppGamingMultiplayer.tsx index a2b2d21..f3a377b 100644 --- a/frontend/app/components/GolfWatchApps/GolfWatchAppGamingMultiplayer.tsx +++ b/frontend/app/components/GolfWatchApps/GolfWatchAppGamingMultiplayer.tsx @@ -3,6 +3,7 @@ import type { components } from "../../api/schema"; import { gamingLeftTimeSecondsAtom } from "../../states/watch"; import LeftTime from "../Gaming/LeftTime"; import Problem from "../Gaming/Problem"; +import RankingTable from "../Gaming/RankingTable"; type RankingEntry = components["schemas"]["RankingEntry"]; @@ -41,48 +42,7 @@ export default function GolfWatchAppGamingMultiplayer({ />
順位表
-
- - - - - - - - - - {ranking.map((entry, index) => ( - - - - - - ))} - -
- 順位 - - プレイヤー - - スコア -
- {index + 1} - - {entry.player.display_name} - {entry.player.label && ` (${entry.player.label})`} - - {entry.score} -
-
+
-- cgit v1.2.3-70-g09d2