From b6c61c66832ff824be4f802370f460655b25f08b Mon Sep 17 00:00:00 2001 From: avashilling <165050625+avashilling@users.noreply.github.com> Date: Thu, 30 Oct 2025 09:11:02 -0400 Subject: [PATCH 1/4] 4480 restrict options in archived activity session chat UI (#4538) * remove chat UI from archived activities - only count current, non left or banned activities in list to remove directly deleted activities - change learning indicators to reflect the same activity list * revert accidental changes * import sorting and edge case handling * chore: update pangea comments --------- Co-authored-by: ggurdin --- lib/pages/chat/chat_view.dart | 29 +++++++++---------- .../get_analytics_controller.dart | 14 ++++++++- .../learning_progress_indicators.dart | 10 ++----- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index e5d677e57..dcaa14006 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -123,9 +123,20 @@ class ChatView extends StatelessWidget { // ), // ]; // } else - // Pangea# - if (!controller.room.isArchived) { - // #Pangea + // if (!controller.room.isArchived) { + // return [ + // if (AppConfig.experimentalVoip && + // Matrix.of(context).voipPlugin != null && + // controller.room.isDirectChat) + // IconButton( + // onPressed: controller.onPhoneButtonTap, + // icon: const Icon(Icons.call_outlined), + // tooltip: L10n.of(context).placeCall, + // ), + // EncryptionButton(controller.room), + // ChatSettingsPopupMenu(controller.room, true), + // ]; + if (!(controller.room.isArchived || controller.room.hasArchivedActivity)) { return [ if (controller.room.activityPlan == null || !controller.room.showActivityChatUI) @@ -148,18 +159,6 @@ class ChatView extends StatelessWidget { }, ), ]; - // return [ - // if (AppConfig.experimentalVoip && - // Matrix.of(context).voipPlugin != null && - // controller.room.isDirectChat) - // IconButton( - // onPressed: controller.onPhoneButtonTap, - // icon: const Icon(Icons.call_outlined), - // tooltip: L10n.of(context).placeCall, - // ), - // EncryptionButton(controller.room), - // ChatSettingsPopupMenu(controller.room, true), - // ]; // Pangea# } return []; diff --git a/lib/pangea/analytics_misc/get_analytics_controller.dart b/lib/pangea/analytics_misc/get_analytics_controller.dart index 3b1c7b085..78cda3b37 100644 --- a/lib/pangea/analytics_misc/get_analytics_controller.dart +++ b/lib/pangea/analytics_misc/get_analytics_controller.dart @@ -596,7 +596,19 @@ class GetAnalyticsController extends BaseController { final Room? analyticsRoom = _client.analyticsRoomLocal(_l2!); if (analyticsRoom == null) return []; final ids = analyticsRoom.activityRoomIds; - return ids.map((id) => _client.getRoomById(id)).whereType().toList(); + return ids + .map((id) => _client.getRoomById(id)) + .whereType() + .where( + (room) => + room.membership != Membership.leave && + room.membership != Membership.ban, + ) + .toList(); + } + + int get archivedActivitiesCount { + return archivedActivities.length; } } diff --git a/lib/pangea/analytics_summary/learning_progress_indicators.dart b/lib/pangea/analytics_summary/learning_progress_indicators.dart index 3b2b7f14c..e75c03d35 100644 --- a/lib/pangea/analytics_summary/learning_progress_indicators.dart +++ b/lib/pangea/analytics_summary/learning_progress_indicators.dart @@ -5,7 +5,6 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:fluffychat/config/themes.dart'; -import 'package:fluffychat/pangea/analytics_misc/client_analytics_extension.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_list_model.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.dart'; import 'package:fluffychat/pangea/analytics_misc/get_analytics_controller.dart'; @@ -13,7 +12,6 @@ import 'package:fluffychat/pangea/analytics_summary/learning_progress_bar.dart'; import 'package:fluffychat/pangea/analytics_summary/learning_progress_indicator_button.dart'; import 'package:fluffychat/pangea/analytics_summary/progress_indicator.dart'; import 'package:fluffychat/pangea/analytics_summary/progress_indicators_enum.dart'; -import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/learning_settings/pages/settings_learning.dart'; import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -155,12 +153,8 @@ class LearningProgressIndicatorsState ), const SizedBox(width: 6.0), AnimatedFloatingNumber( - number: Matrix.of(context) - .client - .analyticsRoomLocal() - ?.activityRoomIds - .length ?? - 0, + number: MatrixState.pangeaController + .getAnalytics.archivedActivitiesCount, ), ], ), From 71e7f9217e6c89e95a29d4b68676dee88a1471a6 Mon Sep 17 00:00:00 2001 From: avashilling <165050625+avashilling@users.noreply.github.com> Date: Thu, 30 Oct 2025 09:18:23 -0400 Subject: [PATCH 2/4] dont mark new tokens for unsubscribed users (#4539) --- lib/pangea/message_token_text/tokens_util.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pangea/message_token_text/tokens_util.dart b/lib/pangea/message_token_text/tokens_util.dart index b49c1f464..550c48e49 100644 --- a/lib/pangea/message_token_text/tokens_util.dart +++ b/lib/pangea/message_token_text/tokens_util.dart @@ -74,7 +74,9 @@ class TokensUtil { static List getNewTokens( PangeaMessageEvent event, ) { - if (!event.eventId.isValidMatrixId) { + if (!event.eventId.isValidMatrixId || + (MatrixState.pangeaController.subscriptionController.isSubscribed == + false)) { return []; } From 7273b595fccf35a8c9714a87a9fd2f180b4d6714 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Thu, 30 Oct 2025 09:57:17 -0400 Subject: [PATCH 3/4] 4546 course activities not shown to newly joined member (#4549) * fix: wait for room in sync after joining via invite dialog before navigating to detail page * fix: render end button and text explanation using the samel logic, don't show activity stats menu instruction popup if user has finished actiivty * fix: don't redirect from out space on delete child room * fix: don't clear localized course cache of target language update --- .../activity_stats_button.dart | 6 ++++-- .../activity_stats_menu.dart | 3 +-- .../utils/chat_list_handle_space_tap.dart | 4 ++++ .../widgets/chat_context_menu_action.dart | 5 +++-- .../common/controllers/pangea_controller.dart | 18 +++++++++++++++++- 5 files changed, 29 insertions(+), 7 deletions(-) diff --git a/lib/pangea/activity_sessions/activity_session_chat/activity_stats_button.dart b/lib/pangea/activity_sessions/activity_session_chat/activity_stats_button.dart index 2d5e27cc0..ffd026654 100644 --- a/lib/pangea/activity_sessions/activity_session_chat/activity_stats_button.dart +++ b/lib/pangea/activity_sessions/activity_session_chat/activity_stats_button.dart @@ -78,8 +78,10 @@ class _ActivityStatsButtonState extends State { // if someone has finished the activity, enable the tooltip final activityRoles = widget.controller.room.activityRoles?.roles.values.toList() ?? []; - if (activityRoles.any((r) => r.isFinished)) { - return true; + final finishedRoles = activityRoles.where((r) => r.isFinished).toList(); + + if (finishedRoles.isNotEmpty) { + return !finishedRoles.any((r) => r.userId == _client.userID); } // otherwise, if no one has finished, only show if the user has sent >= 3 messages diff --git a/lib/pangea/activity_sessions/activity_session_chat/activity_stats_menu.dart b/lib/pangea/activity_sessions/activity_session_chat/activity_stats_menu.dart index ca7ebb0e2..9bd8d8431 100644 --- a/lib/pangea/activity_sessions/activity_session_chat/activity_stats_menu.dart +++ b/lib/pangea/activity_sessions/activity_session_chat/activity_stats_menu.dart @@ -196,7 +196,7 @@ class ActivityStatsMenuState extends State { ), ], ), - if (!room.hasArchivedActivity) + if (!userComplete) ...[ Text( L10n.of(context).activityDropdownDesc, textAlign: TextAlign.center, @@ -205,7 +205,6 @@ class ActivityStatsMenuState extends State { fontWeight: FontWeight.w600, ), ), - if (!userComplete) ...[ if (shouldShowEndForAll) ElevatedButton( style: ElevatedButton.styleFrom( diff --git a/lib/pangea/chat_list/utils/chat_list_handle_space_tap.dart b/lib/pangea/chat_list/utils/chat_list_handle_space_tap.dart index d877b0d6d..42b91792e 100644 --- a/lib/pangea/chat_list/utils/chat_list_handle_space_tap.dart +++ b/lib/pangea/chat_list/utils/chat_list_handle_space_tap.dart @@ -76,6 +76,10 @@ Future showInviteDialog(Room room, BuildContext context) async { ); if (joinResult.error != null) return; + if (room.membership != Membership.join) { + await room.client.waitForRoomInSync(room.id, join: true); + } + context.go( room.isSpace ? "/rooms/spaces/${room.id}/details" : "/rooms/${room.id}", ); diff --git a/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart b/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart index 618022be4..c00d209c8 100644 --- a/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart +++ b/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart @@ -271,6 +271,7 @@ void chatContextMenuAction( context.go("/rooms"); } } else { + final parentSpaceId = room.courseParent?.id; final confirmed = await showOkCancelAlertDialog( context: context, title: l10n.areYouSure, @@ -286,8 +287,8 @@ void chatContextMenuAction( ); if (!resp.isError) { outerContext.go( - room.courseParent != null - ? "/rooms/spaces/${room.courseParent!.id}/details" + parentSpaceId != null + ? "/rooms/spaces/$parentSpaceId/details" : "/rooms", ); } diff --git a/lib/pangea/common/controllers/pangea_controller.dart b/lib/pangea/common/controllers/pangea_controller.dart index fd01ea217..ab927535b 100644 --- a/lib/pangea/common/controllers/pangea_controller.dart +++ b/lib/pangea/common/controllers/pangea_controller.dart @@ -233,7 +233,23 @@ class PangeaController { } Future _onLanguageUpdate(LanguageUpdate update) async { - clearCache(exclude: ["analytics_storage"]); + final exclude = [ + 'analytics_storage', + 'course_location_media_storage', + 'course_location_storage', + 'course_media_storage', + ]; + + // only clear course data if the base language has changed + if (update.prevBaseLang == update.baseLang) { + exclude.addAll([ + 'course_storage', + 'course_topic_storage', + 'course_activity_storage', + ]); + } + + clearCache(exclude: exclude); _updateBotOptions(); } From 6d8aa6c351d6f7e1b68c333641021d755159ec3f Mon Sep 17 00:00:00 2001 From: Kelrap <99418823+Kelrap@users.noreply.github.com> Date: Thu, 30 Oct 2025 10:02:39 -0400 Subject: [PATCH 4/4] Make role background translucent when user style has image background (#4547) --- .../activity_sessions/activity_participant_indicator.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pangea/activity_sessions/activity_participant_indicator.dart b/lib/pangea/activity_sessions/activity_participant_indicator.dart index aaf54bb59..12fb4f77a 100644 --- a/lib/pangea/activity_sessions/activity_participant_indicator.dart +++ b/lib/pangea/activity_sessions/activity_participant_indicator.dart @@ -64,7 +64,7 @@ class ActivityParticipantIndicator extends StatelessWidget { borderRadius: borderRadius ?? BorderRadius.circular(8.0), color: (hovered || selected) && selectable ? theme.colorScheme.surfaceContainerHighest - : Colors.transparent, + : theme.colorScheme.surface.withAlpha(130), ), constraints: const BoxConstraints(maxWidth: 200.0), child: Column(