diff --git a/app/[locale]/u/[username]/page.tsx b/app/[locale]/u/[username]/page.tsx index 38934ea..06c86ac 100644 --- a/app/[locale]/u/[username]/page.tsx +++ b/app/[locale]/u/[username]/page.tsx @@ -242,6 +242,29 @@ function sleep(ms: number): Promise { return new Promise((r) => setTimeout(r, ms)); } +type LeaderboardRow = { + id: string; + name: string; + points?: number; + commits?: number; + avatarUrl?: string; + contributedDocs?: Array<{ id: string; title: string; url: string }>; + dailyCounts?: Record; +}; +// 先经 unknown 再转 Row[]:JSON 的字面量类型(每条 dailyCounts 都是独立的 literal)和 Row 的 +// Record 索引签名不兼容,tsc --noEmit 会报 TS2352。先走 unknown 绕开。 +const leaderboardRows = leaderboard as unknown as LeaderboardRow[]; + +/** + * 兜底页用:URL 里的 identifier("150361711" 或 "github_150361711") + * → leaderboard 行。只有纯数字 githubId 才可能命中。 + */ +function findLeaderboardRow(identifier: string): LeaderboardRow | undefined { + const gid = identifier.replace(/^github_/, ""); + if (!/^\d+$/.test(gid)) return undefined; + return leaderboardRows.find((r) => r.id === gid); +} + /** * 从 leaderboard JSON 按 githubId 匹配贡献记录。 * 之前按 name 字符串匹配会踩坑(leaderboard.name = "longsizhuo",user_accounts.username = "github_114939201"), @@ -250,20 +273,8 @@ function sleep(ms: number): Promise { function findContributions(githubId: number | null | undefined) { if (githubId == null) return { docs: [], points: 0, commits: 0, dailyCounts: {} }; - type Row = { - id: string; - name: string; - points?: number; - commits?: number; - avatarUrl?: string; - contributedDocs?: Array<{ id: string; title: string; url: string }>; - dailyCounts?: Record; - }; - // 先经 unknown 再转 Row[]:JSON 的字面量类型(每条 dailyCounts 都是独立的 literal)和 Row 的 - // Record 索引签名不兼容,tsc --noEmit 会报 TS2352。先走 unknown 绕开。 - const rows = leaderboard as unknown as Row[]; const idStr = String(githubId); - const match = rows.find((r) => r.id === idStr); + const match = leaderboardRows.find((r) => r.id === idStr); if (!match) return { docs: [], points: 0, commits: 0, dailyCounts: {} }; return { docs: match.contributedDocs ?? [], @@ -273,6 +284,95 @@ function findContributions(githubId: number | null | undefined) { }; } +/** + * 未注册贡献者的兜底页:git 有贡献但没登录过本站的人,点进 /u/{id} + * 以前会掉进通用 404,现在展示仓库贡献统计 + GitHub 外链 + 登录认领 CTA。 + * 数据全部来自 build-time 的 leaderboard JSON,不打后端。 + */ +async function UnregisteredContributor({ row }: { row: LeaderboardRow }) { + const t = await getTranslations("profile"); + const docs = row.contributedDocs ?? []; + return ( + <> +
+
+
+
+
+ {t("dossier")} +
+

+ {row.name} +

+
+ +
+ {row.avatarUrl && ( +
+ {row.name} +
+ )} +
+

{t("unregistered.note")}

+
+ + {row.points ?? 0} {t("stats.points")} + + + {row.commits ?? 0} {t("stats.commits")} + +
+
+ + GITHUB → + + + {t("unregistered.cta")} + +
+
+
+ + {docs.length > 0 && ( +
+

+ {t("docs.heading")} +

+
    + {docs.map((doc) => ( +
  • + + {doc.title} + +
  • + ))} +
+
+ )} +
+
+