import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:grocery_app/src/core/network_services/service_locator.dart'; import 'package:grocery_app/src/core/routes/routes.dart'; import 'package:grocery_app/src/firebase_options.dart'; import 'package:grocery_app/src/logic/provider/addTocart_provider.dart'; import 'package:grocery_app/src/logic/provider/address_provider.dart'; import 'package:grocery_app/src/logic/provider/auth_provider.dart'; import 'package:grocery_app/src/logic/provider/bottom_navbar_provider.dart'; import 'package:grocery_app/src/logic/provider/home_provider.dart'; import 'package:grocery_app/src/logic/provider/order_provider.dart'; import 'package:grocery_app/src/logic/provider/profile_provider.dart'; import 'package:grocery_app/src/logic/services/notification_service.dart'; import 'package:grocery_app/src/ui/splash/splash_screen.dart'; import 'package:grocery_app/utils/constants/color_constant.dart'; import 'package:grocery_app/utils/constants/string_constant.dart'; import 'package:loader_overlay/loader_overlay.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; @pragma('vm:entry-point') Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(); print("💬 Background Message Received: ${message.notification?.title}"); if (message.notification != null) { NotificationService.flutterLocalNotificationsPlugin.show( message.hashCode, message.notification!.title, message.notification!.body, const NotificationDetails( android: AndroidNotificationDetails( 'high_importance_channel', 'High Importance Notifications', channelDescription: 'Used for important notifications.', importance: Importance.max, priority: Priority.high, ), ), ); } } Future main() async { WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); await NotificationService.init(); ServiceLocator.setup(); await requestNotificationPermission(); runApp(const MyApplication()); } Future requestNotificationPermission() async { PermissionStatus status = await Permission.notification.status; if (status.isDenied || status.isPermanentlyDenied) { status = await Permission.notification.request(); } if (status.isGranted) { print("✅ Notification permission granted"); } else if (status.isPermanentlyDenied) { print("⚠️ Notification permission permanently denied. Open settings."); openAppSettings(); } else { print("❌ Notification permission denied."); } } class MyApplication extends StatelessWidget { const MyApplication({super.key}); @override Widget build(BuildContext context) { return ScreenUtilInit( designSize: const Size(360, 690), minTextAdapt: true, splitScreenMode: true, builder: (context, child) => GlobalLoaderOverlay( overlayColor: APPCOLOR.whiteFBFEFB.withOpacity(0.5), useDefaultLoading: false, // overlayWidgetBuilder: (progress) => const GlobalLoader(), child: MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => AuthProvider()), ChangeNotifierProvider(create: (_) => ProductProvider()), ChangeNotifierProvider(create: (_) => AddtocartProvider()), ChangeNotifierProvider(create: (_) => BottomNavProvider()), ChangeNotifierProvider(create: (_) => AddressProvider()), ChangeNotifierProvider(create: (_) => ProfileProvider()), ChangeNotifierProvider(create: (_) => OrderProvider()), ], child: MaterialApp.router( routerConfig: MyRoutes.router, debugShowCheckedModeBanner: false, theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.lightGreen), scaffoldBackgroundColor: Colors.white, canvasColor: const Color.fromRGBO(255, 255, 255, 1), fontFamily: 'GoogleSans', primarySwatch: Colors.blue, ), themeMode: ThemeMode.light, title: APPSTRING.appName, ), ), ), ); } }