From d4561b3a172ff1f795e07b45d397c50ac361941f Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 4 Dec 2023 14:31:59 -0500 Subject: [PATCH] updates to locking room functionality --- lib/pages/chat/chat_event_list.dart | 3 +- lib/pages/chat_details/chat_details_view.dart | 29 ++++---- .../extensions/pangea_room_extension.dart | 51 +++++-------- lib/pangea/utils/lock_room.dart | 74 +++++++++++-------- 4 files changed, 83 insertions(+), 74 deletions(-) diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart index a02ec2fb5..f120a5de1 100644 --- a/lib/pages/chat/chat_event_list.dart +++ b/lib/pages/chat/chat_event_list.dart @@ -75,7 +75,8 @@ class ChatEventList extends StatelessWidget { // #Pangea if (i == 1) { - return controller.room.locked && !controller.room.isRoomAdmin + return (controller.room.locked ?? false) && + !controller.room.isRoomAdmin ? const LockedChatMessage() : const SizedBox.shrink(); } diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart index 8cede0a82..56b4ddee6 100644 --- a/lib/pages/chat_details/chat_details_view.dart +++ b/lib/pages/chat_details/chat_details_view.dart @@ -1,12 +1,4 @@ // Flutter imports: -import 'package:flutter/material.dart'; - -// Package imports: -import 'package:flutter_gen/gen_l10n/l10n.dart'; -import 'package:future_loading_dialog/future_loading_dialog.dart'; -import 'package:go_router/go_router.dart'; -import 'package:matrix/matrix.dart'; - // Project imports: import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/chat_details/chat_details.dart'; @@ -29,6 +21,12 @@ import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/chat_settings_popup_menu.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +// Package imports: +import 'package:flutter_gen/gen_l10n/l10n.dart'; +import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:go_router/go_router.dart'; +import 'package:matrix/matrix.dart'; class ChatDetailsView extends StatelessWidget { final ChatDetailsController controller; @@ -553,13 +551,18 @@ class ChatDetailsView extends StatelessWidget { Icons.lock_outlined, ), ), - value: room.locked, + value: room.locked ?? false, onChanged: (value) => showFutureLoadingDialog( context: context, - future: () => toggleLockRoom( - room, - Matrix.of(context).client, - ), + future: () => value + ? lockRoom( + room, + Matrix.of(context).client, + ) + : unlockRoom( + room, + Matrix.of(context).client, + ), ), ), const Divider(height: 1), diff --git a/lib/pangea/extensions/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension.dart index 994614513..599406a34 100644 --- a/lib/pangea/extensions/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension.dart @@ -2,15 +2,6 @@ import 'dart:async'; import 'dart:developer'; -// Flutter imports: -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; - -// Package imports: -import 'package:matrix/matrix.dart'; -import 'package:matrix/src/utils/space_child.dart'; -import 'package:sentry_flutter/sentry_flutter.dart'; - // Project imports: import 'package:fluffychat/pangea/constants/class_default_values.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; @@ -19,6 +10,14 @@ import 'package:fluffychat/pangea/models/class_model.dart'; import 'package:fluffychat/pangea/models/pangea_message_event.dart'; import 'package:fluffychat/pangea/utils/bot_name.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart'; +// Flutter imports: +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +// Package imports: +import 'package:matrix/matrix.dart'; +import 'package:matrix/src/utils/space_child.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; + import '../../config/app_config.dart'; import '../constants/pangea_event_types.dart'; import '../enum/construct_type_enum.dart'; @@ -756,8 +755,7 @@ extension PangeaRoom on Room { } final toAdd = [ ...getParticipants([Membership.invite, Membership.join]) - .map((e) => e.id) - .toList(), + .map((e) => e.id), BotName.byEnvironment, ]; for (final teacher in await client.myTeachers) { @@ -920,29 +918,20 @@ extension PangeaRoom on Room { ); } - bool get locked { - final Event? powerLevels = getState(EventTypes.RoomPowerLevels); - if (powerLevels == null) { - return false; - } - final Map powerLevelsContent = Map.from( - powerLevels.content, - ); + int? get eventsDefaultPowerLevel => getState(EventTypes.RoomPowerLevels) + ?.content + .tryGet('events_default'); + bool? get locked { + if (isDirectChat) return false; if (!isSpace) { - return powerLevelsContent['events_default'] != null && - powerLevelsContent['events_default'] >= 100; + if (eventsDefaultPowerLevel == null) return null; + return eventsDefaultPowerLevel! >= ClassDefaultValues.powerLevelOfAdmin; } - - final List children = spaceChildren - .map( - (child) => - child.roomId != null ? client.getRoomById(child.roomId!) : null, - ) - .toList(); - - for (final Room? child in children) { - if (child != null && !child.locked) { + for (final child in spaceChildren) { + if (child.roomId == null) continue; + final Room? room = client.getRoomById(child.roomId!); + if (room?.locked == false && (room?.canChangePowerLevel ?? false)) { return false; } } diff --git a/lib/pangea/utils/lock_room.dart b/lib/pangea/utils/lock_room.dart index 01c3b4b48..b435b2db1 100644 --- a/lib/pangea/utils/lock_room.dart +++ b/lib/pangea/utils/lock_room.dart @@ -1,17 +1,26 @@ // Package imports: +// Project imports: import 'package:matrix/matrix.dart'; -// Project imports: -import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; -import 'package:fluffychat/pangea/utils/join_all_space_chats.dart'; +Future lockRoom(Room room, Client client) async { + room.isSpace ? await lockSpace(room, client) : await lockChat(room, client); +} -Future unlockChat(Room room, Client client) async { +Future unlockRoom(Room room, Client client) async { + room.isSpace + ? await unlockSpace(room, client) + : await unlockChat(room, client); +} + +Future lockChat(Room room, Client client) async { + if (!room.canChangePowerLevel) { + return; + } final Map powerLevelsContent = Map.from( room.getState(EventTypes.RoomPowerLevels)!.content, ); - - powerLevelsContent['events_default'] = 0; - powerLevelsContent['events'][EventTypes.spaceChild] = 0; + powerLevelsContent['events_default'] = 100; + powerLevelsContent['events'][EventTypes.spaceChild] = 100; await room.client.setRoomStateWithKey( room.id, @@ -21,12 +30,16 @@ Future unlockChat(Room room, Client client) async { ); } -Future lockChat(Room room, Client client) async { +Future unlockChat(Room room, Client client) async { + if (!room.canChangePowerLevel) { + return; + } final Map powerLevelsContent = Map.from( room.getState(EventTypes.RoomPowerLevels)!.content, ); - powerLevelsContent['events_default'] = 100; - powerLevelsContent['events'][EventTypes.spaceChild] = 100; + + powerLevelsContent['events_default'] = 0; + powerLevelsContent['events'][EventTypes.spaceChild] = 0; await room.client.setRoomStateWithKey( room.id, @@ -37,30 +50,33 @@ Future lockChat(Room room, Client client) async { } Future lockSpace(Room space, Client client) async { - final List children = await joinAllSpaceChats(space, client); - for (final Room child in children) { - await lockChat(child, client); + for (final spaceChild in space.spaceChildren) { + Room? child = client.getRoomById(spaceChild.roomId!); + if (child == null) { + try { + await client.joinRoom(spaceChild.roomId!); + await client.waitForRoomInSync(spaceChild.roomId!, join: true); + child = client.getRoomById(spaceChild.roomId!); + } catch (err) { + await client.leaveRoom(spaceChild.roomId!); + continue; + } + } + if (child == null) continue; + child.isSpace + ? await lockSpace(child, client) + : await lockChat(child, client); } await lockChat(space, client); } Future unlockSpace(Room space, Client client) async { - final List children = space.spaceChildren - .map((child) => client.getRoomById(child.roomId!)) - .toList(); - for (final Room? child in children) { - if (child != null) { - await unlockChat(child, client); - } + for (final spaceChild in space.spaceChildren) { + final Room? child = client.getRoomById(spaceChild.roomId!); + if (child == null) continue; + child.isSpace + ? await unlockSpace(child, client) + : await unlockChat(child, client); } await unlockChat(space, client); } - -Future toggleLockRoom(Room? room, Client client) async { - if (room == null || !room.isRoomAdmin) return; - if (!room.isSpace) { - room.locked ? await unlockChat(room, client) : await lockChat(room, client); - return; - } - room.locked ? await unlockSpace(room, client) : await lockSpace(room, client); -}