import 'dart:async'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:mobile_monitoring/core/firebase_options.dart'; import 'package:mobile_monitoring/core/constants/strings.dart'; import 'package:mobile_monitoring/core/theme/app_theme.dart'; import 'package:mobile_monitoring/ui/pages/splash_screen.dart'; import 'package:mobile_monitoring/ui/pages/login.dart'; import 'package:mobile_monitoring/ui/pages/home.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await dotenv.load(fileName: '.env'); FlutterError.onError = (details) { FlutterError.presentError(details); debugPrint('FlutterError: ${details.exceptionAsString()}'); debugPrint(details.stack?.toString()); }; await runZonedGuarded( () async { await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); // Disable reCAPTCHA for development FirebaseAuth.instance.setSettings( appVerificationDisabledForTesting: true, ); runApp(const MyApp()); }, (error, stack) { debugPrint('Zoned error: $error'); debugPrint(stack.toString()); }, ); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: AppStrings.appName, debugShowCheckedModeBanner: false, theme: AppTheme.lightTheme, navigatorObservers: [LoggingNavigatorObserver()], home: const SplashScreen( duration: Duration(seconds: 3), nextPage: AuthWrapper(), ), onGenerateRoute: (settings) { switch (settings.name) { case '/home': return MaterialPageRoute( builder: (context) => const HomePage(), settings: settings, ); default: return null; } }, ); } } class LoggingNavigatorObserver extends NavigatorObserver { LoggingNavigatorObserver(); @override void didPush(Route route, Route? previousRoute) { debugPrint('NAV push: ${route.settings.name ?? route.runtimeType}'); super.didPush(route, previousRoute); } @override void didPop(Route route, Route? previousRoute) { debugPrint('NAV pop: ${route.settings.name ?? route.runtimeType}'); super.didPop(route, previousRoute); } @override void didReplace({Route? newRoute, Route? oldRoute}) { debugPrint( 'NAV replace: ${oldRoute?.settings.name ?? oldRoute?.runtimeType} -> ${newRoute?.settings.name ?? newRoute?.runtimeType}', ); super.didReplace(newRoute: newRoute, oldRoute: oldRoute); } } class AuthWrapper extends StatefulWidget { const AuthWrapper({super.key}); @override State createState() => _AuthWrapperState(); } class _AuthWrapperState extends State { @override Widget build(BuildContext context) { return StreamBuilder( stream: FirebaseAuth.instance.authStateChanges(), builder: (context, snapshot) { // Show loading while checking auth state if (snapshot.connectionState == ConnectionState.waiting) { return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } // If user is logged in, show home page if (snapshot.hasData) { return const HomePage(); } // If user is not logged in, show login page return const LoginPage(); }, ); } }