Fix some capacity enforcement bugs

pull/1183/head
Kelrap 1 year ago
parent 7fd7ec2d7c
commit db61c1f1cf

@ -3968,5 +3968,6 @@
"roomFull": "This room is already at capacity.", "roomFull": "This room is already at capacity.",
"topicNotSet": "The topic has not been set.", "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" "roomCapacityHasBeenChanged": "Room capacity changed",
"roomExceedsCapacity": "Room exceeds capacity. Consider removing students from the room, or raising the capacity."
} }

@ -209,6 +209,15 @@ class _SpaceViewState extends State<SpaceView> {
await waitForRoom; await waitForRoom;
}, },
); );
if (await room.leaveIfFull()) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 10),
content: Text(L10n.of(context)!.roomFull),
),
);
return;
}
if (joinResult.error != null) return; if (joinResult.error != null) return;
} }
// Pangea# // Pangea#
@ -242,7 +251,10 @@ class _SpaceViewState extends State<SpaceView> {
), ),
message: spaceChild?.topic ?? room?.topic, message: spaceChild?.topic ?? room?.topic,
actions: [ actions: [
if (room == null) // #Pangea
// if (room == null)
if (room == null || room.membership == Membership.leave)
// Pangea#
SheetAction( SheetAction(
key: SpaceChildContextAction.join, key: SpaceChildContextAction.join,
label: L10n.of(context)!.joinRoom, label: L10n.of(context)!.joinRoom,
@ -275,8 +287,9 @@ class _SpaceViewState extends State<SpaceView> {
: L10n.of(context)!.archive, : L10n.of(context)!.archive,
icon: Icons.architecture_outlined, icon: Icons.architecture_outlined,
), ),
// Pangea# // if (room != null)
if (room != null) if (room != null && room.membership != Membership.leave)
// Pangea#
SheetAction( SheetAction(
key: SpaceChildContextAction.leave, key: SpaceChildContextAction.leave,
label: L10n.of(context)!.leave, label: L10n.of(context)!.leave,
@ -321,7 +334,7 @@ class _SpaceViewState extends State<SpaceView> {
case SpaceChildContextAction.archive: case SpaceChildContextAction.archive:
widget.controller.cancelAction(); widget.controller.cancelAction();
// #Pangea // #Pangea
if (room == null) return; if (room == null || room.membership == Membership.leave) return;
// Pangea# // Pangea#
widget.controller.toggleSelection(room.id); widget.controller.toggleSelection(room.id);
room.isSpace room.isSpace
@ -341,7 +354,7 @@ class _SpaceViewState extends State<SpaceView> {
case SpaceChildContextAction.addToSpace: case SpaceChildContextAction.addToSpace:
widget.controller.cancelAction(); widget.controller.cancelAction();
// #Pangea // #Pangea
if (room == null) return; if (room == null || room.membership == Membership.leave) return;
// Pangea# // Pangea#
widget.controller.toggleSelection(room.id); widget.controller.toggleSelection(room.id);
await widget.controller.addToSpace(); await widget.controller.addToSpace();

@ -23,6 +23,7 @@ class RoomCapacityButtonState extends State<RoomCapacityButton> {
Room? room; Room? room;
ChatDetailsController? controller; ChatDetailsController? controller;
String? capacity; String? capacity;
String? nonAdmins;
RoomCapacityButtonState({Key? key}); RoomCapacityButtonState({Key? key});
@ -31,13 +32,33 @@ class RoomCapacityButtonState extends State<RoomCapacityButton> {
super.initState(); super.initState();
room = widget.room; room = widget.room;
controller = widget.controller; controller = widget.controller;
capacity = room?.capacity;
room?.numNonAdmins.then(
(value) => setState(() {
nonAdmins = value.toString();
overCapacity();
}),
);
}
Future<void> overCapacity() async {
if ((room?.isRoomAdmin ?? false) &&
capacity != null &&
nonAdmins != null &&
int.parse(nonAdmins!) > int.parse(capacity!)) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
L10n.of(context)!.roomExceedsCapacity,
),
),
);
}
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final iconColor = Theme.of(context).textTheme.bodyLarge!.color; final iconColor = Theme.of(context).textTheme.bodyLarge!.color;
// Edit - use FutureBuilder to allow async call
// String nonAdmins = (await room.numNonAdmins).toString();
return Column( return Column(
children: [ children: [
ListTile( ListTile(
@ -49,9 +70,9 @@ class RoomCapacityButtonState extends State<RoomCapacityButton> {
child: const Icon(Icons.reduce_capacity), child: const Icon(Icons.reduce_capacity),
), ),
subtitle: Text( subtitle: Text(
// Edit (capacity != null && nonAdmins != null)
// '$nonAdmins/${room.capacity}', ? '$nonAdmins/$capacity'
(room?.capacity ?? capacity ?? L10n.of(context)!.capacityNotSet), : (capacity ?? L10n.of(context)!.capacityNotSet),
), ),
title: Text( title: Text(
L10n.of(context)!.roomCapacity, L10n.of(context)!.roomCapacity,
@ -71,7 +92,7 @@ class RoomCapacityButtonState extends State<RoomCapacityButton> {
Future<void> setClassCapacity() async { Future<void> setClassCapacity() async {
final TextEditingController myTextFieldController = final TextEditingController myTextFieldController =
TextEditingController(text: (room?.capacity ?? capacity ?? '')); TextEditingController(text: (capacity ?? ''));
showDialog( showDialog(
context: context, context: context,
useRootNavigator: false, useRootNavigator: false,
@ -101,7 +122,9 @@ class RoomCapacityButtonState extends State<RoomCapacityButton> {
final success = await showFutureLoadingDialog( final success = await showFutureLoadingDialog(
context: context, context: context,
future: () => ((room != null) future: () => ((room != null)
? (room!.updateRoomCapacity(myTextFieldController.text)) ? (room!.updateRoomCapacity(
capacity = myTextFieldController.text,
))
: setCapacity(myTextFieldController.text)), : setCapacity(myTextFieldController.text)),
); );
if (success.error == null) { if (success.error == null) {

Loading…
Cancel
Save