import 'package:fluffychat/pangea/analytics_data/analytics_data_service.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_use_model.dart'; import 'package:fluffychat/pangea/analytics_misc/construct_use_type_enum.dart'; import 'package:fluffychat/pangea/analytics_misc/constructs_model.dart'; import 'package:fluffychat/pangea/practice_activities/practice_target.dart'; import 'package:fluffychat/widgets/matrix.dart'; class AnalyticsPracticeAnalyticsController { final AnalyticsDataService analyticsService; const AnalyticsPracticeAnalyticsController(this.analyticsService); Future levelProgress(String language) async { final derviedData = await analyticsService.derivedData(language); return derviedData.levelProgress; } Future addCompletedActivityAnalytics( List uses, String targetId, String language, ) => analyticsService.updateService.addAnalytics(targetId, uses, language); Future addSkippedActivityAnalytics( PracticeTarget target, String language, ) async { final uses = target.tokens .map( (t) => OneConstructUse( useType: ConstructUseTypeEnum.ignPA, constructType: target.activityType.constructUsesType, metadata: ConstructUseMetaData( roomId: null, timeStamp: DateTime.now(), ), category: t.pos, lemma: t.lemma.text, form: t.lemma.text, xp: 0, ), ) .toList(); await analyticsService.updateService.addAnalytics(null, uses, language); } Future addSessionAnalytics( List uses, String language, ) async { await analyticsService.updateService.addAnalytics( null, uses, language, forceUpdate: true, ); } Future getTargetTokenConstruct( PracticeTarget target, String language, ) async { final token = target.tokens.first; final construct = target.targetTokenConstructID(token); return analyticsService.getConstructUse(construct, language); } Future waitForAnalytics() async { if (!analyticsService.initCompleter.isCompleted) { MatrixState.pangeaController.initControllers(); await analyticsService.initCompleter.future; } } Future waitForUpdate() => analyticsService .updateDispatcher .constructUpdateStream .stream .first .timeout(const Duration(seconds: 10)); }