From 4d6b63d8d91d0a244871db870afad4fefc1ca3c3 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Thu, 30 Nov 2023 15:19:43 -0500 Subject: [PATCH 1/6] update archive text, change floating action button to more visible button in new space view --- assets/l10n/intl_en.arb | 5 +- .../chat_list/client_chooser_button.dart | 15 +- lib/pages/new_space/new_space_view.dart | 47 +++- needed-translations.txt | 230 ++++++++++++++---- 4 files changed, 231 insertions(+), 66 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 5dc8cd899..333416375 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -3938,5 +3938,8 @@ "groupName": "Group name", "createGroupAndInviteUsers": "Create a group and invite users", "groupCanBeFoundViaSearch": "Group can be found via search", - "inNoSpaces": "You are not a member of any classes or exchanges" + "inNoSpaces": "You are not a member of any classes or exchanges", + "createClass": "Create class", + "createExchange": "Create exchange", + "viewArchive": "View Archive" } diff --git a/lib/pages/chat_list/client_chooser_button.dart b/lib/pages/chat_list/client_chooser_button.dart index c40c09968..7fe4457ee 100644 --- a/lib/pages/chat_list/client_chooser_button.dart +++ b/lib/pages/chat_list/client_chooser_button.dart @@ -1,23 +1,22 @@ // Dart imports: import 'dart:developer'; +// Project imports: +import 'package:fluffychat/pangea/extensions/client_extension.dart'; +import 'package:fluffychat/pangea/utils/class_code.dart'; +import 'package:fluffychat/pangea/utils/find_conversation_partner_dialog.dart'; +import 'package:fluffychat/pangea/utils/logout.dart'; +import 'package:fluffychat/widgets/matrix.dart'; // Flutter imports: import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - // Package imports: import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:go_router/go_router.dart'; import 'package:keyboard_shortcuts/keyboard_shortcuts.dart'; import 'package:matrix/matrix.dart'; -// Project imports: -import 'package:fluffychat/pangea/extensions/client_extension.dart'; -import 'package:fluffychat/pangea/utils/class_code.dart'; -import 'package:fluffychat/pangea/utils/find_conversation_partner_dialog.dart'; -import 'package:fluffychat/pangea/utils/logout.dart'; -import 'package:fluffychat/widgets/matrix.dart'; import '../../utils/fluffy_share.dart'; import 'chat_list.dart'; @@ -163,7 +162,7 @@ class ClientChooserButton extends StatelessWidget { const SizedBox(width: 18), // #Pangea // Text(L10n.of(context)!.archive), - Expanded(child: Text(L10n.of(context)!.archive)), + Expanded(child: Text(L10n.of(context)!.viewArchive)), // Pangea# ], ), diff --git a/lib/pages/new_space/new_space_view.dart b/lib/pages/new_space/new_space_view.dart index dc40e74ac..aba2b42f7 100644 --- a/lib/pages/new_space/new_space_view.dart +++ b/lib/pages/new_space/new_space_view.dart @@ -1,10 +1,4 @@ // Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// Package imports: -import 'package:flutter_gen/gen_l10n/l10n.dart'; - // Project imports: import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; @@ -13,6 +7,11 @@ 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/space/class_settings.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +// Package imports: +import 'package:flutter_gen/gen_l10n/l10n.dart'; + import 'new_space.dart'; class NewSpaceView extends StatelessWidget { @@ -98,7 +97,6 @@ class NewSpaceView extends StatelessWidget { roomId: null, startOpen: false, ), - const SizedBox(height: 45), // SwitchListTile.adaptive( // title: Text(L10n.of(context)!.spaceIsPublic), // value: controller.publicGroup, @@ -111,14 +109,41 @@ class NewSpaceView extends StatelessWidget { // ), // subtitle: Text(L10n.of(context)!.newSpaceDescription), // ), + Padding( + padding: const EdgeInsets.all(16.0), + child: SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.onPrimary, + backgroundColor: Theme.of(context).colorScheme.primary, + ), + onPressed: controller.submitAction, + child: Row( + children: [ + Expanded( + child: Text( + controller.newClassMode + ? L10n.of(context)!.createClass + : L10n.of(context)!.createExchange, + ), + ), + Icon(Icons.adaptive.arrow_forward_outlined), + ], + ), + ), + ), + ), // Pangea# ], ), ), - floatingActionButton: FloatingActionButton( - onPressed: controller.submitAction, - child: const Icon(Icons.arrow_forward_outlined), - ), + // #Pangea + // floatingActionButton: FloatingActionButton( + // onPressed: controller.submitAction, + // child: const Icon(Icons.arrow_forward_outlined), + // ), + // Pangea# ); } } diff --git a/needed-translations.txt b/needed-translations.txt index 22219e8b3..552a7a9d8 100644 --- a/needed-translations.txt +++ b/needed-translations.txt @@ -756,7 +756,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "bn": [ @@ -1521,7 +1524,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "bo": [ @@ -2286,7 +2292,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "ca": [ @@ -3046,7 +3055,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "cs": [ @@ -3806,7 +3818,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "de": [ @@ -4566,7 +4581,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "el": [ @@ -5331,7 +5349,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "eo": [ @@ -6091,7 +6112,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "es": [ @@ -6115,7 +6139,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "et": [ @@ -6875,7 +6902,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "eu": [ @@ -7635,7 +7665,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "fa": [ @@ -8395,7 +8428,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "fi": [ @@ -9155,7 +9191,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "fr": [ @@ -9915,7 +9954,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "ga": [ @@ -10675,7 +10717,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "gl": [ @@ -11435,7 +11480,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "he": [ @@ -12195,7 +12243,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "hi": [ @@ -12960,7 +13011,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "hr": [ @@ -13720,7 +13774,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "hu": [ @@ -14480,7 +14537,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "id": [ @@ -15240,7 +15300,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "ie": [ @@ -16002,7 +16065,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "it": [ @@ -16762,7 +16828,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "ja": [ @@ -17522,7 +17591,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "ko": [ @@ -18282,7 +18354,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "lt": [ @@ -19042,7 +19117,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "lv": [ @@ -19807,7 +19885,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "nb": [ @@ -20567,7 +20648,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "nl": [ @@ -21327,7 +21411,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "pl": [ @@ -22087,7 +22174,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "pt": [ @@ -22852,7 +22942,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "pt_BR": [ @@ -23612,7 +23705,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "pt_PT": [ @@ -24372,7 +24468,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "ro": [ @@ -25132,7 +25231,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "ru": [ @@ -25892,7 +25994,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "sk": [ @@ -26653,7 +26758,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "sl": [ @@ -27416,7 +27524,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "sr": [ @@ -28176,7 +28287,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "sv": [ @@ -28936,7 +29050,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "ta": [ @@ -29701,7 +29818,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "th": [ @@ -30466,7 +30586,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "tr": [ @@ -31226,7 +31349,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "uk": [ @@ -31986,7 +32112,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "vi": [ @@ -32749,7 +32878,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "zh": [ @@ -33509,7 +33641,10 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ], "zh_Hant": [ @@ -34269,6 +34404,9 @@ "groupName", "createGroupAndInviteUsers", "groupCanBeFoundViaSearch", - "inNoSpaces" + "inNoSpaces", + "createClass", + "createExchange", + "viewArchive" ] } From 8fbba108bfc6acdffac31a55889f3c95af1cc9af Mon Sep 17 00:00:00 2001 From: ggurdin Date: Fri, 1 Dec 2023 10:43:53 -0500 Subject: [PATCH 2/6] pre-fill new space settings with the settings from the last updated space --- lib/pages/new_space/new_space_view.dart | 16 +++-- lib/pangea/extensions/client_extension.dart | 71 +++++++++++++------ .../extensions/pangea_room_extension.dart | 32 ++++++--- .../p_class_widgets/room_rules_editor.dart | 28 +++++--- lib/pangea/widgets/space/class_settings.dart | 31 +++++--- 5 files changed, 118 insertions(+), 60 deletions(-) diff --git a/lib/pages/new_space/new_space_view.dart b/lib/pages/new_space/new_space_view.dart index dc40e74ac..c918ada74 100644 --- a/lib/pages/new_space/new_space_view.dart +++ b/lib/pages/new_space/new_space_view.dart @@ -1,18 +1,19 @@ // Flutter imports: -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -// Package imports: -import 'package:flutter_gen/gen_l10n/l10n.dart'; - // Project imports: import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart'; +import 'package:fluffychat/pangea/extensions/client_extension.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'; import 'package:fluffychat/pangea/widgets/space/class_settings.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; +import 'package:fluffychat/widgets/matrix.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +// Package imports: +import 'package:flutter_gen/gen_l10n/l10n.dart'; + import 'new_space.dart'; class NewSpaceView extends StatelessWidget { @@ -84,6 +85,8 @@ class NewSpaceView extends StatelessWidget { key: controller.classSettingsKey, roomId: null, startOpen: true, + initialSettings: + Matrix.of(context).client.lastUpdatedClassSettings, ), if (!controller.newClassMode) AddToSpaceToggles( @@ -97,6 +100,7 @@ class NewSpaceView extends StatelessWidget { key: controller.rulesEditorKey, roomId: null, startOpen: false, + initialRules: Matrix.of(context).client.lastUpdatedRoomRules, ), const SizedBox(height: 45), // SwitchListTile.adaptive( diff --git a/lib/pangea/extensions/client_extension.dart b/lib/pangea/extensions/client_extension.dart index 753266010..7053f0b94 100644 --- a/lib/pangea/extensions/client_extension.dart +++ b/lib/pangea/extensions/client_extension.dart @@ -1,47 +1,55 @@ // Dart imports: import 'dart:developer'; -// Flutter imports: -import 'package:flutter/foundation.dart'; - // Package imports: import 'package:collection/collection.dart'; -import 'package:matrix/matrix.dart'; - // Project imports: import 'package:fluffychat/pangea/constants/class_default_values.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/models/class_model.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:matrix/matrix.dart'; + import '../utils/p_store.dart'; extension PangeaClient on Client { List get classes => rooms.where((e) => e.isPangeaClass).toList(); List get classesImTeaching => rooms - .where((e) => - e.isPangeaClass && - e.ownPowerLevel == ClassDefaultValues.powerLevelOfAdmin) + .where( + (e) => + e.isPangeaClass && + e.ownPowerLevel == ClassDefaultValues.powerLevelOfAdmin, + ) .toList(); List get classesAndExchangesImTeaching => rooms - .where((e) => - (e.isPangeaClass || e.isExchange) && - e.ownPowerLevel == ClassDefaultValues.powerLevelOfAdmin) + .where( + (e) => + (e.isPangeaClass || e.isExchange) && + e.ownPowerLevel == ClassDefaultValues.powerLevelOfAdmin, + ) .toList(); List get classesImIn => rooms - .where((e) => - e.isPangeaClass && - e.ownPowerLevel < ClassDefaultValues.powerLevelOfAdmin) + .where( + (e) => + e.isPangeaClass && + e.ownPowerLevel < ClassDefaultValues.powerLevelOfAdmin, + ) .toList(); List get classesAndExchangesImStudyingIn => rooms - .where((e) => - (e.isPangeaClass || e.isExchange) && - e.ownPowerLevel < ClassDefaultValues.powerLevelOfAdmin) + .where( + (e) => + (e.isPangeaClass || e.isExchange) && + e.ownPowerLevel < ClassDefaultValues.powerLevelOfAdmin, + ) .toList(); List get classesAndExchangesImIn => @@ -104,8 +112,10 @@ extension PangeaClient on Client { debugger(when: kDebugMode); analyticsRoom .join() - .onError((error, stackTrace) => - ErrorHandler.logError(e: error, s: stackTrace)) + .onError( + (error, stackTrace) => + ErrorHandler.logError(e: error, s: stackTrace), + ) .then((value) => analyticsRoom.postLoad()); return analyticsRoom; } @@ -116,14 +126,14 @@ extension PangeaClient on Client { final String roomID = await createRoom( creationContent: { 'type': PangeaRoomTypes.analytics, - ModelKey.langCode: langCode + ModelKey.langCode: langCode, }, name: "$userID $langCode Analytics", topic: "This room stores learning analytics for $userID.", invite: [ - ...(await myTeachers).map((e) => e.id).toList(), + ...(await myTeachers).map((e) => e.id), // BotName.localBot, - BotName.byEnvironment + BotName.byEnvironment, ], visibility: Visibility.private, roomAliasName: "${userID!.localpart}_${langCode}_analytics", @@ -146,4 +156,21 @@ extension PangeaClient on Client { ); return getRoomById(roomId)!; } + + PangeaRoomRules? get lastUpdatedRoomRules => classesAndExchangesImTeaching + .where((space) => space.rulesUpdatedAt != null) + .sorted( + (a, b) => b.rulesUpdatedAt!.compareTo(a.rulesUpdatedAt!), + ) + .firstOrNull + ?.pangeaRoomRules; + + ClassSettingsModel? get lastUpdatedClassSettings => classesImTeaching + .where((space) => space.classSettingsUpdatedAt != null) + .sorted( + (a, b) => + b.classSettingsUpdatedAt!.compareTo(a.classSettingsUpdatedAt!), + ) + .firstOrNull + ?.classSettings; } diff --git a/lib/pangea/extensions/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension.dart index 994614513..e298c1ad3 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'; @@ -82,6 +81,8 @@ extension PangeaRoom on Room { String? get creatorId => getState(EventTypes.RoomCreate)?.senderId; + DateTime? get creationTime => getState(EventTypes.RoomCreate)?.originServerTs; + ClassSettingsModel? get firstLanguageSettings => classSettings ?? firstParentWithState(PangeaEventTypes.classSettings)?.classSettings; @@ -756,8 +757,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) { @@ -986,4 +986,14 @@ extension PangeaRoom on Room { } return children; } + + DateTime? get classSettingsUpdatedAt { + if (!isSpace) return null; + return languageSettingsStateEvent?.originServerTs ?? creationTime; + } + + DateTime? get rulesUpdatedAt { + if (!isSpace) return null; + return pangeaRoomRulesStateEvent?.originServerTs ?? creationTime; + } } diff --git a/lib/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart b/lib/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart index 0f5555fe9..69c5facb0 100644 --- a/lib/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart +++ b/lib/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart @@ -1,13 +1,12 @@ // Flutter imports: +// Project imports: +import 'package:fluffychat/pangea/models/class_model.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:matrix/matrix.dart'; -// Project imports: -import 'package:fluffychat/pangea/models/class_model.dart'; import '../../../../config/app_config.dart'; import '../../../../widgets/matrix.dart'; import '../../../constants/pangea_event_types.dart'; @@ -17,10 +16,15 @@ class RoomRulesEditor extends StatefulWidget { final String? roomId; final bool startOpen; final bool showAdd; - - const RoomRulesEditor( - {Key? key, this.roomId, this.startOpen = true, this.showAdd = false}) - : super(key: key); + final PangeaRoomRules? initialRules; + + const RoomRulesEditor({ + super.key, + this.roomId, + this.startOpen = true, + this.showAdd = false, + this.initialRules, + }); @override RoomRulesState createState() => RoomRulesState(); @@ -43,7 +47,7 @@ class RoomRulesState extends State { ? Matrix.of(context).client.getRoomById(widget.roomId!) : null; - rules = room?.pangeaRoomRules ?? PangeaRoomRules(); + rules = room?.pangeaRoomRules ?? widget.initialRules ?? PangeaRoomRules(); super.initState(); } @@ -161,14 +165,18 @@ class RoomRulesState extends State { onChanged: (value) { updatePermission(() { rules.setLanguageToolSetting( - setting, value.toInt()); + setting, + value.toInt(), + ); }); }, divisions: 2, max: 2, min: 0, label: rules.languageToolPermissionsText( - context, setting), + context, + setting, + ), ), ), ], diff --git a/lib/pangea/widgets/space/class_settings.dart b/lib/pangea/widgets/space/class_settings.dart index 86066e972..c90b9251c 100644 --- a/lib/pangea/widgets/space/class_settings.dart +++ b/lib/pangea/widgets/space/class_settings.dart @@ -1,17 +1,16 @@ // Dart imports: import 'dart:developer'; +// Project imports: +import 'package:fluffychat/pangea/models/class_model.dart'; // Flutter imports: import 'package:flutter/foundation.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:matrix/matrix.dart'; -// Project imports: -import 'package:fluffychat/pangea/models/class_model.dart'; import '../../../widgets/matrix.dart'; import '../../constants/language_keys.dart'; import '../../constants/language_level_type.dart'; @@ -28,9 +27,14 @@ import '../user_settings/p_question_container.dart'; class ClassSettings extends StatefulWidget { final String? roomId; final bool startOpen; + final ClassSettingsModel? initialSettings; - const ClassSettings({Key? key, this.roomId, this.startOpen = false}) - : super(key: key); + const ClassSettings({ + super.key, + this.roomId, + this.startOpen = false, + this.initialSettings, + }); @override ClassSettingsState createState() => ClassSettingsState(); @@ -54,7 +58,8 @@ class ClassSettingsState extends State { ? Matrix.of(context).client.getRoomById(widget.roomId!) : null; - classSettings = room?.classSettings ?? ClassSettingsModel(); + classSettings = + room?.classSettings ?? widget.initialSettings ?? ClassSettingsModel(); isOpen = widget.startOpen; @@ -139,8 +144,8 @@ class ClassSettingsState extends State { child: Column( children: [ PQuestionContainer( - title: - L10n.of(context)!.selectClassRoomDominantLanguage), + title: L10n.of(context)!.selectClassRoomDominantLanguage, + ), PLanguageDropdown( onChange: (p0) => updatePermission(() { classSettings.dominantLanguage = p0.langCode; @@ -153,7 +158,8 @@ class ClassSettingsState extends State { showMultilingual: true, ), PQuestionContainer( - title: L10n.of(context)!.selectTargetLanguage), + title: L10n.of(context)!.selectTargetLanguage, + ), PLanguageDropdown( onChange: (p0) => updatePermission(() { classSettings.targetLanguage = p0.langCode; @@ -165,7 +171,8 @@ class ClassSettingsState extends State { languages: pangeaController.pLanguageStore.targetOptions, ), PQuestionContainer( - title: L10n.of(context)!.whatIsYourClassLanguageLevel), + title: L10n.of(context)!.whatIsYourClassLanguageLevel, + ), Padding( padding: const EdgeInsets.all(12.0), child: Container( @@ -210,7 +217,9 @@ class ClassSettingsState extends State { value: levelOption, child: Text( LanguageLevelTextPicker.languageLevelText( - context, levelOption), + context, + levelOption, + ), style: const TextStyle().copyWith( color: Theme.of(context) .textTheme From d4561b3a172ff1f795e07b45d397c50ac361941f Mon Sep 17 00:00:00 2001 From: ggurdin Date: Mon, 4 Dec 2023 14:31:59 -0500 Subject: [PATCH 3/6] 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 4/6] 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, From ede77509aa742bc723b25692e3a47bc641b9463e Mon Sep 17 00:00:00 2001 From: ggurdin Date: Fri, 8 Dec 2023 15:28:41 -0500 Subject: [PATCH 5/6] sort system lang to top of language dropdown, set defaults to system lang --- .../user_settings/p_language_dialog.dart | 33 +++++++++++++------ .../user_settings/p_language_dropdown.dart | 27 ++++++++++----- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/lib/pangea/widgets/user_settings/p_language_dialog.dart b/lib/pangea/widgets/user_settings/p_language_dialog.dart index b914212dc..077959ead 100644 --- a/lib/pangea/widgets/user_settings/p_language_dialog.dart +++ b/lib/pangea/widgets/user_settings/p_language_dialog.dart @@ -1,14 +1,15 @@ import 'dart:developer'; +import 'package:fluffychat/pangea/constants/language_keys.dart'; +import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; +import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; +import 'package:fluffychat/pangea/models/language_model.dart'; +import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:flutter/foundation.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:fluffychat/pangea/controllers/pangea_controller.dart'; -import 'package:fluffychat/pangea/models/language_model.dart'; -import 'package:fluffychat/pangea/utils/error_handler.dart'; import '../../../config/themes.dart'; import '../../../widgets/matrix.dart'; import 'p_language_dropdown.dart'; @@ -17,12 +18,24 @@ import 'p_question_container.dart'; pLanguageDialog(BuildContext parentContext, Function callback) { final PangeaController pangeaController = MatrixState.pangeaController; //PTODO: if source language not set by user, default to languge from device settings - LanguageModel selectedSourceLanguage = - pangeaController.languageController.userL1 ?? - pangeaController.pLanguageStore.targetOptions[0]; - LanguageModel selectedTargetLanguage = - pangeaController.languageController.userL2 ?? - pangeaController.pLanguageStore.targetOptions[1]; + final LanguageModel? userL1 = pangeaController.languageController.userL1; + final LanguageModel? userL2 = pangeaController.languageController.userL2; + final String systemLang = Localizations.localeOf(parentContext).languageCode; + final LanguageModel systemLanguage = PangeaLanguage.byLangCode(systemLang); + + LanguageModel selectedSourceLanguage = systemLanguage; + if (userL1 != null && userL1.langCode != LanguageKeys.unknownLanguage) { + selectedSourceLanguage = userL1; + } + + LanguageModel selectedTargetLanguage; + if (userL2 != null && userL2.langCode != LanguageKeys.unknownLanguage) { + selectedTargetLanguage = userL2; + } else { + selectedTargetLanguage = selectedSourceLanguage.langCode != 'en' + ? PangeaLanguage.byLangCode('en') + : PangeaLanguage.byLangCode('es'); + } return showDialog( useRootNavigator: false, diff --git a/lib/pangea/widgets/user_settings/p_language_dropdown.dart b/lib/pangea/widgets/user_settings/p_language_dropdown.dart index 0694355c5..e9a02bb33 100644 --- a/lib/pangea/widgets/user_settings/p_language_dropdown.dart +++ b/lib/pangea/widgets/user_settings/p_language_dropdown.dart @@ -1,8 +1,8 @@ // Flutter imports: +import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:flutter/material.dart'; -import 'package:fluffychat/pangea/models/language_model.dart'; import '../../widgets/flag.dart'; class PLanguageDropdown extends StatefulWidget { @@ -27,17 +27,26 @@ class _PLanguageDropdownState extends State { @override Widget build(BuildContext context) { final List sortedLanguages = widget.languages; + final String systemLang = Localizations.localeOf(context).languageCode; int sortLanguages(LanguageModel a, LanguageModel b) { - if (a.langCode == 'en') { - return -1; // "English" comes first - } else if (b.langCode == 'en') { - return 1; - } else if (a.langCode == 'es') { - return -1; // "Spanish" comes second - } else if (b.langCode == 'es') { - return 1; + final String aLang = a.langCode; + final String bLang = b.langCode; + if (aLang == bLang) return 0; + + final List languagePriority = [systemLang, 'en', 'es']; + final bool aIsPriority = languagePriority.contains(a.langCode); + final bool bIsPriority = languagePriority.contains(b.langCode); + + if (aIsPriority && bIsPriority) { + final int aPriority = languagePriority.indexOf(a.langCode); + final int bPriority = languagePriority.indexOf(b.langCode); + return aPriority - bPriority; } + + if (aIsPriority) return -1; + if (bIsPriority) return 1; + return a.getDisplayName(context)!.compareTo(b.getDisplayName(context)!); } From b021d519ba7f7692da6e716b17686c72d5f1b5e8 Mon Sep 17 00:00:00 2001 From: ggurdin Date: Wed, 13 Dec 2023 12:22:39 -0500 Subject: [PATCH 6/6] moved around operations in sort function --- .../widgets/user_settings/p_language_dropdown.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/pangea/widgets/user_settings/p_language_dropdown.dart b/lib/pangea/widgets/user_settings/p_language_dropdown.dart index e9a02bb33..0793efdc2 100644 --- a/lib/pangea/widgets/user_settings/p_language_dropdown.dart +++ b/lib/pangea/widgets/user_settings/p_language_dropdown.dart @@ -28,15 +28,18 @@ class _PLanguageDropdownState extends State { Widget build(BuildContext context) { final List sortedLanguages = widget.languages; final String systemLang = Localizations.localeOf(context).languageCode; + final List languagePriority = [systemLang, 'en', 'es']; int sortLanguages(LanguageModel a, LanguageModel b) { final String aLang = a.langCode; final String bLang = b.langCode; if (aLang == bLang) return 0; - final List languagePriority = [systemLang, 'en', 'es']; final bool aIsPriority = languagePriority.contains(a.langCode); final bool bIsPriority = languagePriority.contains(b.langCode); + if (!aIsPriority && !bIsPriority) { + return a.getDisplayName(context)!.compareTo(b.getDisplayName(context)!); + } if (aIsPriority && bIsPriority) { final int aPriority = languagePriority.indexOf(a.langCode); @@ -44,10 +47,7 @@ class _PLanguageDropdownState extends State { return aPriority - bPriority; } - if (aIsPriority) return -1; - if (bIsPriority) return 1; - - return a.getDisplayName(context)!.compareTo(b.getDisplayName(context)!); + return aIsPriority ? -1 : 1; } sortedLanguages.sort((a, b) => sortLanguages(a, b));