diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 089441c617..dd58750c7d 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -1971,6 +1971,16 @@ class ChatController extends State } } + void requestNotificationPermission() { + if (PlatformInfos.isWeb) { + try { + html.Notification.requestPermission(); + } catch (e) { + Logs().e("Error requesting notification permission: $e"); + } + } + } + @override void dispose() { unregisterPasteShortcutListeners(); @@ -2015,7 +2025,10 @@ class ChatController extends State Widget build(BuildContext context) { return MouseRegion( onHover: (_) => _resetLocationPath(), - child: ChatView(this, key: widget.key), + child: GestureDetector( + onTap: requestNotificationPermission, + child: ChatView(this, key: widget.key), + ), ); } } diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index e1c78d5e74..15237f9259 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -6,6 +6,7 @@ import 'package:fluffychat/pages/chat_list/chat_list_item_subtitle.dart'; import 'package:fluffychat/pages/chat_list/chat_list_item_title.dart'; import 'package:fluffychat/utils/dialog/twake_dialog.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; +import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/twake_snackbar.dart'; import 'package:fluffychat/widgets/avatar/avatar.dart'; import 'package:flutter/material.dart'; @@ -14,6 +15,7 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:go_router/go_router.dart'; import 'package:linagora_design_flutter/linagora_design_flutter.dart'; import 'package:matrix/matrix.dart'; +import 'package:universal_html/html.dart' as html hide File; enum ArchivedRoomAction { delete, rejoin } @@ -42,6 +44,14 @@ class ChatListItem extends StatelessWidget with ChatListItemMixin { }); void clickAction(BuildContext context) async { + if (PlatformInfos.isWeb) { + try { + html.Notification.requestPermission(); + } catch (e) { + Logs().e("Error requesting notification permission: $e"); + } + } + if (onTap != null) return onTap!(); switch (room.membership) { case Membership.ban: diff --git a/lib/widgets/local_notifications_extension.dart b/lib/widgets/local_notifications_extension.dart index d0cfc92457..ab921ca209 100644 --- a/lib/widgets/local_notifications_extension.dart +++ b/lib/widgets/local_notifications_extension.dart @@ -1,6 +1,5 @@ import 'dart:io'; import 'package:fluffychat/domain/model/room/room_extension.dart'; -import 'package:fluffychat/presentation/extensions/event_update_extension.dart'; import 'package:flutter/foundation.dart'; import 'package:desktop_lifecycle/desktop_lifecycle.dart'; @@ -63,14 +62,22 @@ extension LocalNotificationsExtension on MatrixState { method: ThumbnailMethod.crop, ); if (kIsWeb) { - _audioPlayer.play(); - js.context.callMethod("handleNotifications", [ - title, - body, - icon, - eventUpdate.roomID, - eventUpdate.eventId, - ]); + try { + await _audioPlayer.play(); + } catch (e) { + Logs().e('Can not play notification sound on this browser'); + } + + try { + js.context.callMethod("handleNotifications", [ + title, + body, + icon, + eventUpdate.roomID, + ]); + } catch (e) { + Logs().e('Can not display notification on this browser: $e'); + } } else if (Platform.isLinux) { final appIconUrl = room.avatar?.getThumbnail( room.client, diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index d912db9df9..a262403cd9 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -364,7 +364,6 @@ class MatrixState extends State currentClient.onUiaRequest.stream.listen(uiaRequestHandler); if (PlatformInfos.isWeb || PlatformInfos.isLinux) { currentClient.onSync.stream.first.then((s) { - html.Notification.requestPermission(); onNotification[name] ??= currentClient.onEvent.stream .where( (e) =>