diff --git a/docs/configuration/fcm_configuration.md b/docs/configuration/fcm_configuration.md index 65c34cb2c..930094b7e 100644 --- a/docs/configuration/fcm_configuration.md +++ b/docs/configuration/fcm_configuration.md @@ -6,6 +6,7 @@ - Now only support to Android ### How to config 1.Add environment of FCM service in [env.fcm](https://github.com/linagora/tmail-flutter/blob/master/configurations/env.fcm) +Android config: ``` FIREBASE_ANDROID_API_KEY=abc FIREBASE_ANDROID_APP_ID=abc @@ -14,6 +15,17 @@ FIREBASE_ANDROID_PROJECT_ID=abc FIREBASE_ANDROID_DATABASE_URL=https://abc.app FIREBASE_ANDROID_STORAGE_BUCKET=abc.com ``` +Web config: +``` +FIREBASE_WEB_API_KEY=abc +FIREBASE_WEB_APP_ID=abc +FIREBASE_WEB_MESSAGING_SENDER_ID=abc +FIREBASE_WEB_PROJECT_ID=abc +FIREBASE_WEB_DATABASE_URL=https://abc.app +FIREBASE_WEB_STORAGE_BUCKET=abc.com +FIREBASE_WEB_AUTH_DOMAIN=abc.com +FIREBASE_WEB_VAPID_PUBLIC_KEY=abc +``` 2. Active field FCM_AVAILABLE in [env.file](https://github.com/linagora/tmail-flutter/blob/master/env.file) ``` FCM_AVAILABLE=supported diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index d58ee27da..b3d547780 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -9,6 +9,7 @@ import 'package:core/utils/app_logger.dart'; import 'package:core/utils/fps_manager.dart'; import 'package:dartz/dartz.dart'; import 'package:fcm/model/firebase_capability.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:forward/forward/capability_forward.dart'; @@ -162,14 +163,16 @@ abstract class BaseController extends GetxController if (AppConfig.fcmAvailable) { await AppUtils.loadFcmConfigFile(); FcmConfiguration.initialize(); - await LocalNotificationManager.instance.setUp(); + if (!kIsWeb) { + await LocalNotificationManager.instance.setUp(); + } FcmInteractorBindings().dependencies(); FcmController.instance.initialize(accountId: accountId); } else { throw NotSupportFCMException(); } } catch(e) { - logError('BaseController::injectFirebaseBindings(): exception: $e'); + logError('BaseController::injectFCMBindings(): exception: $e'); } } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 5d4e8f351..b1cad58e3 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1058,6 +1058,7 @@ class MailboxDashBoardController extends ReloadableController { _handleComposerCache(); injectAutoCompleteBindings(sessionCurrent, accountId.value); injectRuleFilterBindings(sessionCurrent, accountId.value); + injectFCMBindings(sessionCurrent, accountId.value); injectVacationBindings(sessionCurrent, accountId.value); _getVacationResponse(); } diff --git a/lib/features/push_notification/domain/exceptions/fcm_exception.dart b/lib/features/push_notification/domain/exceptions/fcm_exception.dart index 6edfdbd7d..499ec4d5d 100644 --- a/lib/features/push_notification/domain/exceptions/fcm_exception.dart +++ b/lib/features/push_notification/domain/exceptions/fcm_exception.dart @@ -1,5 +1,7 @@ class NotSupportFCMException implements Exception {} +class NotLoadedFCMTokenException implements Exception {} + class NotFoundStateToRefreshException implements Exception {} class NotFoundEmailDeliveryStateException implements Exception {} diff --git a/lib/features/push_notification/presentation/services/fcm_receiver.dart b/lib/features/push_notification/presentation/services/fcm_receiver.dart index c4e9be936..c8a5e33e2 100644 --- a/lib/features/push_notification/presentation/services/fcm_receiver.dart +++ b/lib/features/push_notification/presentation/services/fcm_receiver.dart @@ -1,6 +1,9 @@ import 'package:core/utils/app_logger.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/exceptions/fcm_exception.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/services/fcm_service.dart'; @pragma('vm:entry-point') @@ -26,9 +29,14 @@ class FcmReceiver { } void getFcmToken() async { - final token = await FirebaseMessaging.instance.getToken(); - log('FcmReceiver::onFcmToken():token: $token'); - FcmService.instance.handleRefreshToken(token); + try { + final token = await FirebaseMessaging.instance.getToken(vapidKey: kIsWeb ? dotenv.get('FIREBASE_WEB_VAPID_PUBLIC_KEY', fallback: '') : null); + log('FcmReceiver::onFcmToken():token: $token'); + FcmService.instance.handleRefreshToken(token); + } catch(e) { + log('FcmReceiver::onFcmToken():exception: $e'); + throw NotLoadedFCMTokenException(); + } } void onRefreshFcmToken() { diff --git a/web/firebase-messaging-sw.js b/web/firebase-messaging-sw.js new file mode 100644 index 000000000..d3027c812 --- /dev/null +++ b/web/firebase-messaging-sw.js @@ -0,0 +1,13 @@ +importScripts("https://www.gstatic.com/firebasejs/9.10.0/firebase-app-compat.js"); +importScripts("https://www.gstatic.com/firebasejs/9.10.0/firebase-messaging-compat.js"); + +firebase.initializeApp({ + apiKey: "...", + authDomain: "...", + databaseURL: "...", + projectId: "...", + storageBucket: "...", + messagingSenderId: "...", + appId: "...", +}); +const messaging = firebase.messaging(); diff --git a/web/index.html b/web/index.html index 4f93bf512..88e38834d 100644 --- a/web/index.html +++ b/web/index.html @@ -56,6 +56,7 @@ // Wait for registration to finish before dropping the