From 1f7ab2be04c156c33e0699ac08c29093568508e9 Mon Sep 17 00:00:00 2001 From: chenhang Date: Mon, 20 Jul 2026 14:02:15 +0800 Subject: [PATCH] refactor(routes): move shared pages to global scope --- next.config.ts | 5 + .../[characterSlug]/coins-rules/page.tsx | 5 - .../[characterSlug]/feedback/page.tsx | 5 - .../[characterSlug]/sidebar/page.tsx | 5 - src/app/chat/components/chat-header.tsx | 8 +- .../__tests__/coins-rules-screen.test.tsx | 35 +++++ src/app/coins-rules/coins-rules-screen.tsx | 15 +- src/app/coins-rules/page.tsx | 17 +-- .../__tests__/feedback-screen.test.tsx | 20 ++- src/app/feedback/feedback-screen.tsx | 29 ++-- src/app/feedback/page.tsx | 17 +-- .../sidebar/__tests__/sidebar-screen.test.tsx | 122 +++++++++++++++ src/app/sidebar/page.tsx | 17 +-- src/app/sidebar/sidebar-screen.tsx | 31 ++-- .../__tests__/subscription-page.test.tsx | 47 ++++++ .../subscription-checkout-button.tsx | 6 +- src/app/subscription/page.tsx | 4 +- src/app/subscription/subscription-screen.tsx | 8 +- .../use-subscription-payment-flow.ts | 11 +- .../payment/pending_payment_order_storage.ts | 2 +- .../__tests__/subscription_exit.test.ts | 28 +++- src/lib/navigation/subscription_exit.ts | 14 +- .../__tests__/payment_search_params.test.ts | 1 + .../__tests__/pending_payment_order.test.ts | 34 +++++ src/lib/payment/payment_search_params.ts | 8 +- .../__tests__/global-route-context.test.ts | 59 ++++++++ .../legacy-global-route-redirects.test.ts | 26 ++++ .../__tests__/navigation-resolver.test.ts | 3 +- src/router/__tests__/route-meta.test.ts | 17 ++- src/router/global-route-context.ts | 76 ++++++++++ src/router/legacy-global-route-redirects.ts | 24 +++ src/router/navigation-types.ts | 6 +- src/router/route-meta.ts | 9 +- src/router/routes.ts | 12 +- src/router/use-app-navigator.ts | 142 +++--------------- src/router/use-global-app-navigator.ts | 126 ++++++++++++++++ 36 files changed, 743 insertions(+), 251 deletions(-) delete mode 100644 src/app/characters/[characterSlug]/coins-rules/page.tsx delete mode 100644 src/app/characters/[characterSlug]/feedback/page.tsx delete mode 100644 src/app/characters/[characterSlug]/sidebar/page.tsx create mode 100644 src/app/coins-rules/__tests__/coins-rules-screen.test.tsx create mode 100644 src/app/sidebar/__tests__/sidebar-screen.test.tsx create mode 100644 src/app/subscription/__tests__/subscription-page.test.tsx create mode 100644 src/router/__tests__/global-route-context.test.ts create mode 100644 src/router/__tests__/legacy-global-route-redirects.test.ts create mode 100644 src/router/global-route-context.ts create mode 100644 src/router/legacy-global-route-redirects.ts create mode 100644 src/router/use-global-app-navigator.ts diff --git a/next.config.ts b/next.config.ts index e5843e61..395266db 100644 --- a/next.config.ts +++ b/next.config.ts @@ -2,9 +2,14 @@ import { withSentryConfig } from "@sentry/nextjs"; import type { NextConfig } from "next"; import { withSerwist } from "@serwist/turbopack"; +import { LEGACY_GLOBAL_ROUTE_REDIRECTS } from "./src/router/legacy-global-route-redirects"; + const nextConfig: NextConfig = { // Docker runs the traced runtime emitted to `.next/standalone`. output: "standalone", + async redirects() { + return [...LEGACY_GLOBAL_ROUTE_REDIRECTS]; + }, images: { remotePatterns: [ { diff --git a/src/app/characters/[characterSlug]/coins-rules/page.tsx b/src/app/characters/[characterSlug]/coins-rules/page.tsx deleted file mode 100644 index 706551ab..00000000 --- a/src/app/characters/[characterSlug]/coins-rules/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { CoinsRulesScreen } from "@/app/coins-rules/coins-rules-screen"; - -export default function CharacterCoinsRulesPage() { - return ; -} diff --git a/src/app/characters/[characterSlug]/feedback/page.tsx b/src/app/characters/[characterSlug]/feedback/page.tsx deleted file mode 100644 index 19dcb5ad..00000000 --- a/src/app/characters/[characterSlug]/feedback/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { FeedbackScreen } from "@/app/feedback/feedback-screen"; - -export default function CharacterFeedbackPage() { - return ; -} diff --git a/src/app/characters/[characterSlug]/sidebar/page.tsx b/src/app/characters/[characterSlug]/sidebar/page.tsx deleted file mode 100644 index 3562a110..00000000 --- a/src/app/characters/[characterSlug]/sidebar/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { SidebarScreen } from "@/app/sidebar/sidebar-screen"; - -export default function CharacterSidebarPage() { - return ; -} diff --git a/src/app/chat/components/chat-header.tsx b/src/app/chat/components/chat-header.tsx index 7663cae6..b149bfd9 100644 --- a/src/app/chat/components/chat-header.tsx +++ b/src/app/chat/components/chat-header.tsx @@ -10,6 +10,8 @@ import { Lock, Menu } from "lucide-react"; import { BackButton } from "@/app/_components"; import { useActiveCharacterRoutes } from "@/providers/character-provider"; +import { buildGlobalPageUrl } from "@/router/global-route-context"; +import { ROUTES } from "@/router/routes"; import { useAppNavigator } from "@/router/use-app-navigator"; import { BrowserHintOverlay } from "./browser-hint-overlay"; @@ -75,7 +77,11 @@ export function ChatHeader({ data-analytics-key="chat.open_menu" data-analytics-label="Open chat menu" className="flex size-(--responsive-icon-button-size,42px) cursor-pointer items-center justify-center rounded-full border border-[rgba(255,255,255,0.12)] bg-[rgba(13,11,20,0.7)] text-(--color-text-primary,#fff) shadow-[0_10px_24px_rgba(0,0,0,0.2)] backdrop-blur-md transition-[background,transform] duration-150 hover:bg-[rgba(28,24,39,0.82)] active:scale-96 focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-[#f657a0]" - onClick={() => navigator.push(characterRoutes.sidebar)} + onClick={() => + navigator.push( + buildGlobalPageUrl(ROUTES.sidebar, characterRoutes.chat), + ) + } aria-label="Menu" >