diff --git a/lib/pangea/controllers/practice_activity_generation_controller.dart b/lib/pangea/controllers/practice_activity_generation_controller.dart index 410f8eeaa..c7238c9cc 100644 --- a/lib/pangea/controllers/practice_activity_generation_controller.dart +++ b/lib/pangea/controllers/practice_activity_generation_controller.dart @@ -19,7 +19,7 @@ import 'package:matrix/matrix.dart'; /// Represents an item in the completion cache. class _RequestCacheItem { MessageActivityRequest req; - PracticeActivityModel? practiceActivity; + PracticeActivityModelResponse? practiceActivity; _RequestCacheItem({ required this.req, @@ -99,7 +99,7 @@ class PracticeGenerationController { //TODO - allow return of activity content before sending the event // this requires some downstream changes to the way the event is handled - Future getPracticeActivity( + Future getPracticeActivity( MessageActivityRequest req, PangeaMessageEvent event, ) async { @@ -119,6 +119,8 @@ class PracticeGenerationController { return null; } + final eventCompleter = Completer(); + // if the server points to an existing event, return that event if (res.existingActivityEventId != null) { final Event? existingEvent = @@ -127,11 +129,19 @@ class PracticeGenerationController { debugPrint( 'Existing activity event found: ${existingEvent?.content}', ); - if (existingEvent != null) { - return PracticeActivityEvent( + debugPrint( + "eventID: ${existingEvent?.eventId}, event is redacted: ${existingEvent?.redacted}", + ); + if (existingEvent != null && !existingEvent.redacted) { + final activityEvent = PracticeActivityEvent( event: existingEvent, timeline: event.timeline, - ).practiceActivity; + ); + eventCompleter.complete(activityEvent); + return PracticeActivityModelResponse( + activity: activityEvent.practiceActivity, + eventCompleter: eventCompleter, + ); } } @@ -141,11 +151,30 @@ class PracticeGenerationController { } debugPrint('Activity generated: ${res.activity!.toJson()}'); + _sendAndPackageEvent(res.activity!, event).then((event) { + eventCompleter.complete(event); + }); + + final responseModel = PracticeActivityModelResponse( + activity: res.activity!, + eventCompleter: eventCompleter, + ); - _sendAndPackageEvent(res.activity!, event); - _cache[cacheKey] = - _RequestCacheItem(req: req, practiceActivity: res.activity!); + _cache[cacheKey] = _RequestCacheItem( + req: req, + practiceActivity: responseModel, + ); - return _cache[cacheKey]!.practiceActivity; + return responseModel; } } + +class PracticeActivityModelResponse { + final PracticeActivityModel? activity; + final Completer eventCompleter; + + PracticeActivityModelResponse({ + required this.activity, + required this.eventCompleter, + }); +} diff --git a/lib/pangea/widgets/practice_activity/practice_activity_card.dart b/lib/pangea/widgets/practice_activity/practice_activity_card.dart index 1e97f2fe2..00b11f658 100644 --- a/lib/pangea/widgets/practice_activity/practice_activity_card.dart +++ b/lib/pangea/widgets/practice_activity/practice_activity_card.dart @@ -3,6 +3,7 @@ import 'dart:developer'; import 'package:fluffychat/pangea/controllers/my_analytics_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; +import 'package:fluffychat/pangea/controllers/practice_activity_generation_controller.dart'; import 'package:fluffychat/pangea/enum/activity_type_enum.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/practice_activity_event.dart'; @@ -45,6 +46,8 @@ class PracticeActivityCard extends StatefulWidget { class PracticeActivityCardState extends State { PracticeActivityModel? currentActivity; + Completer? currentActivityCompleter; + PracticeActivityRecordModel? currentCompletionRecord; bool fetchingActivity = false; @@ -133,9 +136,9 @@ class PracticeActivityCardState extends State { return null; } - final PracticeActivityModel? ourNewActivity = await pangeaController - .practiceGenerationController - .getPracticeActivity( + final PracticeActivityModelResponse? activityResponse = + await pangeaController.practiceGenerationController + .getPracticeActivity( MessageActivityRequest( userL1: pangeaController.languageController.userL1!.langCode, userL2: pangeaController.languageController.userL2!.langCode, @@ -157,9 +160,10 @@ class PracticeActivityCardState extends State { widget.pangeaMessageEvent, ); + currentActivityCompleter = activityResponse?.eventCompleter; _updateFetchingActivity(false); - return ourNewActivity; + return activityResponse?.activity; } catch (e, s) { debugger(when: kDebugMode); ErrorHandler.logError( @@ -255,12 +259,27 @@ class PracticeActivityCardState extends State { /// clear the current activity, record, and selection /// fetch a new activity, including the offending activity in the request - void submitFeedback(String feedback) { - if (currentActivity == null) { + Future submitFeedback(String feedback) async { + if (currentActivity == null || currentCompletionRecord == null) { debugger(when: kDebugMode); return; } + if (currentActivityCompleter != null) { + final activityEvent = await currentActivityCompleter!.future; + await activityEvent?.event.redactEvent(reason: feedback); + } else { + debugger(when: kDebugMode); + ErrorHandler.logError( + e: Exception('No completer found for current activity'), + data: { + 'activity': currentActivity, + 'record': currentCompletionRecord, + 'feedback': feedback, + }, + ); + } + _fetchNewActivity( ActivityQualityFeedback( feedbackText: feedback, diff --git a/pubspec.yaml b/pubspec.yaml index 25c564cef..ca105194e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ description: Learn a language while texting your friends. # Pangea# publish_to: none # On version bump also increase the build number for F-Droid -version: 1.23.3+3562 +version: 1.23.4+3563 environment: sdk: ">=3.0.0 <4.0.0"