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 (