From 3ea0b8e93ea2735feacc8b7253bc0b32a5aa2bb6 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 29 Mar 2025 01:51:53 +0900 Subject: feat: show code in ranking page --- frontend/app/api/schema.d.ts | 2 ++ frontend/app/components/Gaming/CodePopover.tsx | 43 +++++++++++++++++++++++++ frontend/app/components/Gaming/RankingTable.tsx | 5 +++ frontend/app/routes/dashboard.tsx | 19 ----------- 4 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 frontend/app/components/Gaming/CodePopover.tsx (limited to 'frontend/app') diff --git a/frontend/app/api/schema.d.ts b/frontend/app/api/schema.d.ts index 6f69292..af454e8 100644 --- a/frontend/app/api/schema.d.ts +++ b/frontend/app/api/schema.d.ts @@ -211,6 +211,8 @@ export interface components { score: number; /** @example 946684800 */ submitted_at: number; + /** @example echo 'hello world'; */ + code: string | null; }; }; responses: { diff --git a/frontend/app/components/Gaming/CodePopover.tsx b/frontend/app/components/Gaming/CodePopover.tsx new file mode 100644 index 0000000..a574a77 --- /dev/null +++ b/frontend/app/components/Gaming/CodePopover.tsx @@ -0,0 +1,43 @@ +import { Popover } from "@base-ui-components/react/popover"; +import { faCode, faXmark } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { calcCodeSize } from "../../states/play"; +import BorderedContainer from "../BorderedContainer"; +import CodeBlock from "../Gaming/CodeBlock"; + +type Props = { + code: string; +}; + +export default function CodePopover({ code }: Props) { + const codeSize = calcCodeSize(code); + + return ( + + + + + + + + +
+
+ コードサイズ: {codeSize} +
+ + + +
+ +
+
+
+
+
+ ); +} diff --git a/frontend/app/components/Gaming/RankingTable.tsx b/frontend/app/components/Gaming/RankingTable.tsx index a1e41f5..38d5200 100644 --- a/frontend/app/components/Gaming/RankingTable.tsx +++ b/frontend/app/components/Gaming/RankingTable.tsx @@ -1,6 +1,7 @@ import { useAtomValue } from "jotai"; import React from "react"; import { rankingAtom } from "../../states/watch"; +import CodePopover from "./CodePopover"; function TableHeaderCell({ children }: { children: React.ReactNode }) { return ( @@ -40,6 +41,7 @@ export default function RankingTable() { プレイヤー スコア 提出時刻 + コード @@ -54,6 +56,9 @@ export default function RankingTable() { {formatUnixTimestamp(entry.submitted_at)} + + {entry.code && } + ))} diff --git a/frontend/app/routes/dashboard.tsx b/frontend/app/routes/dashboard.tsx index d0fea47..b7bfb01 100644 --- a/frontend/app/routes/dashboard.tsx +++ b/frontend/app/routes/dashboard.tsx @@ -24,8 +24,6 @@ export async function loader({ request }: LoaderFunctionArgs) { export default function Dashboard() { const { user, games } = useLoaderData()!; - const isOnlineQualifyingOpen = new Date() < new Date(2025, 2, 21, 16, 30); - return (
{user.icon_path && ( @@ -36,23 +34,6 @@ export default function Dashboard() { /> )}

{user.display_name}

- {isOnlineQualifyingOpen && ( - -

- 現在オンライン予選を開催中です。 - 予選問題2問を両方解いたプレイヤーのうち合計スコアが最も小さい2名が、3/21 - (金) の PHPerKaigi day0 に実施される決勝戦への進出枠を獲得します。 - 当日は、会場の Track A まで是非お越しください! -

-

- ※ 当日会場 Track A - にいらっしゃらない場合、次点のスコアを獲得されている方が自動的に決勝進出となります。 -

-

- ※ 決勝に参加する予定のない方でも、プレイしていただくことは可能です。 -

-
- )}
{games.length === 0 ? ( -- cgit v1.2.3-70-g09d2