From 2d2e9d17edfe08fdfd7ecab440596f21fc664f3a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?cls=5F=E5=AE=81=E6=B3=A2=E6=9C=AC=E6=9C=BA?=
<908705107@qq.com>
Date: Thu, 13 Aug 2026 18:52:52 +0800
Subject: [PATCH] Sync Buzz Web membership error fix
Signed-off-by: cls_???? <908705107@qq.com>
---
web/src/features/repos/ui/ReposPage.tsx | 14 ++++++++++++--
web/tests/e2e/smoke.spec.ts | 23 +++++++++++++++++++++++
2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/web/src/features/repos/ui/ReposPage.tsx b/web/src/features/repos/ui/ReposPage.tsx
index 8b77383..e492bed 100644
--- a/web/src/features/repos/ui/ReposPage.tsx
+++ b/web/src/features/repos/ui/ReposPage.tsx
@@ -13,6 +13,17 @@ import { RepoListItem } from "./RepoListItem";
type SortOrder = "newest" | "oldest" | "name";
+function isRelayAuthenticationError(error: unknown): boolean {
+ if (!(error instanceof Error)) return false;
+
+ const message = error.message.toLowerCase();
+ return (
+ message.startsWith("auth-required") ||
+ message.includes("not a relay member") ||
+ message.includes("membership required")
+ );
+}
+
function ListItemSkeleton() {
return (
@@ -102,8 +113,7 @@ export function ReposPage() {
const isLoading = preview ? false : isLoadingRepos;
const [search, setSearch] = useState("");
const [sort, setSort] = useState("newest");
- const authRequired =
- error instanceof Error && error.message.startsWith("auth-required");
+ const authRequired = isRelayAuthenticationError(error);
useEffect(() => {
if (error && !authRequired) {
diff --git a/web/tests/e2e/smoke.spec.ts b/web/tests/e2e/smoke.spec.ts
index 0ad9460..316434e 100644
--- a/web/tests/e2e/smoke.spec.ts
+++ b/web/tests/e2e/smoke.spec.ts
@@ -13,6 +13,29 @@ test("home page shows repositories section", async ({ page }) => {
await expect(page.getByText("代码仓库")).toBeVisible();
});
+test("shows member authentication instead of an empty community", async ({
+ page,
+}) => {
+ await page.routeWebSocket(/\/buzz\/?$/, (webSocket) => {
+ webSocket.onMessage((message) => {
+ const request = JSON.parse(String(message)) as unknown[];
+ if (request[0] === "REQ" && typeof request[1] === "string") {
+ webSocket.send(
+ JSON.stringify([
+ "CLOSED",
+ request[1],
+ "restricted: not a relay member",
+ ]),
+ );
+ }
+ });
+ });
+
+ await page.goto("./");
+ await expect(page.getByText("登录后才能查看代码仓库")).toBeVisible();
+ await expect(page.getByText("这个社区还是空的")).not.toBeVisible();
+});
+
test("defaults to Simplified Chinese and persists the selected locale", async ({
page,
}) => {