diff --git a/lib/common/notifications/notification_helper.dart b/lib/common/notifications/notification_helper.dart index b30ff55..318c52a 100644 --- a/lib/common/notifications/notification_helper.dart +++ b/lib/common/notifications/notification_helper.dart @@ -29,6 +29,14 @@ class NotificationHelper { Event? unSendNotification; bool forwardedToAmber = false; + final Map _pushDeniedBySigner = {}; + String? _lastDeviceId; + + void resetPushDenialCache() { + _pushDeniedBySigner.clear(); + _lastDeviceId = null; + } + Future init() async { startHeartBeat(); nc.addConnectStatusListener( @@ -72,6 +80,13 @@ class NotificationHelper { String content, ) async { try { + if (canSign()) { + final pubkey = currentSigner!.getPublicKey(); + if (_pushDeniedBySigner[pubkey] == true) { + return null; + } + } + final enContent = await currentSigner!.encrypt04(content, receiver); final tags = Nip4.toTags(receiver, '', null); @@ -96,6 +111,15 @@ class NotificationHelper { return event; } catch (e) { + final errorStr = e.toString().toLowerCase(); + if (errorStr.contains('no permission') || + errorStr.contains('permission denied') || + errorStr.contains('denied')) { + if (canSign()) { + final pubkey = currentSigner!.getPublicKey(); + _pushDeniedBySigner[pubkey] = true; + } + } lg.i(e); return null; } @@ -155,12 +179,26 @@ class NotificationHelper { String deviceId, List kinds, ) async { + final c = nostrRepository.currentAppCustomization; + if (!(c?.enablePushNotification ?? false)) { + return false; + } + + if (deviceId.isNotEmpty && deviceId == _lastDeviceId) { + if (canSign()) { + final pubkey = currentSigner!.getPublicKey(); + if (_pushDeniedBySigner[pubkey] == true) { + return false; + } + } + } + if (serverPubkey.isEmpty || forwardedToAmber) { forwardedToAmber = false; return false; } - final c = nostrRepository.currentAppCustomization; + _lastDeviceId = deviceId; final map = { 'online': deviceId.isEmpty ? 0 : 1, diff --git a/lib/logic/notifications_cubit/notifications_cubit.dart b/lib/logic/notifications_cubit/notifications_cubit.dart index 8301163..91ada71 100644 --- a/lib/logic/notifications_cubit/notifications_cubit.dart +++ b/lib/logic/notifications_cubit/notifications_cubit.dart @@ -330,11 +330,16 @@ class NotificationsCubit extends Cubit { } void setPushNotifications(String deviceId) { + final c = nostrRepository.currentAppCustomization; + + if (!(c?.enablePushNotification ?? false)) { + return; + } + final kinds = { EventKind.DIRECT_MESSAGE, EventKind.PRIVATE_DIRECT_MESSAGE, }; - final c = nostrRepository.currentAppCustomization; if (c?.notifMentionsReplies ?? false) { kinds.addAll( diff --git a/lib/logic/settings_cubit/settings_cubit.dart b/lib/logic/settings_cubit/settings_cubit.dart index a9bc6dc..f95d35f 100644 --- a/lib/logic/settings_cubit/settings_cubit.dart +++ b/lib/logic/settings_cubit/settings_cubit.dart @@ -9,6 +9,7 @@ import 'package:nostr_core_enhanced/nostr/event_signer/remote_event_signer.dart' import 'package:nostr_core_enhanced/nostr/nostr.dart'; import 'package:nostr_core_enhanced/utils/utils.dart'; +import '../../common/notifications/notification_helper.dart'; import '../../initializers.dart'; import '../../models/app_client_model.dart'; import '../../models/app_models/settings_data.dart'; @@ -248,6 +249,8 @@ class SettingsCubit extends Cubit { nc.setSigner(currentSigner); currentUserRelayList.pubkey = currentSigner!.getPublicKey(); + NotificationHelper.sharedInstance.resetPushDenialCache(); + try { nostrRepository.setCurrentAppCustomizationFromCache(broadcast: true); nostrRepository.setCurrentUserDraft(); @@ -292,6 +295,8 @@ class SettingsCubit extends Cubit { currentSigner = null; nc.setSigner(currentSigner); nostrRepository.setCurrentSignerState(null); + + NotificationHelper.sharedInstance.resetPushDenialCache(); privateKeyIndex = index; c.call();