diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index 7ae9665b5..c00e31b5b 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -42,158 +42,164 @@ class SpacesNavigationRail extends StatelessWidget { .path .contains('homepage'); final isColumnMode = FluffyThemes.isColumnMode(context); - // Pangea# - return StreamBuilder( - key: ValueKey( - client.userID.toString(), - ), - stream: client.onSync.stream - .where((s) => s.hasRoomUpdate) - .rateLimit(const Duration(seconds: 1)), - builder: (context, _) { - final allSpaces = client.rooms.where((room) => room.isSpace); - final rootSpaces = allSpaces - .where( - (space) => !allSpaces.any( - (parentSpace) => parentSpace.spaceChildren - .any((child) => child.roomId == space.id), - ), - ) - .toList(); - - return SizedBox( - // #Pangea - // width: FluffyThemes.navRailWidth, - width: isColumnMode - ? FluffyThemes.navRailWidth - : FluffyThemes.navRailWidth * 0.75, + // return StreamBuilder( + return Material( + child: SafeArea( + child: StreamBuilder( // Pangea# - child: Column( - children: [ - Expanded( - child: ListView.builder( - scrollDirection: Axis.vertical, - // #Pangea - // itemCount: rootSpaces.length + 2, - itemCount: rootSpaces.length + 4, - // Pangea# - itemBuilder: (context, i) { - // #Pangea - if (i == 0) { - return NaviRailItem( - isSelected: isColumnMode - ? activeSpaceId == null && !isSettings - : isHomepage, - onTap: () => isColumnMode - ? onGoToChats() - : context.go("/rooms/homepage"), - icon: const Padding( - padding: EdgeInsets.all(10.0), - child: Icon(Icons.home_outlined), - ), - selectedIcon: const Padding( - padding: EdgeInsets.all(10.0), - child: Icon(Icons.home), - ), - toolTip: L10n.of(context).home, - unreadBadgeFilter: (room) => true, - ); - } - i--; - // Pangea# - if (i == 0) { - return isColumnMode - ? const SizedBox() - : NaviRailItem( - // #Pangea - // isSelected: activeSpaceId == null && !isSettings, - isSelected: activeSpaceId == null && - !isSettings && - !isHomepage, - // Pangea# - onTap: onGoToChats, - icon: const Padding( - padding: EdgeInsets.all(10.0), - child: Icon(Icons.forum_outlined), - ), - selectedIcon: const Padding( - padding: EdgeInsets.all(10.0), - child: Icon(Icons.forum), - ), - toolTip: L10n.of(context).chats, - unreadBadgeFilter: (room) => true, - ); - } - i--; - if (i == rootSpaces.length) { - // #Pangea - return NaviRailItem( - isSelected: false, - onTap: () => - SpaceCodeUtil.joinWithSpaceCodeDialog(context), - icon: const Padding( - padding: EdgeInsets.all(8.0), - child: Icon(Icons.join_right_outlined), - ), - toolTip: L10n.of(context).joinByCode, - ); - } - if (i == rootSpaces.length + 1) { - // Pangea# - return NaviRailItem( - isSelected: false, - onTap: () => context.go('/rooms/newspace'), - icon: const Padding( - padding: EdgeInsets.all(8.0), - child: Icon(Icons.add), - ), - toolTip: L10n.of(context).createNewSpace, - ); - } - final space = rootSpaces[i]; - final displayname = rootSpaces[i].getLocalizedDisplayname( - MatrixLocals(L10n.of(context)), - ); - final spaceChildrenIds = - space.spaceChildren.map((c) => c.roomId).toSet(); - return NaviRailItem( - toolTip: displayname, - isSelected: activeSpaceId == space.id, - onTap: () => onGoToSpaceId(rootSpaces[i].id), - unreadBadgeFilter: (room) => - spaceChildrenIds.contains(room.id), - icon: Avatar( - mxContent: rootSpaces[i].avatar, - name: displayname, - border: BorderSide( - width: 1, - color: Theme.of(context).dividerColor, - ), - borderRadius: BorderRadius.circular( - AppConfig.borderRadius / 2, - ), - ), - ); - }, - ), - ), - NaviRailItem( - isSelected: isSettings, - onTap: () => context.go('/rooms/settings'), - icon: const Padding( - padding: EdgeInsets.all(10.0), - child: Icon(Icons.settings_outlined), - ), - selectedIcon: const Padding( - padding: EdgeInsets.all(10.0), - child: Icon(Icons.settings), - ), - toolTip: L10n.of(context).settings, - ), - ], + key: ValueKey( + client.userID.toString(), ), - ); - }, + stream: client.onSync.stream + .where((s) => s.hasRoomUpdate) + .rateLimit(const Duration(seconds: 1)), + builder: (context, _) { + final allSpaces = client.rooms.where((room) => room.isSpace); + final rootSpaces = allSpaces + .where( + (space) => !allSpaces.any( + (parentSpace) => parentSpace.spaceChildren + .any((child) => child.roomId == space.id), + ), + ) + .toList(); + + return SizedBox( + // #Pangea + // width: FluffyThemes.navRailWidth, + width: isColumnMode + ? FluffyThemes.navRailWidth + : FluffyThemes.navRailWidth * 0.75, + // Pangea# + child: Column( + children: [ + Expanded( + child: ListView.builder( + scrollDirection: Axis.vertical, + // #Pangea + // itemCount: rootSpaces.length + 2, + itemCount: rootSpaces.length + 4, + // Pangea# + itemBuilder: (context, i) { + // #Pangea + if (i == 0) { + return NaviRailItem( + isSelected: isColumnMode + ? activeSpaceId == null && !isSettings + : isHomepage, + onTap: () => isColumnMode + ? onGoToChats() + : context.go("/rooms/homepage"), + icon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.home_outlined), + ), + selectedIcon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.home), + ), + toolTip: L10n.of(context).home, + unreadBadgeFilter: (room) => true, + ); + } + i--; + // Pangea# + if (i == 0) { + return isColumnMode + ? const SizedBox() + : NaviRailItem( + // #Pangea + // isSelected: activeSpaceId == null && !isSettings, + isSelected: activeSpaceId == null && + !isSettings && + !isHomepage, + // Pangea# + onTap: onGoToChats, + icon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.forum_outlined), + ), + selectedIcon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.forum), + ), + toolTip: L10n.of(context).chats, + unreadBadgeFilter: (room) => true, + ); + } + i--; + if (i == rootSpaces.length) { + // #Pangea + return NaviRailItem( + isSelected: false, + onTap: () => + SpaceCodeUtil.joinWithSpaceCodeDialog(context), + icon: const Padding( + padding: EdgeInsets.all(8.0), + child: Icon(Icons.join_right_outlined), + ), + toolTip: L10n.of(context).joinByCode, + ); + } + if (i == rootSpaces.length + 1) { + // Pangea# + return NaviRailItem( + isSelected: false, + onTap: () => context.go('/rooms/newspace'), + icon: const Padding( + padding: EdgeInsets.all(8.0), + child: Icon(Icons.add), + ), + toolTip: L10n.of(context).createNewSpace, + ); + } + final space = rootSpaces[i]; + final displayname = + rootSpaces[i].getLocalizedDisplayname( + MatrixLocals(L10n.of(context)), + ); + final spaceChildrenIds = + space.spaceChildren.map((c) => c.roomId).toSet(); + return NaviRailItem( + toolTip: displayname, + isSelected: activeSpaceId == space.id, + onTap: () => onGoToSpaceId(rootSpaces[i].id), + unreadBadgeFilter: (room) => + spaceChildrenIds.contains(room.id), + icon: Avatar( + mxContent: rootSpaces[i].avatar, + name: displayname, + border: BorderSide( + width: 1, + color: Theme.of(context).dividerColor, + ), + borderRadius: BorderRadius.circular( + AppConfig.borderRadius / 2, + ), + ), + ); + }, + ), + ), + NaviRailItem( + isSelected: isSettings, + onTap: () => context.go('/rooms/settings'), + icon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.settings_outlined), + ), + selectedIcon: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.settings), + ), + toolTip: L10n.of(context).settings, + ), + ], + ), + ); + }, + ), + ), ); } }