refactor(routes): move shared pages to global scope

This commit is contained in:
2026-07-20 14:02:15 +08:00
parent b216b53f2e
commit 1f7ab2be04
36 changed files with 743 additions and 251 deletions
+21 -10
View File
@@ -5,8 +5,11 @@ import { signOut } from "next-auth/react";
import { BackButton } from "@/app/_components";
import { MobileShell } from "@/app/_components/core";
import { useAppNavigator } from "@/router/use-app-navigator";
import { useActiveCharacterRoutes } from "@/providers/character-provider";
import {
resolveGlobalRouteContext,
type GlobalReturnToValue,
} from "@/router/global-route-context";
import { useGlobalAppNavigator } from "@/router/use-global-app-navigator";
import { useAuthDispatch, useAuthState } from "@/stores/auth/auth-context";
import { useUserDispatch, useUserState } from "@/stores/user/user-context";
@@ -17,9 +20,13 @@ import { useSidebarUserBootstrap } from "./use-sidebar-user-bootstrap";
import styles from "./components/sidebar-screen.module.css";
export function SidebarScreen() {
const navigator = useAppNavigator();
const characterRoutes = useActiveCharacterRoutes();
export interface SidebarScreenProps {
returnTo?: GlobalReturnToValue;
}
export function SidebarScreen({ returnTo }: SidebarScreenProps) {
const navigator = useGlobalAppNavigator();
const navigation = resolveGlobalRouteContext(returnTo);
const user = useUserState();
const userDispatch = useUserDispatch();
const auth = useAuthState();
@@ -32,7 +39,7 @@ export function SidebarScreen() {
userDispatch({ type: "UserClearLocal" });
authDispatch({ type: "AuthLogoutSubmitted" });
void signOut({ redirect: false });
navigator.replace(characterRoutes.splash, { scroll: false });
navigator.replace(navigation.splashUrl, { scroll: false });
};
const view = getSidebarViewModel({
@@ -48,7 +55,7 @@ export function SidebarScreen() {
<div className={styles.topBar}>
<BackButton
href={characterRoutes.chat}
href={navigation.chatUrl}
variant="soft"
analyticsKey="sidebar.back_to_chat"
/>
@@ -60,7 +67,7 @@ export function SidebarScreen() {
name={view.name}
avatarUrl={view.avatarUrl}
isLoading={view.isInitializingUser}
onLoginClick={() => navigator.openAuth(characterRoutes.sidebar)}
onLoginClick={() => navigator.openAuth(navigation.sidebarUrl)}
/>
</section>
@@ -76,6 +83,8 @@ export function SidebarScreen() {
? () =>
navigator.openSubscription({
type: "vip",
sourceCharacterSlug: navigation.characterSlug,
returnTo: "sidebar",
analytics: {
entryPoint: "sidebar",
triggerReason: "vip_cta",
@@ -86,13 +95,15 @@ export function SidebarScreen() {
onTopUp={() =>
navigator.openSubscription({
type: "topup",
sourceCharacterSlug: navigation.characterSlug,
returnTo: "sidebar",
analytics: {
entryPoint: "sidebar",
triggerReason: "sidebar_recharge",
},
})
}
onRulesClick={() => navigator.push(characterRoutes.coinsRules)}
onRulesClick={() => navigator.push(navigation.coinsRulesUrl)}
/>
</section>
@@ -105,7 +116,7 @@ export function SidebarScreen() {
data-analytics-key="sidebar.open_feedback"
data-analytics-label="Open feedback"
className={`${styles.logoutCard} ${styles.feedbackCard}`}
onClick={() => navigator.push(characterRoutes.feedback)}
onClick={() => navigator.push(navigation.feedbackUrl)}
>
<span
className={`${styles.logoutIcon} ${styles.feedbackIcon}`}