diff --git a/lib/pangea/activity_sessions/activity_room_extension.dart b/lib/pangea/activity_sessions/activity_room_extension.dart index ed95db329..775d422d8 100644 --- a/lib/pangea/activity_sessions/activity_room_extension.dart +++ b/lib/pangea/activity_sessions/activity_room_extension.dart @@ -158,6 +158,7 @@ extension ActivityRoomExtension on Room { try { final resp = await ActivitySummaryRepo.get( + id, ActivitySummaryRequestModel( activity: activityPlan!, activityResults: messages, @@ -172,6 +173,8 @@ extension ActivityRoomExtension on Room { analytics: analytics, ), ); + + ActivitySummaryRepo.delete(id, activityPlan!); } catch (e, s) { ErrorHandler.logError( e: e, diff --git a/lib/pangea/activity_summary/activity_summary_repo.dart b/lib/pangea/activity_summary/activity_summary_repo.dart index f49014e27..aadfedcb9 100644 --- a/lib/pangea/activity_summary/activity_summary_repo.dart +++ b/lib/pangea/activity_summary/activity_summary_repo.dart @@ -1,8 +1,9 @@ +import 'dart:async'; import 'dart:convert'; -import 'package:get_storage/get_storage.dart'; import 'package:http/http.dart'; +import 'package:fluffychat/pangea/activity_planner/activity_plan_model.dart'; import 'package:fluffychat/pangea/activity_summary/activity_summary_request_model.dart'; import 'package:fluffychat/pangea/activity_summary/activity_summary_response_model.dart'; import 'package:fluffychat/pangea/common/config/environment.dart'; @@ -10,31 +11,49 @@ import 'package:fluffychat/pangea/common/network/requests.dart'; import 'package:fluffychat/pangea/common/network/urls.dart'; import 'package:fluffychat/widgets/matrix.dart'; -class ActivitySummaryRepo { - static final GetStorage _activitySummaryStorage = - GetStorage('activity_summary_storage'); +class _ActivitySummaryCacheItem { + final Completer completer; + final DateTime timestamp; - static void set( - ActivitySummaryRequestModel request, - ActivitySummaryResponseModel response, - ) { - _activitySummaryStorage.write(_storageKey(request), response.toJson()); - } + _ActivitySummaryCacheItem(this.completer) : timestamp = DateTime.now(); +} - static String _storageKey(ActivitySummaryRequestModel request) { - // You may want to customize this key based on request fields - return request.activity.hashCode.toString(); +class ActivitySummaryRepo { + static final Map _cache = {}; + static const Duration cacheDuration = Duration(minutes: 10); + + static String _storageKey(String roomId, ActivityPlanModel activity) { + return '${roomId}_${activity.hashCode}'; } static Future get( + String roomId, ActivitySummaryRequestModel request, ) async { - final cachedJson = _activitySummaryStorage.read(_storageKey(request)); - if (cachedJson != null) { - final cached = ActivitySummaryResponseModel.fromJson(cachedJson); - return cached; + final storageKey = _storageKey(roomId, request.activity); + final cached = _cache[storageKey]; + if (cached != null) { + return _cache[storageKey]!.completer.future; + } + + _cache[storageKey] = _ActivitySummaryCacheItem( + Completer(), + ); + + try { + final response = await _fetch(request); + _cache[storageKey]!.completer.complete(response); + return response; + } catch (e) { + _cache[storageKey]!.completer.completeError(e); + _cache.remove(storageKey); + rethrow; } + } + static Future _fetch( + ActivitySummaryRequestModel request, + ) async { final Requests req = Requests( choreoApiKey: Environment.choreoApiKey, accessToken: MatrixState.pangeaController.userController.accessToken, @@ -46,10 +65,14 @@ class ActivitySummaryRepo { ); final decodedBody = jsonDecode(utf8.decode(res.bodyBytes)); - final response = ActivitySummaryResponseModel.fromJson(decodedBody); - - set(request, response); + return ActivitySummaryResponseModel.fromJson(decodedBody); + } - return response; + static void delete( + String roomId, + ActivityPlanModel activity, + ) async { + final storageKey = _storageKey(roomId, activity); + _cache.remove(storageKey); } }