Merge pull request #3094 from pangeachat/3087-participants-shown-instead-of-knocking-people

chore: update presence avatar when user ID changes, go right to knock…
This commit is contained in:
ggurdin 2025-06-17 09:33:32 -04:00 committed by GitHub
commit cc5691952d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 77 additions and 6 deletions

View file

@ -653,6 +653,9 @@ abstract class AppRoutes {
state,
ChatMembersPage(
roomId: state.pathParameters['roomid']!,
// #Pangea
filter: state.uri.queryParameters['filter'],
// Pangea#
),
),
redirect: loggedOutRedirect,

View file

@ -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"
}
}
}
}

View file

@ -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<ChatMembersPage> createState() => ChatMembersController();
@ -24,6 +34,22 @@ class ChatMembersController extends State<ChatMembersPage> {
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<ChatMembersPage> {
false,
)
.listen(refreshMembers);
// #Pangea
if (widget.filter != null) {
membershipFilter = Membership.values.firstWhere(
(membership) => membership.name == widget.filter,
orElse: () => Membership.join,
);
}
// Pangea#
}
@override

View file

@ -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<KnockingUsersIndicator> {
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",
),
),
),

View file

@ -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,

View file

@ -48,6 +48,24 @@ class _PresenceBuilderState extends State<PresenceBuilder> {
}
}
// #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();