import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; import 'core/network/api_client.dart'; import 'core/network/ws_client.dart'; import 'core/storage/token_storage.dart'; import 'core/theme/app_theme.dart'; import 'features/auth/auth_cubit.dart'; import 'features/auth/auth_repository.dart'; import 'features/auth/mobile_screen.dart'; import 'features/auth/otp_screen.dart'; import 'features/auth/profile_setup_screen.dart'; import 'features/game/game_cubit.dart'; import 'features/game/game_repository.dart'; import 'features/game/game_screen.dart'; import 'features/game/tier_list_screen.dart'; import 'features/lobby/lobby_screen.dart'; import 'features/lobby/wallet_cubit.dart'; import 'features/private/private_entry_screen.dart'; import 'features/private/private_table_screen.dart'; import 'features/profile/profile_screen.dart'; import 'features/shop/shop_cubit.dart'; import 'features/shop/shop_repository.dart'; import 'features/shop/shop_screen.dart'; import 'features/shop/vip_screen.dart'; class HakemApp extends StatelessWidget { final ApiClient api; final AuthRepository authRepo; final TokenStorage tokenStorage; final bool loggedIn; const HakemApp({ super.key, required this.api, required this.authRepo, required this.tokenStorage, required this.loggedIn, }); @override Widget build(BuildContext context) { final router = GoRouter( initialLocation: loggedIn ? '/lobby' : '/login', routes: [ GoRoute(path: '/login', builder: (_, __) => const MobileScreen()), GoRoute(path: '/otp', builder: (_, __) => const OtpScreen()), GoRoute(path: '/setup', builder: (_, __) => const ProfileSetupScreen()), GoRoute(path: '/lobby', builder: (_, __) => const LobbyScreen()), GoRoute( path: '/profile', builder: (_, __) => ProfileScreen(api: api)), GoRoute( path: '/private', builder: (_, __) => PrivateEntryScreen(api: api)), GoRoute( path: '/private/room', builder: (_, st) { final create = st.uri.queryParameters['create'] == '1'; final joinCode = st.uri.queryParameters['join']; return FutureBuilder( future: tokenStorage.read(), builder: (context, snap) { if (!snap.hasData) { return const Scaffold( body: Center(child: CircularProgressIndicator())); } return PrivateTableScreen( token: snap.data!, create: create, joinCode: joinCode, ); }, ); }, ), GoRoute( path: '/shop', builder: (_, __) => BlocProvider( create: (_) => ShopCubit(ShopRepository(api))..load(), child: const ShopScreen(), ), ), GoRoute( path: '/vip', builder: (_, __) => BlocProvider( create: (_) => ShopCubit(ShopRepository(api))..load(), child: const VipScreen(), ), ), GoRoute( path: '/game/tiers', builder: (_, __) => TierListScreen(repo: GameRepository(api)), ), GoRoute( path: '/game/:tier', builder: (_, st) { final tier = st.pathParameters['tier']!; final prize = int.tryParse(st.uri.queryParameters['prize'] ?? '') ?? 0; return FutureBuilder( future: tokenStorage.read(), builder: (context, snap) { if (!snap.hasData) { return const Scaffold( body: Center(child: CircularProgressIndicator())); } return BlocProvider( create: (_) => GameCubit(WsClient(snap.data!), tier), child: GameScreen(prize: prize), ); }, ); }, ), ], ); return MultiBlocProvider( providers: [ BlocProvider(create: (_) => AuthCubit(authRepo)), BlocProvider(create: (_) => WalletCubit(api)), ], child: MaterialApp.router( title: 'سلطان حکم', debugShowCheckedModeBanner: false, theme: AppTheme.build(), routerConfig: router, // اعمال راست‌به‌چپ برای کل اپ. builder: (context, child) => Directionality( textDirection: TextDirection.rtl, child: child!, ), ), ); } }