import 'dart:async'; import 'package:core/utils/app_logger.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:get/get.dart'; import 'package:model/firebase/firebase_dto.dart'; import 'package:tmail_ui_user/features/push_notification/domain/usecases/save_firebase_cache_interactor.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/firebase_options.dart'; @pragma('vm:entry-point') Future firebaseMessagingBackgroundHandler(RemoteMessage message) async { await dotenv.load(fileName: 'env.file'); try { await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); } catch (e) { log('NotificationService::initializeNotificationService(): $e'); } log('firebaseMessagingBackgroundHandler: ${message.data}'); } class NotificationService { factory NotificationService() => _instance; NotificationService._internal(); static final NotificationService _instance = NotificationService._internal(); static get _firebaseMessaging => FirebaseMessaging.instance; static Stream get onTokenRefresh => _firebaseMessaging.onTokenRefresh; static bool _isFlutterLocalNotificationsInitialized = false; static Future initializeNotificationService() async { try { await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); } catch (e) { log('NotificationService::initializeNotificationService(): $e'); } FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); if (_isFlutterLocalNotificationsInitialized) return; final _saveFirebaseCacheInteractor = Get.find(); final token = await _firebaseMessaging.getToken(); _saveFirebaseCacheInteractor.execute(FirebaseDto(token)); await _initFirebaseMessaging(); _isFlutterLocalNotificationsInitialized = true; } static Future _initFirebaseMessaging() async { FirebaseMessaging.onMessage.listen(_handleIncomingForegroundNotification); FirebaseMessaging.onMessageOpenedApp.listen(_handleOpenedAppNotification); } static Future _handleIncomingForegroundNotification( RemoteMessage remoteMessage, ) async { log('firebaseMessagingForegroundHandler: ${remoteMessage.data}'); } static void _handleOpenedAppNotification(RemoteMessage remoteMessage) {} static Future deleteToken() async => _firebaseMessaging.deleteToken(); }