diff --git a/src/app/page.tsx b/src/app/page.tsx index e7e9be0..75df668 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -14,7 +14,25 @@ import { ChatScreen } from "@/components/screens/ChatScreen"; import { AuthScreen } from "@/components/screens/AuthScreen"; import { DailyRewardModal } from "@/components/online/DailyRewardModal"; import { useSessionStore } from "@/lib/session-store"; -import { useUIStore } from "@/lib/ui-store"; +import { useGameStore } from "@/lib/game-store"; +import { useOnlineStore } from "@/lib/online-store"; +import { screenFromHash, useUIStore, type Screen } from "@/lib/ui-store"; + +/** Transient screens can't be restored without their state — fall back to home. */ +function resolveScreen(s: Screen): Screen { + switch (s) { + case "game": + return useGameStore.getState().started ? s : "home"; + case "room": + return useOnlineStore.getState().room ? s : "home"; + case "chat": + return useOnlineStore.getState().activeChatFriend ? s : "home"; + case "matchmaking": + return useOnlineStore.getState().matchmaking.phase !== "idle" ? s : "home"; + default: + return s; + } +} export default function Page() { const screen = useUIStore((s) => s.screen); @@ -23,6 +41,14 @@ export default function Page() { useEffect(() => { init(); + useUIStore.getState().initHistory(); + + const onPop = (e: PopStateEvent) => { + const raw = ((e.state?.screen as Screen) ?? screenFromHash()); + useUIStore.getState().syncFromPop(resolveScreen(raw)); + }; + window.addEventListener("popstate", onPop); + return () => window.removeEventListener("popstate", onPop); }, [init]); return ( diff --git a/src/components/online/ScreenHeader.tsx b/src/components/online/ScreenHeader.tsx index ca1d906..5c8c48f 100644 --- a/src/components/online/ScreenHeader.tsx +++ b/src/components/online/ScreenHeader.tsx @@ -13,13 +13,13 @@ export function ScreenHeader({ back?: Screen; right?: React.ReactNode; }) { - const go = useUIStore((s) => s.go); + const navBack = useUIStore((s) => s.back); const { locale } = useI18n(); const Chevron = locale === "fa" ? ChevronRight : ChevronLeft; return (