From af8a2c1fbd7dbf1fa716b4d938afe85ba0da8656 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Wed, 3 Sep 2025 10:59:43 -0400 Subject: [PATCH] chore: add popup to navigate to session analytics (#3852) --- lib/l10n/intl_en.arb | 3 +- .../activity_room_extension.dart | 2 +- .../activity_finished_status_message.dart | 14 ++- .../saved_activity_analytics_dialog.dart | 86 +++++++++++++++++++ .../activity_user_summaries_widget.dart | 28 +++--- 5 files changed, 119 insertions(+), 14 deletions(-) create mode 100644 lib/pangea/activity_sessions/activity_session_chat/saved_activity_analytics_dialog.dart diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index c0c6419b1..bf9515fdf 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -5265,5 +5265,6 @@ "saveToCompletedActivities": "Save to completed activities", "generatingSummary": "Analyzing chat and generating results", "instructionsLanguage": "Instructions language", - "findCourse": "Find a course" + "findCourse": "Find a course", + "activityCompletedDesc": "Your completed activity was added to analytics where you can review and practice the language you used." } diff --git a/lib/pangea/activity_sessions/activity_room_extension.dart b/lib/pangea/activity_sessions/activity_room_extension.dart index f8a427b78..049ebb61a 100644 --- a/lib/pangea/activity_sessions/activity_room_extension.dart +++ b/lib/pangea/activity_sessions/activity_room_extension.dart @@ -83,7 +83,7 @@ extension ActivityRoomExtension on Room { Future archiveActivity() async { final currentRoles = activityRoles ?? ActivityRolesModel.empty; final role = ownRole; - if (role == null || !role.isFinished) return; + if (role == null || !role.isFinished || role.isArchived) return; role.archivedAt = DateTime.now(); currentRoles.updateRole(role); diff --git a/lib/pangea/activity_sessions/activity_session_chat/activity_finished_status_message.dart b/lib/pangea/activity_sessions/activity_session_chat/activity_finished_status_message.dart index 22a18d47f..f15cce367 100644 --- a/lib/pangea/activity_sessions/activity_session_chat/activity_finished_status_message.dart +++ b/lib/pangea/activity_sessions/activity_session_chat/activity_finished_status_message.dart @@ -6,6 +6,7 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart'; +import 'package:fluffychat/pangea/activity_sessions/activity_session_chat/saved_activity_analytics_dialog.dart'; import 'package:fluffychat/pangea/course_plans/course_plan_room_extension.dart'; import 'package:fluffychat/pangea/course_plans/course_plans_repo.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; @@ -129,9 +130,18 @@ class ActivityFinishedStatusMessage extends StatelessWidget { ); if (!resp.isError) { - context.go( - "/rooms/analytics?mode=activities", + final navigate = await showDialog( + context: context, + builder: (context) { + return const SavedActivityAnalyticsDialog(); + }, ); + + if (navigate == true) { + context.go( + "/rooms/analytics?mode=activities", + ); + } } }, child: Row( diff --git a/lib/pangea/activity_sessions/activity_session_chat/saved_activity_analytics_dialog.dart b/lib/pangea/activity_sessions/activity_session_chat/saved_activity_analytics_dialog.dart new file mode 100644 index 000000000..0b3d8db9f --- /dev/null +++ b/lib/pangea/activity_sessions/activity_session_chat/saved_activity_analytics_dialog.dart @@ -0,0 +1,86 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +import 'package:cached_network_image/cached_network_image.dart'; + +import 'package:fluffychat/config/app_config.dart'; +import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pangea/analytics_page/analytics_page_constants.dart'; + +class SavedActivityAnalyticsDialog extends StatelessWidget { + const SavedActivityAnalyticsDialog({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return BackdropFilter( + filter: ImageFilter.blur(sigmaX: 2.5, sigmaY: 2.5), + child: Dialog( + backgroundColor: Theme.of(context).colorScheme.surfaceContainerHigh, + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: 300.0, + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(12.0), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + spacing: 16.0, + mainAxisSize: MainAxisSize.min, + children: [ + Column( + spacing: 10.0, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + L10n.of(context).niceJob, + style: const TextStyle(fontSize: 12.0), + ), + Text( + L10n.of(context).activityCompletedDesc, + style: const TextStyle(fontSize: 8.0), + textAlign: TextAlign.center, + ), + ], + ), + CachedNetworkImage( + imageUrl: + "${AppConfig.assetsBaseURL}/${AnalyticsPageConstants.dinoBotFileName}", + errorWidget: (context, e, s) => const SizedBox.shrink(), + progressIndicatorBuilder: (context, _, __) => + const SizedBox.shrink(), + width: 100.0, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.primaryContainer, + foregroundColor: + Theme.of(context).colorScheme.onPrimaryContainer, + padding: const EdgeInsets.all(4.0), + ), + onPressed: () => Navigator.of(context).pop(true), + child: Row( + spacing: 4.0, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.map_outlined, size: 12.0), + Text( + L10n.of(context).continueText, + style: const TextStyle(fontSize: 12.0), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pangea/activity_sessions/activity_user_summaries_widget.dart b/lib/pangea/activity_sessions/activity_user_summaries_widget.dart index 3c9bc110d..ae8a17e04 100644 --- a/lib/pangea/activity_sessions/activity_user_summaries_widget.dart +++ b/lib/pangea/activity_sessions/activity_user_summaries_widget.dart @@ -91,18 +91,21 @@ class ButtonControlledCarouselView extends StatelessWidget { final availableRoles = room.activityPlan!.roles; final assignedRoles = room.assignedRoles ?? {}; - final userSummaries = summary.participants.where( - (p) => assignedRoles.values.any( - (role) => role.userId == p.participantId, - ), - ); + final userSummaries = summary.participants + .where( + (p) => assignedRoles.values.any( + (role) => role.userId == p.participantId, + ), + ) + .toList(); + return Column( children: [ SizedBox( - height: 175.0, + height: 200.0, child: ListView( + shrinkWrap: true, controller: controller.carouselController, - itemExtent: 250, scrollDirection: Axis.horizontal, children: userSummaries.mapIndexed((i, p) { final user = room.getParticipants().firstWhereOrNull( @@ -125,6 +128,7 @@ class ButtonControlledCarouselView extends StatelessWidget { ), ), child: Column( + spacing: 4.0, mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -148,9 +152,13 @@ class ButtonControlledCarouselView extends StatelessWidget { ), ], ), - Text( - p.feedback, - style: const TextStyle(fontSize: 8.0), + Flexible( + child: SingleChildScrollView( + child: Text( + p.feedback, + style: const TextStyle(fontSize: 8.0), + ), + ), ), Row( spacing: 14.0,