Files
doormile_customer_app/lib/main.dart
2026-06-23 11:29:07 +05:30

177 lines
6.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:doormile/shared/state/app_state.dart';
import 'package:doormile/core/theme/app_theme.dart';
import 'package:doormile/core/theme/app_colors.dart';
import 'package:doormile/features/auth/screens/onboarding_screen.dart';
import 'package:doormile/features/auth/screens/login_screen.dart';
import 'package:doormile/features/auth/screens/signup_screen.dart';
import 'package:doormile/features/auth/screens/otp_screen.dart';
import 'package:doormile/features/auth/screens/pin_screen.dart';
import 'package:doormile/features/dashboard/screens/main_shell.dart';
import 'package:doormile/features/booking/screens/booking_pickup_screen.dart';
import 'package:doormile/features/booking/screens/parcel_details_screen.dart';
import 'package:doormile/features/booking/screens/service_price_screen.dart';
import 'package:doormile/features/booking/screens/booking_preview_screen.dart';
import 'package:doormile/features/booking/screens/booking_success_screen.dart';
import 'package:doormile/features/tracking/screens/my_orders_screen.dart';
import 'package:doormile/features/tracking/screens/live_tracking_screen.dart';
import 'package:doormile/features/tracking/screens/shipment_journey_screen.dart';
import 'package:doormile/features/support/screens/help_support_screen.dart';
import 'package:doormile/features/dashboard/screens/saved_addresses_screen.dart';
import 'package:doormile/features/support/screens/chat_screen.dart';
import 'package:doormile/shared/models/models.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
try {
await Firebase.initializeApp();
} catch (e) {
debugPrint('Firebase initialization error: $e');
}
final prefs = await SharedPreferences.getInstance();
final token = prefs.getString('auth_token');
final initialRoute = (token != null && token.isNotEmpty) ? Routes.home : Routes.onboarding;
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarIconBrightness: Brightness.dark,
));
runApp(DoormileApp(initialRoute: initialRoute));
}
class Routes {
static const splash = '/';
static const onboarding = '/onboarding';
static const login = '/login';
static const signup = '/signup';
static const otp = '/otp';
static const enterPin = '/enter-pin';
static const setPin = '/set-pin';
static const resetPin = '/reset-pin';
static const home = '/home';
static const bookingPickup = '/booking/pickup';
static const parcelDetails = '/booking/details';
static const servicePrice = '/booking/service';
static const bookingPreview = '/booking/preview';
static const bookingSuccess = '/booking/success';
static const myOrders = '/orders';
static const liveTracking = '/tracking/live';
static const shipmentJourney = '/tracking/journey';
static const help = '/help';
static const addresses = '/addresses';
static const chat = '/chat';
}
class DoormileApp extends StatelessWidget {
final String initialRoute;
const DoormileApp({super.key, required this.initialRoute});
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => AppState(),
child: _buildApp(),
);
}
Widget _buildApp() {
return MaterialApp(
title: 'Doormile',
debugShowCheckedModeBanner: false,
theme: AppTheme.light,
initialRoute: initialRoute,
onGenerateRoute: (settings) {
Widget page;
switch (settings.name) {
case Routes.onboarding:
page = const OnboardingScreen();
break;
case Routes.login:
page = const LoginScreen();
break;
case Routes.signup:
page = const SignupScreen();
break;
case Routes.otp:
page = const OtpScreen();
break;
case Routes.enterPin:
page = const PinScreen(mode: PinMode.enter);
break;
case Routes.setPin:
page = const PinScreen(mode: PinMode.set);
break;
case Routes.resetPin:
page = const PinScreen(mode: PinMode.reset);
break;
case Routes.home:
page = const MainShell();
break;
case Routes.bookingPickup:
page = const BookingPickupScreen();
break;
case Routes.parcelDetails:
page = const ParcelDetailsScreen();
break;
case Routes.servicePrice:
page = const ServicePriceScreen();
break;
case Routes.bookingPreview:
page = const BookingPreviewScreen();
break;
case Routes.bookingSuccess:
page = const BookingSuccessScreen();
break;
case Routes.myOrders:
page = const MyOrdersScreen();
break;
case Routes.liveTracking:
page = LiveTrackingScreen(order: settings.arguments as Order?);
break;
case Routes.shipmentJourney:
page = ShipmentJourneyScreen(order: settings.arguments as Order?);
break;
case Routes.help:
page = const HelpSupportScreen();
break;
case Routes.addresses:
page = const SavedAddressesScreen();
break;
case Routes.chat:
page = ChatScreen(riderName: (settings.arguments as String?) ?? 'Rahul Sharma');
break;
default:
page = const MainShell();
}
return PageRouteBuilder(
settings: settings,
pageBuilder: (_, __, ___) => page,
transitionsBuilder: (_, animation, __, child) {
return FadeTransition(
opacity: animation,
child: SlideTransition(
position: Tween(begin: const Offset(0, 0.02), end: Offset.zero)
.animate(CurvedAnimation(parent: animation, curve: Curves.easeOut)),
child: child,
),
);
},
transitionDuration: const Duration(milliseconds: 280),
);
},
);
}
}
/// Selection colour helper used by text fields.
final selectionTheme = const TextSelectionThemeData(
selectionColor: AppColors.primaryFixed,
cursorColor: AppColors.primary,
);