diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 1b647b2ae..e7fb1d376 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -653,6 +653,9 @@ abstract class AppRoutes { state, ChatMembersPage( roomId: state.pathParameters['roomid']!, + // #Pangea + filter: state.uri.queryParameters['filter'], + // Pangea# ), ), redirect: loggedOutRedirect, diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 09c40f998..813eb9c76 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -5017,5 +5017,15 @@ "newDirectMessage": "New direct message", "speakingExercisesTooltip": "Speaking practice", "noChatsFoundHereYet": "No chats found here yet", - "transcriptionFailed": "Failed to transcribe audio" + "transcriptionFailed": "Failed to transcribe audio", + "aUserIsKnocking": "1 user is requesting to join your space", + "usersAreKnocking": "{users} users are requesting to join your space", + "@usersAreKnocking": { + "type": "int", + "placeholders": { + "users": { + "type": "int" + } + } + } } \ No newline at end of file diff --git a/lib/pages/chat_members/chat_members.dart b/lib/pages/chat_members/chat_members.dart index 6376a9b2c..8fd3df8be 100644 --- a/lib/pages/chat_members/chat_members.dart +++ b/lib/pages/chat_members/chat_members.dart @@ -9,8 +9,18 @@ import 'chat_members_view.dart'; class ChatMembersPage extends StatefulWidget { final String roomId; + // #Pangea + final String? filter; + // Pangea# - const ChatMembersPage({required this.roomId, super.key}); + // #Pangea + // const ChatMembersPage({required this.roomId, super.key}); + const ChatMembersPage({ + required this.roomId, + this.filter, + super.key, + }); + // Pangea# @override State createState() => ChatMembersController(); @@ -24,6 +34,22 @@ class ChatMembersController extends State { final TextEditingController filterController = TextEditingController(); + // #Pangea + @override + void didUpdateWidget(ChatMembersPage oldWidget) { + super.didUpdateWidget(oldWidget); + // Update the membership filter if the widget's filter changes + if (oldWidget.filter != widget.filter) { + setState(() { + membershipFilter = Membership.values.firstWhere( + (membership) => membership.name == widget.filter, + orElse: () => Membership.join, + ); + }); + } + } + // Pangea# + void setMembershipFilter(Membership membership) { membershipFilter = membership; setFilter(); @@ -110,6 +136,15 @@ class ChatMembersController extends State { false, ) .listen(refreshMembers); + + // #Pangea + if (widget.filter != null) { + membershipFilter = Membership.values.firstWhere( + (membership) => membership.name == widget.filter, + orElse: () => Membership.join, + ); + } + // Pangea# } @override diff --git a/lib/pangea/spaces/widgets/knocking_users_indicator.dart b/lib/pangea/spaces/widgets/knocking_users_indicator.dart index 76cc30959..b40519584 100644 --- a/lib/pangea/spaces/widgets/knocking_users_indicator.dart +++ b/lib/pangea/spaces/widgets/knocking_users_indicator.dart @@ -7,6 +7,7 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/themes.dart'; +import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/utils/stream_extension.dart'; @@ -89,15 +90,16 @@ class KnockingUsersIndicatorState extends State { Expanded( child: Text( _knockingUsers.length == 1 - ? "1 user is requesting to join your space" - : "${_knockingUsers.length} users are requesting to join your space", + ? L10n.of(context).aUserIsKnocking + : L10n.of(context) + .usersAreKnocking(_knockingUsers.length), style: Theme.of(context).textTheme.bodyMedium, ), ), ], ), onTap: () => context.push( - "/rooms/${widget.room.id}/details/members", + "/rooms/${widget.room.id}/details/members?filter=knock", ), ), ), diff --git a/lib/pangea/spaces/widgets/leaderboard_participant_list.dart b/lib/pangea/spaces/widgets/leaderboard_participant_list.dart index 347d12cd2..c9906cea9 100644 --- a/lib/pangea/spaces/widgets/leaderboard_participant_list.dart +++ b/lib/pangea/spaces/widgets/leaderboard_participant_list.dart @@ -48,7 +48,10 @@ class LeaderboardParticipantListState return LoadParticipantsUtil( space: widget.space, builder: (participantsLoader) { - final participants = participantsLoader.filteredParticipants(""); + final participants = participantsLoader + .filteredParticipants("") + .where((p) => p.membership == Membership.join) + .toList(); return AnimatedSize( duration: FluffyThemes.animationDuration, diff --git a/lib/widgets/presence_builder.dart b/lib/widgets/presence_builder.dart index 2f1a66d77..4332485ab 100644 --- a/lib/widgets/presence_builder.dart +++ b/lib/widgets/presence_builder.dart @@ -48,6 +48,24 @@ class _PresenceBuilderState extends State { } } + // #Pangea + @override + void didUpdateWidget(PresenceBuilder oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.userId == widget.userId) return; + + final client = widget.client ?? Matrix.of(context).client; + final userId = widget.userId; + if (userId != null) { + client.fetchCurrentPresence(userId).then(_updatePresence); + _sub?.cancel(); + _sub = client.onPresenceChanged.stream + .where((presence) => presence.userid == userId) + .listen(_updatePresence); + } + } + // Pangea# + @override void dispose() { _sub?.cancel();