Files
HokmPlay/src/app/page.tsx
T
soroush.asadi 38691154c8 Add Capacitor Android packaging (APK) for Cafe Bazaar / Myket
- Next static export (output: export) wrapped by Capacitor; appId
  com.bargevasat.app, appName «برگ وسط»
- android/ native project + @capacitor/app; hardware back handled by
  CapacitorBack (back a screen, exit at home)
- npm scripts (cap:sync, android:open, android:apk), ANDROID.md
- Gradle Maven-mirror init-script template (dl.google.com/Maven Central are
  blocked in Iran — same reason NuGet is mirrored)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 14:31:14 +03:30

91 lines
2.9 KiB
TypeScript

"use client";
import { useEffect } from "react";
import { HomeScreen } from "@/components/HomeScreen";
import { GameScreen } from "@/components/screens/GameScreen";
import { ProfileScreen } from "@/components/screens/ProfileScreen";
import { FriendsScreen } from "@/components/screens/FriendsScreen";
import { OnlineLobbyScreen } from "@/components/screens/OnlineLobbyScreen";
import { RoomScreen } from "@/components/screens/RoomScreen";
import { MatchmakingScreen } from "@/components/screens/MatchmakingScreen";
import { LeaderboardScreen } from "@/components/screens/LeaderboardScreen";
import { ShopScreen } from "@/components/screens/ShopScreen";
import { ChatScreen } from "@/components/screens/ChatScreen";
import { AuthScreen } from "@/components/screens/AuthScreen";
import { DailyRewardModal } from "@/components/online/DailyRewardModal";
import { CapacitorBack } from "@/components/CapacitorBack";
import { useSessionStore } from "@/lib/session-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);
const init = useSessionStore((s) => s.init);
const loading = useSessionStore((s) => s.loading);
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 (
<>
{renderScreen(screen)}
<DailyRewardModal />
<CapacitorBack />
{loading && null}
</>
);
}
function renderScreen(screen: string) {
switch (screen) {
case "game":
return <GameScreen />;
case "auth":
return <AuthScreen />;
case "profile":
return <ProfileScreen />;
case "friends":
return <FriendsScreen />;
case "online":
return <OnlineLobbyScreen />;
case "room":
return <RoomScreen />;
case "matchmaking":
return <MatchmakingScreen />;
case "leaderboard":
return <LeaderboardScreen />;
case "shop":
return <ShopScreen />;
case "chat":
return <ChatScreen />;
default:
return <HomeScreen />;
}
}