From a5f1925f0374f0523d03345f8106c80a904f5dd5 Mon Sep 17 00:00:00 2001 From: Krille Fear Date: Mon, 15 Nov 2021 10:05:15 +0100 Subject: [PATCH] fix: Load spaces on app start --- lib/pages/chat_list/chat_list.dart | 19 +++-- lib/pages/chat_list/chat_list_view.dart | 7 +- lib/pages/chat_list/spaces_bottom_bar.dart | 81 ++++++++++++---------- 3 files changed, 60 insertions(+), 47 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 5d3677a9..e868c0e3 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -49,7 +49,10 @@ class ChatListController extends State { StreamSubscription _intentUriStreamSubscription; String _activeSpaceId; - String get activeSpaceId => _activeSpaceId; + String get activeSpaceId => + Matrix.of(context).client.getRoomById(_activeSpaceId) == null + ? null + : _activeSpaceId; final ScrollController scrollController = ScrollController(); bool scrolledToTop = true; @@ -160,11 +163,9 @@ class ChatListController extends State { @override void initState() { _initReceiveSharingIntent(); - WidgetsBinding.instance.addPostFrameCallback( - (_) => waitForFirstSync.then((_) => checkBootstrap()), - ); + scrollController.addListener(_onScroll); - waitForFirstSync = _waitForFirstSync(); + _waitForFirstSync(); super.initState(); } @@ -433,7 +434,7 @@ class ChatListController extends State { Matrix.of(context).client.getRoomById(roomId).pushRuleState == PushRuleState.notify); - Future waitForFirstSync; + bool waitForFirstSync = false; Future _waitForFirstSync() async { final client = Matrix.of(context).client; @@ -452,7 +453,11 @@ class ChatListController extends State { await space.requestParticipants(); } } - return true; + setState(() { + waitForFirstSync = true; + }); + WidgetsBinding.instance.addPostFrameCallback((_) => checkBootstrap()); + return; } void cancelAction() { diff --git a/lib/pages/chat_list/chat_list_view.dart b/lib/pages/chat_list/chat_list_view.dart index 83cae96a..66f2b0a5 100644 --- a/lib/pages/chat_list/chat_list_view.dart +++ b/lib/pages/chat_list/chat_list_view.dart @@ -221,10 +221,9 @@ class _ChatListViewBody extends StatelessWidget { .where((s) => s.hasRoomUpdate) .rateLimit(const Duration(seconds: 1)), builder: (context, snapshot) { - return FutureBuilder( - future: controller.waitForFirstSync, - builder: (BuildContext context, snapshot) { - if (snapshot.connectionState == ConnectionState.done) { + return Builder( + builder: (context) { + if (controller.waitForFirstSync) { final rooms = Matrix.of(context) .client .rooms diff --git a/lib/pages/chat_list/spaces_bottom_bar.dart b/lib/pages/chat_list/spaces_bottom_bar.dart index 9c10f87e..449d133c 100644 --- a/lib/pages/chat_list/spaces_bottom_bar.dart +++ b/lib/pages/chat_list/spaces_bottom_bar.dart @@ -6,6 +6,7 @@ import 'package:salomon_bottom_bar/salomon_bottom_bar.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/widgets/avatar.dart'; +import 'package:fluffychat/widgets/matrix.dart'; class SpacesBottomBar extends StatelessWidget { final ChatListController controller; @@ -21,42 +22,50 @@ class SpacesBottomBar extends StatelessWidget { return Material( color: Theme.of(context).appBarTheme.backgroundColor, elevation: 6, - child: SalomonBottomBar( - itemPadding: const EdgeInsets.all(8), - currentIndex: currentIndex, - onTap: (i) => controller.setActiveSpaceId( - context, - i == 0 ? null : controller.spaces[i - 1].id, - ), - selectedItemColor: Theme.of(context).colorScheme.primary, - items: [ - SalomonBottomBarItem( - icon: const Icon(CupertinoIcons.chat_bubble_2), - activeIcon: const Icon(CupertinoIcons.chat_bubble_2_fill), - title: Text(L10n.of(context).allChats), - ), - ...controller.spaces - .map((space) => SalomonBottomBarItem( - icon: InkWell( - borderRadius: BorderRadius.circular(28), - onTap: () => controller.setActiveSpaceId( - context, - space.id, - ), - onLongPress: () => - controller.editSpace(context, space.id), - child: Avatar( - space.avatar, - space.displayname, - size: 24, - fontSize: 12, - ), - ), - title: Text(space.displayname), - )) - .toList(), - ], - ), + child: StreamBuilder( + stream: Matrix.of(context).client.onSync.stream.where((sync) => + (sync.rooms?.join?.values?.any((r) => + r.state?.any((s) => s.type.startsWith('m.space'))) ?? + false) || + (sync.rooms?.leave?.isNotEmpty ?? false)), + builder: (context, snapshot) { + return SalomonBottomBar( + itemPadding: const EdgeInsets.all(8), + currentIndex: currentIndex, + onTap: (i) => controller.setActiveSpaceId( + context, + i == 0 ? null : controller.spaces[i - 1].id, + ), + selectedItemColor: Theme.of(context).colorScheme.primary, + items: [ + SalomonBottomBarItem( + icon: const Icon(CupertinoIcons.chat_bubble_2), + activeIcon: const Icon(CupertinoIcons.chat_bubble_2_fill), + title: Text(L10n.of(context).allChats), + ), + ...controller.spaces + .map((space) => SalomonBottomBarItem( + icon: InkWell( + borderRadius: BorderRadius.circular(28), + onTap: () => controller.setActiveSpaceId( + context, + space.id, + ), + onLongPress: () => + controller.editSpace(context, space.id), + child: Avatar( + space.avatar, + space.displayname, + size: 24, + fontSize: 12, + ), + ), + title: Text(space.displayname), + )) + .toList(), + ], + ); + }), ); } }