diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index 83f02df6..256784ec 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -80,9 +80,11 @@ class _ChatListViewBodyState extends State { .shouldShowStoriesHeader(context); child = ListView.builder( key: ValueKey(Matrix.of(context).client.userID.toString() + - widget.controller.activeSpaceId.toString()), + widget.controller.activeSpaceId.toString() + + widget.controller.activeSpacesEntry.runtimeType.toString()), controller: widget.controller.scrollController, - itemCount: rooms.length + (displayStoriesHeader ? 1 : 0), + // add +1 space below in order to properly scroll below the spaces bar + itemCount: rooms.length + (displayStoriesHeader ? 2 : 1), itemBuilder: (BuildContext context, int i) { if (displayStoriesHeader) { if (i == 0) { @@ -90,6 +92,9 @@ class _ChatListViewBodyState extends State { } i--; } + if (i >= rooms.length) { + return const ListTile(); + } return ChatListItem( rooms[i], selected: widget.controller.selectedRoomIds.contains(rooms[i].id), diff --git a/lib/pages/chat_list/spaces_bottom_bar.dart b/lib/pages/chat_list/spaces_bottom_bar.dart index b1f1dcf8..d5b812c2 100644 --- a/lib/pages/chat_list/spaces_bottom_bar.dart +++ b/lib/pages/chat_list/spaces_bottom_bar.dart @@ -94,11 +94,10 @@ class _SpacesBottomNavigation extends StatelessWidget { @override Widget build(BuildContext context) { - final currentIndex = controller.activeSpaceId == null - ? 1 - : controller.spaces - .indexWhere((space) => controller.activeSpaceId == space.id) + - 2; + final currentIndex = controller.spacesEntries.indexWhere((space) => + controller.activeSpacesEntry.runtimeType == space.runtimeType && + (controller.activeSpaceId == space.getSpace(context)?.id)) + + 1; return Container( height: 56, @@ -110,15 +109,10 @@ class _SpacesBottomNavigation extends StatelessWidget { currentIndex: currentIndex, onTap: (i) => i == 0 ? controller.expandSpaces() - : i == 1 - ? controller.setActiveSpacesEntry( - context, - null, - ) - : controller.setActiveSpacesEntry( - context, - controller.spacesEntries[i], - ), + : controller.setActiveSpacesEntry( + context, + controller.spacesEntries[i - 1], + ), selectedItemColor: Theme.of(context).colorScheme.primary, items: [ SalomonBottomBarItem( diff --git a/lib/pages/chat_list/spaces_drawer.dart b/lib/pages/chat_list/spaces_drawer.dart index 14d846b2..9feccf96 100644 --- a/lib/pages/chat_list/spaces_drawer.dart +++ b/lib/pages/chat_list/spaces_drawer.dart @@ -13,11 +13,9 @@ class SpacesDrawer extends StatelessWidget { @override Widget build(BuildContext context) { - final currentIndex = controller.activeSpaceId == null - ? 0 - : controller.spaces - .indexWhere((space) => controller.activeSpaceId == space.id) + - 1; + final currentIndex = controller.spacesEntries.indexWhere((space) => + controller.activeSpacesEntry.runtimeType == space.runtimeType && + (controller.activeSpaceId == space.getSpace(context)?.id)); final Map spaceHierarchy = Map.fromEntries(controller.spacesEntries.map((e) => MapEntry(e, null))); @@ -30,54 +28,46 @@ class SpacesDrawer extends StatelessWidget { return false; }, child: Column( - children: List.generate( - spaceHierarchy.length, - (index) { - if (index == 0) { - return ListTile( - selected: currentIndex == index, - leading: const Icon(Icons.keyboard_arrow_down), - title: Text(L10n.of(context)!.allChats), - onTap: () => controller.setActiveSpacesEntry( - context, - null, - ), - ); - } else { - final space = spaceHierarchy.keys.toList()[index]; - final room = space.getSpace(context)!; - return ListTile( - selected: currentIndex == index, - leading: Avatar( - mxContent: room.avatar, - name: space.getName(context), - size: 24, - fontSize: 12, - ), - title: Text(space.getName(context)), - subtitle: room.topic.isEmpty - ? null - : Tooltip( - message: room.topic, - child: Text( - room.topic.replaceAll('\n', ' '), - softWrap: false, - overflow: TextOverflow.fade, - ), + children: List.generate(spaceHierarchy.length, (index) { + final space = spaceHierarchy.keys.toList()[index]; + final room = space.getSpace(context); + final active = currentIndex == index; + return ListTile( + selected: active, + leading: index == 0 + ? const Icon(Icons.keyboard_arrow_down) + : room == null + ? space.getIcon(active) + : Avatar( + mxContent: room.avatar, + name: space.getName(context), + size: 24, + fontSize: 12, ), - onTap: () => controller.setActiveSpacesEntry( - context, - space, - ), - trailing: IconButton( - icon: const Icon(Icons.edit), - tooltip: L10n.of(context)!.edit, - onPressed: () => controller.editSpace(context, room.id), - ), - ); - } - }, - ), + title: Text(space.getName(context)), + subtitle: room?.topic.isEmpty ?? true + ? null + : Tooltip( + message: room!.topic, + child: Text( + room.topic.replaceAll('\n', ' '), + softWrap: false, + overflow: TextOverflow.fade, + ), + ), + onTap: () => controller.setActiveSpacesEntry( + context, + space, + ), + trailing: room != null + ? IconButton( + icon: const Icon(Icons.edit), + tooltip: L10n.of(context)!.edit, + onPressed: () => controller.editSpace(context, room.id), + ) + : null, + ); + }), ), ); }