From 0f67f4df74e1ae6f3c0cce2903040f992eb65ade Mon Sep 17 00:00:00 2001 From: Vaibhav Surve Date: Thu, 17 Jul 2025 10:09:20 +0530 Subject: [PATCH] added firebase service --- lib/helpers/services/app_initializer.dart | 22 ++++++-- .../services/firebase_messaging_services.dart | 53 +++++++++++++++++++ 2 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 lib/helpers/services/firebase_messaging_services.dart diff --git a/lib/helpers/services/app_initializer.dart b/lib/helpers/services/app_initializer.dart index 5d55b0c..614d391 100644 --- a/lib/helpers/services/app_initializer.dart +++ b/lib/helpers/services/app_initializer.dart @@ -8,23 +8,33 @@ import 'package:marco/helpers/theme/app_theme.dart'; import 'package:url_strategy/url_strategy.dart'; import 'package:marco/helpers/services/app_logger.dart'; import 'package:marco/helpers/services/auth_service.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:marco/helpers/services/firebase_messaging_services.dart'; + Future initializeApp() async { try { logSafe("💡 Starting app initialization..."); + // 1. Set Flutter web path URL strategy (optional but early) setPathUrlStrategy(); logSafe("💡 URL strategy set."); + // 2. Set system UI overlays SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( statusBarColor: Color.fromARGB(255, 255, 0, 0), statusBarIconBrightness: Brightness.light, )); logSafe("💡 System UI overlay style set."); + // 3. Initialize Firebase (should be before any Firebase service usage) + await Firebase.initializeApp(); + logSafe("💡 Firebase initialized."); + + // 4. Local storage await LocalStorage.init(); logSafe("💡 Local storage initialized."); - // If a refresh token is found, try to refresh the JWT token + // 5. Try to refresh JWT token if available final refreshToken = await LocalStorage.getRefreshToken(); if (refreshToken != null && refreshToken.isNotEmpty) { logSafe("🔁 Refresh token found. Attempting to refresh JWT..."); @@ -32,15 +42,16 @@ Future initializeApp() async { if (!success) { logSafe("⚠️ Refresh token invalid or expired. Skipping controller injection."); - // Optionally, clear tokens and force logout here if needed } } else { logSafe("❌ No refresh token found. Skipping refresh."); } + // 6. Initialize theme customization await ThemeCustomizer.init(); logSafe("💡 Theme customizer initialized."); + // 7. Inject controllers if token is valid final token = LocalStorage.getString('jwt_token'); if (token != null && token.isNotEmpty) { if (!Get.isRegistered()) { @@ -53,13 +64,18 @@ Future initializeApp() async { logSafe("💡 ProjectController injected as permanent."); } - // Load data into controllers if required await Get.find().loadData(token); await Get.find().fetchProjects(); } else { logSafe("⚠️ No valid JWT token found. Skipping controller initialization."); } + // 8. Firebase Messaging setup + final notificationService = FirebaseNotificationService(); + await notificationService.initialize(); + logSafe("💡 Firebase Messaging initialized."); + + // 9. App style setup AppStyle.init(); logSafe("💡 AppStyle initialized."); diff --git a/lib/helpers/services/firebase_messaging_services.dart b/lib/helpers/services/firebase_messaging_services.dart new file mode 100644 index 0000000..ee3979c --- /dev/null +++ b/lib/helpers/services/firebase_messaging_services.dart @@ -0,0 +1,53 @@ +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:logger/logger.dart'; + +class FirebaseNotificationService { + final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; + final Logger _logger = Logger(); + + Future initialize() async { + await Firebase.initializeApp(); + _logger.i('Firebase initialized.'); + + NotificationSettings settings = await _firebaseMessaging.requestPermission(); + _logger.i('FCM permission status: ${settings.authorizationStatus}'); + + // Foreground messages + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + _logger.i('🔔 Foreground Notification Received'); + _logNotificationDetails(message); + }); + + // When app is opened from background via notification + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { + _logger.i('📲 App opened via notification'); + _handleNotificationTap(message); + }); + + // Background handler registration + FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); + } + + void _handleNotificationTap(RemoteMessage message) { + _logger.i('Notification tapped with data: ${message.data}'); + } + + void _logNotificationDetails(RemoteMessage message) { + _logger.i('Notification ID: ${message.messageId}'); + _logger.i('Title: ${message.notification?.title}'); + _logger.i('Body: ${message.notification?.body}'); + _logger.i('Data: ${message.data}'); + } +} + +// Background handler +Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { + await Firebase.initializeApp(); + final Logger _logger = Logger(); + _logger.i('🕓 Handling background notification...'); + _logger.i('Notification ID: ${message.messageId}'); + _logger.i('Title: ${message.notification?.title}'); + _logger.i('Body: ${message.notification?.body}'); + _logger.i('Data: ${message.data}'); +} \ No newline at end of file