import { useState, useEffect } from 'react'; import { useGameStore } from '@/store'; import { MainLayout } from '@/components/layout/MainLayout'; import { NewGameScreen } from '@/components/game/NewGameScreen'; import { OfflineCatchUp } from '@/components/game/OfflineCatchUp'; import { InviteGateScreen } from '@/components/game/InviteGateScreen'; import { useGameLoop } from '@/hooks/useGameLoop'; import { useAuthGate } from '@/hooks/useAuthGate'; import { TICK_INTERVAL_MS } from '@ai-tycoon/shared'; import { Sparkles } from 'lucide-react'; function LoadingScreen() { return (

AI Tycoon

Loading...

); } export function App() { const { loading: authLoading, needsInvite, needsPasswordReset, setRegistered, setNeedsPasswordReset } = useAuthGate(); const companyName = useGameStore((s) => s.meta.companyName); const lastTickTimestamp = useGameStore((s) => s.meta.lastTickTimestamp); const [catchUpTicks, setCatchUpTicks] = useState(null); const [catchUpDone, setCatchUpDone] = useState(false); useEffect(() => { if (!companyName || catchUpDone) return; const elapsed = Date.now() - lastTickTimestamp; const missed = Math.floor(elapsed / TICK_INTERVAL_MS); if (missed > 10) { setCatchUpTicks(missed); } else { setCatchUpDone(true); } }, [companyName, lastTickTimestamp, catchUpDone]); useGameLoop(!catchUpDone || authLoading || needsInvite || needsPasswordReset); if (authLoading) { return ; } if (needsInvite || needsPasswordReset) { return ( { setRegistered(true); setNeedsPasswordReset(false); }} /> ); } if (!companyName) { return ; } if (catchUpTicks !== null && !catchUpDone) { return ( setCatchUpDone(true)} /> ); } return ; }