From d4561b3a172ff1f795e07b45d397c50ac361941f Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 4 Dec 2023 14:31:59 -0500 Subject: [PATCH 1/2] 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); -} From bb11fe5410b189e3e2066f4fa8d4d2fab6fefcd1 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Tue, 5 Dec 2023 14:33:11 -0500 Subject: [PATCH 2/2] added lock icon --- lib/pages/chat_list/chat_list_item.dart | 23 ++++++++++----- lib/pages/chat_list/space_view.dart | 39 ++++++++++++++++--------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index c245b64bc..6d335e245 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -1,19 +1,18 @@ // Flutter imports: -import 'package:flutter/material.dart'; - // Package imports: import 'package:adaptive_dialog/adaptive_dialog.dart'; -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/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/utils/get_chat_list_item_subtitle.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/room_status_extension.dart'; +import 'package:flutter/material.dart'; +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'; + import '../../config/themes.dart'; import '../../utils/date_time_extension.dart'; import '../../widgets/avatar.dart'; @@ -344,6 +343,16 @@ class ChatListItem extends StatelessWidget { ), ), const SizedBox(width: 8), + // #Pangea + if (room.locked ?? false) + const Padding( + padding: EdgeInsets.only(right: 4.0), + child: Icon( + Icons.lock_outlined, + size: 16, + ), + ), + // Pangea# AnimatedContainer( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index abe7ee2c0..bc9b8b1db 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -1,17 +1,9 @@ // Dart imports: import 'dart:async'; -// Flutter imports: -import 'package:flutter/material.dart'; - // Package imports: import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:collection/collection.dart'; -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/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/chat_list_item.dart'; @@ -22,6 +14,13 @@ import 'package:fluffychat/pangea/utils/archive_space.dart'; import 'package:fluffychat/pangea/utils/chat_list_handle_space_tap.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/avatar.dart'; +// Flutter imports: +import 'package:flutter/material.dart'; +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'; + import '../../utils/localized_exception_extension.dart'; import '../../widgets/matrix.dart'; import 'chat_list_header.dart'; @@ -271,12 +270,24 @@ class _SpaceViewState extends State { overflow: TextOverflow.ellipsis, ), // #Pangea - subtitle: Text( - rootSpace.membership == Membership.join - ? L10n.of(context)!.numChats( - rootSpace.spaceChildren.length.toString(), - ) - : L10n.of(context)!.youreInvited, + subtitle: Row( + children: [ + Text( + rootSpace.membership == Membership.join + ? L10n.of(context)!.numChats( + rootSpace.spaceChildren.length.toString(), + ) + : L10n.of(context)!.youreInvited, + ), + if (rootSpace.locked ?? false) + const Padding( + padding: EdgeInsets.only(left: 4.0), + child: Icon( + Icons.lock_outlined, + size: 16, + ), + ), + ], ), onTap: () => chatListHandleSpaceTap( context,