From cc5a757d7109c224cec4aeab797060fcca8960ab Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Fri, 7 Mar 2025 12:35:06 -0500 Subject: [PATCH] feat: add join space button to space list / navigation bar (#2071) * feat: add join space button to space list / navigation bar * chore: update join space icon --- assets/l10n/intl_en.arb | 4 +- lib/pages/chat_list/chat_list_body.dart | 13 ++- .../chat_list/client_chooser_button.dart | 18 ----- lib/pangea/spaces/utils/space_code.dart | 5 +- .../spaces/widgets/space_filter_buttons.dart | 80 +++++++++++++++++++ lib/widgets/navigation_rail.dart | 20 ++++- 6 files changed, 113 insertions(+), 27 deletions(-) create mode 100644 lib/pangea/spaces/widgets/space_filter_buttons.dart diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 3deefea0c..c2b9e60d3 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -4872,5 +4872,7 @@ } } }, - "knockSpaceSuccess": "You have requested to join this space! An admin will respond to your request when they receive it 😀" + "knockSpaceSuccess": "You have requested to join this space! An admin will respond to your request when they receive it 😀", + "joinByCode": "Join by code", + "createASpace": "Create a space" } diff --git a/lib/pages/chat_list/chat_list_body.dart b/lib/pages/chat_list/chat_list_body.dart index aac2ed307..831c12096 100644 --- a/lib/pages/chat_list/chat_list_body.dart +++ b/lib/pages/chat_list/chat_list_body.dart @@ -13,6 +13,7 @@ import 'package:fluffychat/pages/chat_list/search_title.dart'; import 'package:fluffychat/pages/chat_list/space_view.dart'; import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart'; import 'package:fluffychat/pangea/chat_list/widgets/pangea_chat_list_header.dart'; +import 'package:fluffychat/pangea/spaces/widgets/space_filter_buttons.dart'; import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -170,8 +171,9 @@ class ChatListViewBody extends StatelessWidget { ), ), ), - if (client.rooms.isNotEmpty && !controller.isSearchMode) - // #Pangea + // #Pangea + // if (client.rooms.isNotEmpty && !controller.isSearchMode) + if (!controller.isSearchMode) // SizedBox( // height: 64, // child: ListView( @@ -199,8 +201,7 @@ class ChatListViewBody extends StatelessWidget { // #Pangea // if (spaceDelegateCandidates.isNotEmpty && // !controller.widget.displayNavigationRail) - if (spaces.isNotEmpty && - !controller.widget.displayNavigationRail) + if (!controller.widget.displayNavigationRail) // Pangea# ActiveFilter.spaces, ] @@ -352,6 +353,10 @@ class ChatListViewBody extends StatelessWidget { ); }, ), + // #Pangea + if (controller.activeFilter == ActiveFilter.spaces) + const SpaceFilterButtons(), + // Pangea# ], ), ); diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index 2387f9788..6d3b5bce7 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -5,7 +5,6 @@ import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/pangea/learning_settings/pages/settings_learning.dart'; -import 'package:fluffychat/pangea/spaces/utils/space_code.dart'; import 'package:fluffychat/pangea/user/utils/p_logout.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -38,16 +37,6 @@ class ClientChooserButton extends StatelessWidget { // Pangea# return >[ // #Pangea - PopupMenuItem( - value: SettingsAction.joinWithClassCode, - child: Row( - children: [ - const Icon(Icons.join_full_outlined), - const SizedBox(width: 18), - Expanded(child: Text(L10n.of(context).joinWithClassCode)), - ], - ), - ), // PopupMenuItem( // value: SettingsAction.newGroup, // child: Row( @@ -294,12 +283,6 @@ class ClientChooserButton extends StatelessWidget { barrierDismissible: false, ); break; - case SettingsAction.joinWithClassCode: - SpaceCodeUtil.joinWithSpaceCodeDialog( - context, - MatrixState.pangeaController, - ); - break; case SettingsAction.logout: pLogoutAction(context); break; @@ -319,7 +302,6 @@ enum SettingsAction { settings, // #Pangea // archive, - joinWithClassCode, learning, logout, // Pangea# diff --git a/lib/pangea/spaces/utils/space_code.dart b/lib/pangea/spaces/utils/space_code.dart index b8b56b0e8..4b747fd6e 100644 --- a/lib/pangea/spaces/utils/space_code.dart +++ b/lib/pangea/spaces/utils/space_code.dart @@ -5,8 +5,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'; +import 'package:fluffychat/widgets/matrix.dart'; class SpaceCodeUtil { static const codeLength = 7; @@ -39,7 +39,6 @@ class SpaceCodeUtil { static Future joinWithSpaceCodeDialog( BuildContext context, - PangeaController pangeaController, ) async { final String? spaceCode = await showTextInputDialog( context: context, @@ -50,7 +49,7 @@ class SpaceCodeUtil { autoSubmit: true, ); if (spaceCode == null || spaceCode.isEmpty) return; - await pangeaController.classController.joinClasswithCode( + await MatrixState.pangeaController.classController.joinClasswithCode( context, spaceCode, ); diff --git a/lib/pangea/spaces/widgets/space_filter_buttons.dart b/lib/pangea/spaces/widgets/space_filter_buttons.dart new file mode 100644 index 000000000..4adfd369d --- /dev/null +++ b/lib/pangea/spaces/widgets/space_filter_buttons.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:go_router/go_router.dart'; + +import 'package:fluffychat/pangea/spaces/utils/space_code.dart'; + +class SpaceFilterButtons extends StatelessWidget { + const SpaceFilterButtons({super.key}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return SliverList( + delegate: SliverChildListDelegate( + [ + const SizedBox(height: 16.0), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 4.0, + ), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + padding: const EdgeInsets.all(0), + ), + onPressed: () => SpaceCodeUtil.joinWithSpaceCodeDialog(context), + child: Row( + spacing: 16.0, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.join_right_outlined, + color: theme.colorScheme.onPrimary, + ), + Text( + L10n.of(context).joinByCode, + style: theme.textTheme.bodyMedium?.copyWith( + color: theme.colorScheme.onPrimary, + ), + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 2.0, + ), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: theme.colorScheme.primary, + padding: const EdgeInsets.all(0), + ), + onPressed: () => context.go('/rooms/newspace'), + child: Row( + spacing: 16.0, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.add, + color: theme.colorScheme.onPrimary, + ), + Text( + L10n.of(context).createASpace, + style: theme.textTheme.bodyMedium?.copyWith( + color: theme.colorScheme.onPrimary, + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index 04be771e2..aaf662c3b 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -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/pages/chat_list/navi_rail_item.dart'; +import 'package:fluffychat/pangea/spaces/utils/space_code.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -58,7 +59,10 @@ class SpacesNavigationRail extends StatelessWidget { Expanded( child: ListView.builder( scrollDirection: Axis.vertical, - itemCount: rootSpaces.length + 2, + // #Pangea + // itemCount: rootSpaces.length + 2, + itemCount: rootSpaces.length + 3, + // Pangea# itemBuilder: (context, i) { if (i == 0) { return NaviRailItem( @@ -78,6 +82,20 @@ class SpacesNavigationRail extends StatelessWidget { } 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'),