124 lines
3.5 KiB
Dart
124 lines
3.5 KiB
Dart
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<AuthWrapper> createState() => _AuthWrapperState();
|
|
}
|
|
|
|
class _AuthWrapperState extends State<AuthWrapper> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return StreamBuilder<User?>(
|
|
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();
|
|
},
|
|
);
|
|
}
|
|
}
|