feat(ui): screen-level history for the app-shell (Back → lobby)
Mirror the screen into browser history via SvelteKit shallow routing (pushState/replaceState with page.state) so Back/Forward move between screens while the URL stays at /game/. Overlays (game, lobby-create) push; lobby/login replace. A popstate→page.state effect syncs the store back without re-pushing (no loop); the boot stamp puts a restored overlay above the load entry so Back falls through to lobby. In-game view switches never touch history. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,31 @@
|
||||
import LobbyScreen from "$lib/screens/lobby-screen.svelte";
|
||||
import LobbyCreateScreen from "$lib/screens/lobby-create-screen.svelte";
|
||||
import GameShell from "$lib/game/game-shell.svelte";
|
||||
import { pushState } from "$app/navigation";
|
||||
import { page } from "$app/state";
|
||||
|
||||
// Screen-level browser history (Back → lobby) without changing the URL.
|
||||
// On the first authenticated render, stamp a restored overlay (game /
|
||||
// lobby-create) on top of the load entry so Back falls through to lobby.
|
||||
let historyStamped = $state(false);
|
||||
$effect(() => {
|
||||
if (session.status === "authenticated" && !historyStamped) {
|
||||
historyStamped = true;
|
||||
if (appScreen.screen === "game" && appScreen.gameId !== null) {
|
||||
pushState("", { screen: "game", gameId: appScreen.gameId });
|
||||
} else if (appScreen.screen === "lobby-create") {
|
||||
pushState("", { screen: "lobby-create" });
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Sync the store from history on Back/Forward (popstate updates
|
||||
// `page.state`). Skipped until the baseline is stamped so it never
|
||||
// clobbers the restored screen on first render.
|
||||
$effect(() => {
|
||||
if (!historyStamped) return;
|
||||
appScreen.syncFromHistory(page.state.screen, page.state.gameId ?? null);
|
||||
});
|
||||
</script>
|
||||
|
||||
{#if session.status === "authenticated"}
|
||||
|
||||
Reference in New Issue
Block a user