import 'package:flutter/material.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; import 'package:provider/provider.dart'; import 'package:qpay/auth_state.dart'; import 'package:qpay/routes.dart'; import 'package:qpay/screens/transaction_controller.dart'; import 'package:qpay/screens/onboarding/onboarding_controller.dart'; import 'package:qpay/theme/app_theme.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; const String testEnv = 'assets/.env.test'; const String liveEnv = 'assets/.env.live'; const String appEnv = String.fromEnvironment('APP_ENV', defaultValue: 'test'); String resolveEnvFile(String env) { switch (env.toLowerCase()) { case 'live': return liveEnv; case 'test': default: return testEnv; } } void main() async { WidgetsFlutterBinding.ensureInitialized(); usePathUrlStrategy(); await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); await dotenv.load(fileName: resolveEnvFile(appEnv)); // Read the persisted auth token before the first frame so the router // knows whether the user is already signed in on cold start. Without // this we would briefly treat logged-in users as guests and bounce // them to the sign-in screen until the first refresh kicked in. await authState.initialize(); runApp( MultiProvider( providers: [ ChangeNotifierProvider( create: (_) => TransactionController(), ), ChangeNotifierProvider( create: (_) => OnboardingController(), ), ], child: const MyApp(), ), ); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override State createState() => _MyAppState(); } class _MyAppState extends State { @override Widget build(BuildContext context) { return MaterialApp.router( title: 'Velocity', theme: AppTheme.lightTheme, themeMode: ThemeMode.light, debugShowCheckedModeBanner: false, routerConfig: buildRouter(), ); } }