From a37bd658fc3726b84d87bc18be568d25ffda739f Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Tue, 3 Mar 2026 16:27:19 -0500 Subject: [PATCH] feat: join invite-from-knock rooms on launch app via notification, add custom invite reason for invite-on-knock to trigger custom content in background notifications (#5877) --- .../join_codes/knock_room_extension.dart | 4 ++++ lib/utils/background_push.dart | 24 +++++++++++++------ .../member_actions_popup_menu_button.dart | 6 ++++- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/lib/pangea/join_codes/knock_room_extension.dart b/lib/pangea/join_codes/knock_room_extension.dart index 1b3bb356a..ebf4b9bf1 100644 --- a/lib/pangea/join_codes/knock_room_extension.dart +++ b/lib/pangea/join_codes/knock_room_extension.dart @@ -14,6 +14,10 @@ extension KnockRoomExtension on Room { await join(); await client.onJoinKnockedRoom(id); } + + Future acceptKnock(String userID) async { + await invite(userID, reason: "invite_on_knock"); + } } extension KnockClientExtension on Client { diff --git a/lib/utils/background_push.dart b/lib/utils/background_push.dart index cd00e9583..f2c4b18b3 100644 --- a/lib/utils/background_push.dart +++ b/lib/utils/background_push.dart @@ -38,6 +38,7 @@ import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/main.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/common/utils/firebase_analytics.dart'; +import 'package:fluffychat/pangea/join_codes/knock_room_extension.dart'; import 'package:fluffychat/pangea/languages/language_constants.dart'; import 'package:fluffychat/utils/notification_background_handler.dart'; import 'package:fluffychat/utils/push_helper.dart'; @@ -199,12 +200,12 @@ class BackgroundPush { // #Pangea // Helper to ensure a room is loaded or synced. - Future _ensureRoomLoaded(String id) async { + Future _ensureRoomLoaded(String id, {Membership? membership}) async { await client.roomsLoading; await client.accountDataLoading; var room = client.getRoomById(id); - if (room == null) { + if (room == null || (membership != null && room.membership != membership)) { await client.waitForRoomInSync(id).timeout(const Duration(seconds: 30)); room = client.getRoomById(id); } @@ -217,15 +218,14 @@ class BackgroundPush { String? sessionRoomId, String? activityId, }) async { + Room? room = await _ensureRoomLoaded(roomId); // Handle session room if provided. if (sessionRoomId != null && sessionRoomId.isNotEmpty && activityId != null && activityId.isNotEmpty) { try { - final course = await _ensureRoomLoaded(roomId); - if (course == null) return; - + if (room == null) return; final session = client.getRoomById(sessionRoomId); if (session?.membership == Membership.join) { FluffyChatApp.router.go('/rooms/$sessionRoomId'); @@ -243,9 +243,19 @@ class BackgroundPush { // Fallback: just open the original room. try { - final room = await _ensureRoomLoaded(roomId); + final hasKnocked = room?.hasKnocked; + if (hasKnocked == true) { + await room!.joinKnockedRoom(); + room = await _ensureRoomLoaded(roomId, membership: Membership.join); + } + + if (room == null || room.membership == Membership.invite) { + FluffyChatApp.router.go('/rooms'); + return; + } + FluffyChatApp.router.go( - room?.membership == Membership.invite ? '/rooms' : '/rooms/$roomId', + room.isSpace ? '/rooms/spaces/$roomId' : '/rooms/$roomId', ); } catch (err, s) { ErrorHandler.logError(e: err, s: s, data: {"roomId": roomId}); diff --git a/lib/widgets/member_actions_popup_menu_button.dart b/lib/widgets/member_actions_popup_menu_button.dart index 53ba5fb32..b0247fab9 100644 --- a/lib/widgets/member_actions_popup_menu_button.dart +++ b/lib/widgets/member_actions_popup_menu_button.dart @@ -8,6 +8,7 @@ import 'package:fluffychat/pangea/analytics_misc/level_display_name.dart'; import 'package:fluffychat/pangea/bot/utils/bot_name.dart'; import 'package:fluffychat/pangea/bot/widgets/bot_chat_settings_dialog.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/join_codes/knock_room_extension.dart'; import 'package:fluffychat/pangea/user/about_me_display.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/permission_slider_dialog.dart'; @@ -316,7 +317,10 @@ void showMemberActionsPopupMenu({ case _MemberActions.approve: await showFutureLoadingDialog( context: context, - future: () => user.room.invite(user.id), + // #Pangea + // future: () => user.room.invite(user.id), + future: () => user.room.acceptKnock(user.id), + // Pangea# ); return; case _MemberActions.kick: