import { useEffect, useState } from 'react'; import { AnimatePresence, motion } from 'motion/react'; import { CheckCircle2, XCircle } from 'lucide-react'; import { api, type Grade, type UserProfile } from '@/api'; import { AppDataProvider, useAppData } from '@/state/AppData'; import { NavigatorProvider, useNav } from '@/nav/Navigator'; import { isTab, type Route } from '@/nav/routes'; import { BottomNav } from '@/components/BottomNav'; import { Sheet } from '@/components/Sheet'; import { useToast } from '@/components/Toast'; import { PrimaryButton } from '@/components/ui'; import { AskScreen } from '@/screens/AskScreen'; import { CharactersScreen } from '@/screens/CharactersScreen'; import { FamilyScreen } from '@/screens/FamilyScreen'; import { HomeScreen } from '@/screens/HomeScreen'; import { InviteScreen } from '@/screens/InviteScreen'; import { LeaderboardScreen } from '@/screens/LeaderboardScreen'; import { LessonScreen } from '@/screens/LessonScreen'; import { LoginScreen } from '@/screens/LoginScreen'; import { MapScreen } from '@/screens/MapScreen'; import { NotificationsScreen } from '@/screens/NotificationsScreen'; import { ProfileScreen } from '@/screens/ProfileScreen'; import { QuizScreen } from '@/screens/QuizScreen'; import { StreakScreen } from '@/screens/StreakScreen'; import { SubscriptionScreen } from '@/screens/SubscriptionScreen'; import { SupportScreen } from '@/screens/SupportScreen'; import { UnitScreen } from '@/screens/UnitScreen'; import type { PaymentReturn } from './launchParams'; interface Props { profile: UserProfile; grades: Grade[]; payment: PaymentReturn | null; /** صفحه‌ی شروع؛ برای والد بخشِ والدین است. */ start?: Route; onSignedOut: () => void; onRegistered: (profile: UserProfile) => Promise; } /** اپِ اصلی بعد از ورود: تب‌ها، صفحه‌ها و داده‌ی مشترک. */ export function MainApp({ profile, grades, payment, start, onSignedOut, onRegistered }: Props) { return ( {payment && } ); } function Screens({ onSignedOut, onRegistered }: Pick) { const nav = useNav(); const { route } = nav; const showNav = isTab(route.name) && nav.tab === route.name; return ( <>
{showNav && } ); } function RouteView({ route, onSignedOut, onRegistered }: { route: Route } & Pick) { switch (route.name) { case 'home': return ; case 'map': return ; case 'ask': return ; case 'subscription': return ; case 'profile': return ; case 'unit': return ; case 'lesson': return ; case 'quiz': return ; case 'notifications': return ; case 'leaderboard': return ; case 'characters': return ; case 'streak': return ; case 'support': return ; case 'family': return ; case 'invite': return ; case 'register': return ; } } /** مهمانی که شماره ثبت می‌کند؛ همان کاربر می‌ماند و فقط پروفایل تازه می‌شود. */ function RegisterView({ onRegistered }: Pick) { const nav = useNav(); const { setProfile } = useAppData(); const toast = useToast(); return ( { try { const profile = await api.profile.get(); setProfile(profile); await onRegistered(profile); } catch { /* ورود انجام شده؛ پروفایل با بازگشت به اپ تازه می‌شود */ } toast('شماره‌ت ثبت شد! پیشرفتت امنه.', 'success'); nav.back(); }} /> ); } /** نتیجه‌ی برگشت از درگاه؛ وضعیتِ سفارش از خودِ سرور هم دوباره خوانده می‌شود. */ function PaymentResult({ payment }: { payment: PaymentReturn }) { const { refreshSummary } = useAppData(); const [open, setOpen] = useState(true); const [paid, setPaid] = useState(payment.status === 'paid'); useEffect(() => { api.subscription .order(payment.orderId) .then((order) => setPaid(order.status === 'paid')) .catch(() => {}); void refreshSummary(); }, [payment.orderId, refreshSummary]); return ( setOpen(false)}>
{paid ? : }

{paid ? 'پرداخت موفق بود! 🎉' : 'پرداخت انجام نشد'}

{paid ? 'اشتراکت فعال شد؛ از الان قلب‌هات نامحدوده.' : 'اگه مبلغی از حسابت کم شده، نگران نباش؛ طیِ چند ساعت خودکار برمی‌گرده یا اشتراکت فعال می‌شه.'}

setOpen(false)}>باشه
); }