TF-2460 Fix real time updates for web are broken
This commit is contained in:
@@ -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<String, dynamic>? data;
|
||||||
|
|
||||||
|
BroadcastMessageEventData(this.messageId, this.data);
|
||||||
|
|
||||||
|
factory BroadcastMessageEventData.fromJson(Map<String, dynamic> json) => _$BroadcastMessageEventDataFromJson(json);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => _$BroadcastMessageEventDataToJson(this);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [messageId, data];
|
||||||
|
}
|
||||||
@@ -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/controller/fcm_message_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/push_notification/presentation/services/fcm_service.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:tmail_ui_user/main/utils/app_config.dart';
|
||||||
|
import 'package:universal_html/html.dart' as html;
|
||||||
|
|
||||||
@pragma('vm:entry-point')
|
@pragma('vm:entry-point')
|
||||||
Future<void> handleFirebaseBackgroundMessage(RemoteMessage message) async {
|
Future<void> handleFirebaseBackgroundMessage(RemoteMessage message) async {
|
||||||
@@ -29,6 +30,9 @@ class FcmReceiver {
|
|||||||
|
|
||||||
_onForegroundMessage();
|
_onForegroundMessage();
|
||||||
_onBackgroundMessage();
|
_onBackgroundMessage();
|
||||||
|
if (PlatformInfo.isWeb) {
|
||||||
|
_onMessageBroadcastChannel();
|
||||||
|
}
|
||||||
|
|
||||||
if (PlatformInfo.isIOS) {
|
if (PlatformInfo.isIOS) {
|
||||||
notificationInteractionChannel.setMethodCallHandler((call) async {
|
notificationInteractionChannel.setMethodCallHandler((call) async {
|
||||||
@@ -49,6 +53,11 @@ class FcmReceiver {
|
|||||||
FirebaseMessaging.onBackgroundMessage(handleFirebaseBackgroundMessage);
|
FirebaseMessaging.onBackgroundMessage(handleFirebaseBackgroundMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _onMessageBroadcastChannel() {
|
||||||
|
final broadcast = html.BroadcastChannel('background-message');
|
||||||
|
broadcast.onMessage.listen(FcmService.instance.handleMessageEventBroadcastChannel);
|
||||||
|
}
|
||||||
|
|
||||||
Future<String?> _getInitialToken() async {
|
Future<String?> _getInitialToken() async {
|
||||||
final token = await FirebaseMessaging.instance.getToken(
|
final token = await FirebaseMessaging.instance.getToken(
|
||||||
vapidKey: PlatformInfo.isWeb ? AppConfig.fcmVapidPublicKeyWeb : null
|
vapidKey: PlatformInfo.isWeb ? AppConfig.fcmVapidPublicKeyWeb : null
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:core/utils/app_logger.dart';
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:firebase_messaging/firebase_messaging.dart';
|
import 'package:firebase_messaging/firebase_messaging.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/id.dart';
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.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/app_routes.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_utils.dart';
|
import 'package:tmail_ui_user/main/routes/route_utils.dart';
|
||||||
|
import 'package:universal_html/html.dart' as html;
|
||||||
|
|
||||||
class FcmService {
|
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<String, dynamic>;
|
||||||
|
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) {
|
void handleToken(String? token) {
|
||||||
log('FcmService::handleToken():token: $token');
|
log('FcmService::handleToken():token: $token');
|
||||||
fcmTokenStreamController?.add(token);
|
fcmTokenStreamController?.add(token);
|
||||||
|
|||||||
@@ -11,4 +11,10 @@ firebase.initializeApp({
|
|||||||
appId: "...",
|
appId: "...",
|
||||||
});
|
});
|
||||||
// Retrieve an instance of Firebase Messaging so that it can handle background messages.
|
// Retrieve an instance of Firebase Messaging so that it can handle background messages.
|
||||||
const messaging = firebase.messaging();
|
const messaging = firebase.messaging();
|
||||||
|
|
||||||
|
const broadcast = new BroadcastChannel('background-message');
|
||||||
|
|
||||||
|
messaging.onBackgroundMessage((message) => {
|
||||||
|
broadcast.postMessage(message);
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user