diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index e4a8c8392..803bf11cb 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -291,6 +291,19 @@ class ChatController extends State } } + Future _requestParticipants() async { + if (room == null) return; + try { + await room!.requestParticipants( + at: room!.prev_batch, + notMembership: Membership.leave, + ); + } catch (e) { + Logs() + .e('Chat::_requestParticipants(): Failed to request participants', e); + } + } + bool isUnpinEvent(Event event) => room?.pinnedEventIds .firstWhereOrNull((eventId) => eventId == event.eventId) != @@ -1995,13 +2008,14 @@ class ChatController extends State _tryLoadTimeline(); sendController.addListener(updateInputTextNotifier); super.initState(); - SchedulerBinding.instance.addPostFrameCallback((_) { + SchedulerBinding.instance.addPostFrameCallback((_) async { if (room == null) { return context.go("/error"); } _handleReceivedShareFiles(); _listenRoomUpdateEvent(); initCachedPresence(); + await _requestParticipants(); }); } diff --git a/lib/pages/chat_details/chat_details_page_view/chat_details_members_page.dart b/lib/pages/chat_details/chat_details_page_view/chat_details_members_page.dart index 45bc7f1c8..fd6f90057 100644 --- a/lib/pages/chat_details/chat_details_page_view/chat_details_members_page.dart +++ b/lib/pages/chat_details/chat_details_page_view/chat_details_members_page.dart @@ -7,21 +7,19 @@ import 'package:matrix/matrix.dart'; class ChatDetailsMembersPage extends StatelessWidget { static const int addMemberItemCount = 1; - final ValueNotifier?> membersNotifier; + final ValueNotifier?> displayMembersNotifier; final int actualMembersCount; final VoidCallback openDialogInvite; final VoidCallback requestMoreMembersAction; final VoidCallback? onUpdatedMembers; - final bool canRequestMoreMembers; final bool isMobileAndTablet; const ChatDetailsMembersPage({ super.key, - required this.membersNotifier, + required this.displayMembersNotifier, required this.actualMembersCount, required this.openDialogInvite, required this.requestMoreMembersAction, - required this.canRequestMoreMembers, required this.isMobileAndTablet, this.onUpdatedMembers, }); @@ -29,9 +27,10 @@ class ChatDetailsMembersPage extends StatelessWidget { @override Widget build(BuildContext context) { return ValueListenableBuilder( - valueListenable: membersNotifier, + valueListenable: displayMembersNotifier, builder: (context, members, child) { members ??= []; + final canRequestMoreMembers = members.length < actualMembersCount; return Column( children: [ Expanded( diff --git a/lib/presentation/mixins/chat_details_tab_mixin.dart b/lib/presentation/mixins/chat_details_tab_mixin.dart index 739011015..70799b161 100644 --- a/lib/presentation/mixins/chat_details_tab_mixin.dart +++ b/lib/presentation/mixins/chat_details_tab_mixin.dart @@ -14,7 +14,6 @@ import 'package:fluffychat/presentation/mixins/handle_video_download_mixin.dart' import 'package:fluffychat/presentation/mixins/play_video_action_mixin.dart'; import 'package:fluffychat/presentation/model/chat_details/chat_details_page_model.dart'; import 'package:fluffychat/presentation/same_type_events_builder/same_type_events_controller.dart'; -import 'package:fluffychat/utils/dialog/twake_dialog.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/responsive/responsive_utils.dart'; @@ -36,6 +35,9 @@ mixin ChatDetailsTabMixin final ValueNotifier?> _membersNotifier = ValueNotifier(null); + final ValueNotifier?> _displayMembersNotifier = + ValueNotifier(null); + late final List tabList; Room? get room; @@ -59,6 +61,8 @@ mixin ChatDetailsTabMixin static const _mediaFetchLimit = 20; static const _linksFetchLimit = 20; static const _filesFetchLimit = 20; + static const _maxMembers = 30; + int _currentMembersCount = _maxMembers; static const _memberPageKey = PageStorageKey('members'); static const _mediaPageKey = PageStorageKey('media'); @@ -109,11 +113,36 @@ mixin ChatDetailsTabMixin } void _requestMoreMembersAction() async { - final participants = await TwakeDialog.showFutureLoadingDialogFullScreen( - future: () => room!.requestParticipants(), - ); - if (participants.error == null) { - _membersNotifier.value = participants.result; + final currentMembersCount = _displayMembersNotifier.value?.length ?? 0; + _currentMembersCount += _maxMembers; + + final members = _membersNotifier.value; + if (members != null && currentMembersCount < members.length) { + final endIndex = _currentMembersCount > members.length + ? members.length + : _currentMembersCount; + final newMembers = members.sublist(currentMembersCount, endIndex); + _displayMembersNotifier.value = [ + ...?_displayMembersNotifier.value, + ...newMembers, + ]; + } else { + _displayMembersNotifier.value = [ + ...?_displayMembersNotifier.value, + ...?members, + ]; + } + } + + void _initDisplayMembers() { + final members = _membersNotifier.value; + if (members != null && members.isNotEmpty) { + final endIndex = _currentMembersCount > members.length + ? members.length + : _currentMembersCount; + _displayMembersNotifier.value = members.sublist(0, endIndex); + } else { + _displayMembersNotifier.value = []; } } @@ -188,6 +217,7 @@ mixin ChatDetailsTabMixin void _initMembers() { if (chatType == ChatDetailsScreenEnum.group) { _membersNotifier.value ??= room?.getParticipants(); + _initDisplayMembers(); } } @@ -236,10 +266,8 @@ mixin ChatDetailsTabMixin page: page, child: ChatDetailsMembersPage( key: _memberPageKey, - membersNotifier: _membersNotifier, + displayMembersNotifier: _displayMembersNotifier, actualMembersCount: actualMembersCount, - canRequestMoreMembers: - (_membersNotifier.value?.length ?? 0) < actualMembersCount, requestMoreMembersAction: _requestMoreMembersAction, openDialogInvite: _openDialogInvite, isMobileAndTablet: isMobileAndTablet, @@ -308,6 +336,7 @@ mixin ChatDetailsTabMixin void dispose() { _disposeControllers(); _membersNotifier.dispose(); + _displayMembersNotifier.dispose(); _onRoomEventChangedSubscription?.cancel(); nestedScrollViewState.currentState?.innerController.dispose(); super.dispose(); diff --git a/pubspec.lock b/pubspec.lock index 4ef743147..8a4664a89 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1876,8 +1876,8 @@ packages: dependency: "direct main" description: path: "." - ref: "twake-supported-0.22.6" - resolved-ref: "04ec6f3b9ece8e64e031cbe5c6e8164dc2ec7f2d" + ref: TW-2165-support-store-members-in-local-database + resolved-ref: "14fd0ce7745f4e4fdb3d1c982e76a6fb7c12819e" url: "git@github.com:linagora/matrix-dart-sdk.git" source: git version: "0.22.6" diff --git a/pubspec.yaml b/pubspec.yaml index c719deb07..c5b3450a8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: matrix: git: url: git@github.com:linagora/matrix-dart-sdk.git - ref: twake-supported-0.22.6 + ref: TW-2165-support-store-members-in-local-database receive_sharing_intent: git: