From 7fd7ec2d7c2050804bf1d1cda31048f3adc895bf Mon Sep 17 00:00:00 2001 From: Kelrap Date: Wed, 5 Jun 2024 13:34:12 -0400 Subject: [PATCH] Add capacity option when creating room --- assets/l10n/intl_en.arb | 3 +- lib/pages/chat_details/chat_details.dart | 8 -- lib/pages/new_group/new_group.dart | 14 +- lib/pages/new_group/new_group_view.dart | 4 + lib/pages/new_space/new_space.dart | 8 ++ lib/pages/new_space/new_space_view.dart | 5 + .../p_class_widgets/room_capacity_button.dart | 131 +++++++++++------- 7 files changed, 109 insertions(+), 64 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 6f90f35d4..c41b23743 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -3967,5 +3967,6 @@ "roomCapacity": "Room Capacity", "roomFull": "This room is already at capacity.", "topicNotSet": "The topic has not been set.", - "capacityNotSet": "This room has no capacity limit." + "capacityNotSet": "This room has no capacity limit.", + "roomCapacityHasBeenChanged": "Room capacity changed" } \ No newline at end of file diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index 2089c9f79..e64b01bf0 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -4,7 +4,6 @@ import 'package:file_picker/file_picker.dart'; import 'package:fluffychat/pages/chat_details/chat_details_view.dart'; import 'package:fluffychat/pages/settings/settings.dart'; import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/class_description_button.dart'; -import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart'; import 'package:fluffychat/pangea/utils/set_class_name.dart'; import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart'; import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_settings.dart'; @@ -233,13 +232,6 @@ class ChatDetailsController extends State { // Pangea# } - // #Pangea - void setCapacityAction() async { - final room = Matrix.of(context).client.getRoomById(roomId!)!; - setClassCapacity(room, context); - } - // Pangea# - void setGuestAccess() async { final room = Matrix.of(context).client.getRoomById(roomId!)!; final currentGuestAccess = room.guestAccess; diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index 2ada80dfa..47b07b09d 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -3,8 +3,10 @@ import 'dart:typed_data'; import 'package:file_picker/file_picker.dart'; import 'package:fluffychat/pages/new_group/new_group_view.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; +import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; import 'package:fluffychat/pangea/models/chat_topic_model.dart'; import 'package:fluffychat/pangea/models/lemma.dart'; +import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; import 'package:fluffychat/pangea/utils/class_chat_power_levels.dart'; import 'package:fluffychat/pangea/utils/firebase_analytics.dart'; @@ -51,6 +53,8 @@ class NewGroupController extends State { final GlobalKey addToSpaceKey = GlobalKey(); final GlobalKey addConversationBotKey = GlobalKey(); + final GlobalKey addCapacityKey = + GlobalKey(); ChatTopic chatTopic = ChatTopic.empty; @@ -147,10 +151,16 @@ class NewGroupController extends State { visibility: sdk.Visibility.public, ); } - //#Pangea + // #Pangea GoogleAnalytics.createChat(roomId); await addToSpaceKey.currentState!.addSpaces(roomId); - //Pangea# + + final capacity = addCapacityKey.currentState?.capacity; + final room = client.getRoomById(roomId); + if (capacity != null && room != null) { + room.updateRoomCapacity(capacity); + } + // Pangea# context.go('/rooms/$roomId/invite'); } catch (e, s) { sdk.Logs().d('Unable to create group', e, s); diff --git a/lib/pages/new_group/new_group_view.dart b/lib/pages/new_group/new_group_view.dart index ced178038..ddf55dfbd 100644 --- a/lib/pages/new_group/new_group_view.dart +++ b/lib/pages/new_group/new_group_view.dart @@ -1,5 +1,6 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/pages/new_group/new_group.dart'; +import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart'; import 'package:fluffychat/pangea/widgets/class/add_class_and_invite.dart'; import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart'; import 'package:fluffychat/pangea/widgets/conversation_bot/conversation_bot_settings.dart'; @@ -87,6 +88,9 @@ class NewGroupView extends StatelessWidget { // ), // ), // ), + RoomCapacityButton( + key: controller.addCapacityKey, + ), ConversationBotSettings( key: controller.addConversationBotKey, activeSpaceId: controller.activeSpaceId, diff --git a/lib/pages/new_space/new_space.dart b/lib/pages/new_space/new_space.dart index 15420a4f5..eebc0074b 100644 --- a/lib/pages/new_space/new_space.dart +++ b/lib/pages/new_space/new_space.dart @@ -5,6 +5,7 @@ import 'package:fluffychat/pages/new_space/new_space_view.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart'; import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; import 'package:fluffychat/pangea/utils/class_chat_power_levels.dart'; @@ -38,6 +39,8 @@ class NewSpaceController extends State { final GlobalKey addToSpaceKey = GlobalKey(); final GlobalKey classSettingsKey = GlobalKey(); + final GlobalKey addCapacityKey = + GlobalKey(); //Pangea# bool loading = false; @@ -200,6 +203,11 @@ class NewSpaceController extends State { } await Future.wait(futures); + final capacity = addCapacityKey.currentState?.capacity; + final space = client.getRoomById(spaceId); + if (capacity != null && space != null) { + space.updateRoomCapacity(capacity); + } final newChatRoomId = await Matrix.of(context).client.createGroupChat( enableEncryption: false, preset: sdk.CreateRoomPreset.publicChat, diff --git a/lib/pages/new_space/new_space_view.dart b/lib/pages/new_space/new_space_view.dart index a0a4d0927..09abb7066 100644 --- a/lib/pages/new_space/new_space_view.dart +++ b/lib/pages/new_space/new_space_view.dart @@ -1,6 +1,7 @@ import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/extensions/client_extension/client_extension.dart'; import 'package:fluffychat/pangea/models/class_model.dart'; +import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart'; import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart'; import 'package:fluffychat/pangea/widgets/class/add_class_and_invite.dart'; import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart'; @@ -130,6 +131,10 @@ class NewSpaceView extends StatelessWidget { // ), // ), // const SizedBox(height: 16), + + RoomCapacityButton( + key: controller.addCapacityKey, + ), if (controller.newClassMode) ClassSettings( key: controller.classSettingsKey, diff --git a/lib/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart b/lib/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart index 03210aa3d..7c66dfa83 100644 --- a/lib/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart +++ b/lib/pangea/pages/class_settings/p_class_widgets/room_capacity_button.dart @@ -6,24 +6,43 @@ import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:matrix/matrix.dart'; -class RoomCapacityButton extends StatelessWidget { - final Room room; +class RoomCapacityButton extends StatefulWidget { + final Room? room; final ChatDetailsController? controller; const RoomCapacityButton({ super.key, - required this.room, + this.room, this.controller, }); + @override + RoomCapacityButtonState createState() => RoomCapacityButtonState(); +} + +class RoomCapacityButtonState extends State { + Room? room; + ChatDetailsController? controller; + String? capacity; + + RoomCapacityButtonState({Key? key}); + + @override + void initState() { + super.initState(); + room = widget.room; + controller = widget.controller; + } + @override Widget build(BuildContext context) { final iconColor = Theme.of(context).textTheme.bodyLarge!.color; // Edit - use FutureBuilder to allow async call - // String nonAdmins = (await room.numNonAdmins).toString; + // String nonAdmins = (await room.numNonAdmins).toString(); return Column( children: [ ListTile( - onTap: room.isRoomAdmin ? controller!.setCapacityAction : null, + onTap: () => + ((room?.isRoomAdmin ?? true) ? (setClassCapacity()) : null), leading: CircleAvatar( backgroundColor: Theme.of(context).scaffoldBackgroundColor, foregroundColor: iconColor, @@ -32,7 +51,7 @@ class RoomCapacityButton extends StatelessWidget { subtitle: Text( // Edit // '$nonAdmins/${room.capacity}', - (room.capacity ?? L10n.of(context)!.capacityNotSet), + (room?.capacity ?? capacity ?? L10n.of(context)!.capacityNotSet), ), title: Text( L10n.of(context)!.roomCapacity, @@ -45,54 +64,60 @@ class RoomCapacityButton extends StatelessWidget { ], ); } -} -void setClassCapacity(Room room, BuildContext context) { - final TextEditingController myTextFieldController = - TextEditingController(text: (room.capacity ?? '')); - showDialog( - context: context, - useRootNavigator: false, - builder: (BuildContext context) => AlertDialog( - title: Text( - L10n.of(context)!.roomCapacity, - ), - content: TextFormField( - controller: myTextFieldController, - keyboardType: TextInputType.number, - maxLength: 2, - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, + Future setCapacity(String newCapacity) async { + capacity = newCapacity; + } + + Future setClassCapacity() async { + final TextEditingController myTextFieldController = + TextEditingController(text: (room?.capacity ?? capacity ?? '')); + showDialog( + context: context, + useRootNavigator: false, + builder: (BuildContext context) => AlertDialog( + title: Text( + L10n.of(context)!.roomCapacity, + ), + content: TextFormField( + controller: myTextFieldController, + keyboardType: TextInputType.number, + maxLength: 3, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + ], + ), + actions: [ + TextButton( + child: Text(L10n.of(context)!.cancel), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + TextButton( + child: Text(L10n.of(context)!.ok), + onPressed: () async { + if (myTextFieldController.text == "") return; + final success = await showFutureLoadingDialog( + context: context, + future: () => ((room != null) + ? (room!.updateRoomCapacity(myTextFieldController.text)) + : setCapacity(myTextFieldController.text)), + ); + if (success.error == null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + L10n.of(context)!.roomCapacityHasBeenChanged, + ), + ), + ); + Navigator.of(context).pop(); + } + }, + ), ], ), - actions: [ - TextButton( - child: Text(L10n.of(context)!.cancel), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - TextButton( - child: Text(L10n.of(context)!.ok), - onPressed: () async { - if (myTextFieldController.text == "") return; - final success = await showFutureLoadingDialog( - context: context, - future: () => room.updateRoomCapacity(myTextFieldController.text), - ); - if (success.error == null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - L10n.of(context)!.groupDescriptionHasBeenChanged, - ), // Edit - ), - ); - Navigator.of(context).pop(); - } - }, - ), - ], - ), - ); + ); + } }