Files
workavia-mail-front/lib/features/push_notification/presentation/notification_service.dart
T
2022-12-02 16:13:47 +07:00

66 lines
2.5 KiB
Dart

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<void> 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<String> get onTokenRefresh => _firebaseMessaging.onTokenRefresh;
static bool _isFlutterLocalNotificationsInitialized = false;
static Future<void> 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<SaveFirebaseCacheInteractor>();
final token = await _firebaseMessaging.getToken();
_saveFirebaseCacheInteractor.execute(FirebaseDto(token));
await _initFirebaseMessaging();
_isFlutterLocalNotificationsInitialized = true;
}
static Future<void> _initFirebaseMessaging() async {
FirebaseMessaging.onMessage.listen(_handleIncomingForegroundNotification);
FirebaseMessaging.onMessageOpenedApp.listen(_handleOpenedAppNotification);
}
static Future<void> _handleIncomingForegroundNotification(
RemoteMessage remoteMessage,
) async {
log('firebaseMessagingForegroundHandler: ${remoteMessage.data}');
}
static void _handleOpenedAppNotification(RemoteMessage remoteMessage) {}
static Future<void> deleteToken() async => _firebaseMessaging.deleteToken();
}