From 971b22810780d83f3788ecf2df9b661463c17219 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 22 Mar 2024 17:03:15 +0700 Subject: [PATCH] TF-2460 Fix real time updates for web are broken --- .../model/broadcast_message_event_data.dart | 21 +++++++++++++++++++ .../presentation/services/fcm_receiver.dart | 9 ++++++++ .../presentation/services/fcm_service.dart | 16 ++++++++++++++ web/firebase-messaging-sw.js | 8 ++++++- 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 lib/features/push_notification/presentation/model/broadcast_message_event_data.dart diff --git a/lib/features/push_notification/presentation/model/broadcast_message_event_data.dart b/lib/features/push_notification/presentation/model/broadcast_message_event_data.dart new file mode 100644 index 000000000..bbaa4462b --- /dev/null +++ b/lib/features/push_notification/presentation/model/broadcast_message_event_data.dart @@ -0,0 +1,21 @@ + +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'broadcast_message_event_data.g.dart'; + +@JsonSerializable(explicitToJson: true, includeIfNull: false) +class BroadcastMessageEventData with EquatableMixin { + + final String? messageId; + final Map? data; + + BroadcastMessageEventData(this.messageId, this.data); + + factory BroadcastMessageEventData.fromJson(Map json) => _$BroadcastMessageEventDataFromJson(json); + + Map toJson() => _$BroadcastMessageEventDataToJson(this); + + @override + List get props => [messageId, data]; +} \ No newline at end of file diff --git a/lib/features/push_notification/presentation/services/fcm_receiver.dart b/lib/features/push_notification/presentation/services/fcm_receiver.dart index 512b7a1ed..c5a8d493d 100644 --- a/lib/features/push_notification/presentation/services/fcm_receiver.dart +++ b/lib/features/push_notification/presentation/services/fcm_receiver.dart @@ -6,6 +6,7 @@ import 'package:flutter/services.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/controller/fcm_message_controller.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/services/fcm_service.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart'; +import 'package:universal_html/html.dart' as html; @pragma('vm:entry-point') Future handleFirebaseBackgroundMessage(RemoteMessage message) async { @@ -29,6 +30,9 @@ class FcmReceiver { _onForegroundMessage(); _onBackgroundMessage(); + if (PlatformInfo.isWeb) { + _onMessageBroadcastChannel(); + } if (PlatformInfo.isIOS) { notificationInteractionChannel.setMethodCallHandler((call) async { @@ -49,6 +53,11 @@ class FcmReceiver { FirebaseMessaging.onBackgroundMessage(handleFirebaseBackgroundMessage); } + void _onMessageBroadcastChannel() { + final broadcast = html.BroadcastChannel('background-message'); + broadcast.onMessage.listen(FcmService.instance.handleMessageEventBroadcastChannel); + } + Future _getInitialToken() async { final token = await FirebaseMessaging.instance.getToken( vapidKey: PlatformInfo.isWeb ? AppConfig.fcmVapidPublicKeyWeb : null diff --git a/lib/features/push_notification/presentation/services/fcm_service.dart b/lib/features/push_notification/presentation/services/fcm_service.dart index 689ec1274..031b43d82 100644 --- a/lib/features/push_notification/presentation/services/fcm_service.dart +++ b/lib/features/push_notification/presentation/services/fcm_service.dart @@ -1,13 +1,16 @@ import 'dart:async'; +import 'dart:convert'; import 'package:core/utils/app_logger.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/push_notification/presentation/model/broadcast_message_event_data.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart'; +import 'package:universal_html/html.dart' as html; class FcmService { @@ -35,6 +38,19 @@ class FcmService { } } + void handleMessageEventBroadcastChannel(html.MessageEvent messageEvent) { + log('FcmService::handleMessageEventBroadcastChannel():TYPE: ${messageEvent.data.runtimeType} | DATA: ${messageEvent.data}'); + try { + final jsonEventData = jsonDecode(jsonEncode(messageEvent.data)) as Map; + final eventData = BroadcastMessageEventData.fromJson(jsonEventData); + if (eventData.data?.isNotEmpty == true) { + foregroundMessageStreamController?.add(eventData.data!); + } + } catch (e) { + logError('FcmService::handleMessageEventBroadcastChannel: Exception = $e'); + } + } + void handleToken(String? token) { log('FcmService::handleToken():token: $token'); fcmTokenStreamController?.add(token); diff --git a/web/firebase-messaging-sw.js b/web/firebase-messaging-sw.js index f28471b41..5b27455fd 100644 --- a/web/firebase-messaging-sw.js +++ b/web/firebase-messaging-sw.js @@ -11,4 +11,10 @@ firebase.initializeApp({ appId: "...", }); // Retrieve an instance of Firebase Messaging so that it can handle background messages. -const messaging = firebase.messaging(); \ No newline at end of file +const messaging = firebase.messaging(); + +const broadcast = new BroadcastChannel('background-message'); + +messaging.onBackgroundMessage((message) => { + broadcast.postMessage(message); +}); \ No newline at end of file