fluffychat/lib/pangea/analytics_practice/analytics_practice_analytics_controller.dart
ggurdin 117a03089e
5720 vocab practice should have feedback flag (#5761)
* chore: split up analytics activity page widgets into separate files

* started analytics practice refactor

* refactor how UI updates are triggered in analytics practice page

* some fixes
2026-02-20 13:25:21 -05:00

78 lines
2.5 KiB
Dart

import 'package:fluffychat/pangea/analytics_data/analytics_data_service.dart';
import 'package:fluffychat/pangea/analytics_misc/construct_type_enum.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/events/models/pangea_token_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<double> levelProgress(String language) async {
final derviedData = await analyticsService.derivedData(language);
return derviedData.levelProgress;
}
Future<void> addCompletedActivityAnalytics(
List<OneConstructUse> uses,
String targetId,
String language,
) => analyticsService.updateService.addAnalytics(targetId, uses, language);
Future<void> addSkippedActivityAnalytics(
PangeaToken token,
ConstructTypeEnum type,
String language,
) async {
final use = OneConstructUse(
useType: ConstructUseTypeEnum.ignPA,
constructType: type,
metadata: ConstructUseMetaData(roomId: null, timeStamp: DateTime.now()),
category: token.pos,
lemma: token.lemma.text,
form: token.lemma.text,
xp: 0,
);
await analyticsService.updateService.addAnalytics(null, [use], language);
}
Future<void> addSessionAnalytics(
List<OneConstructUse> uses,
String language,
) async {
await analyticsService.updateService.addAnalytics(
null,
uses,
language,
forceUpdate: true,
);
}
Future<ConstructUses> getTargetTokenConstruct(
PracticeTarget target,
String language,
) async {
final token = target.tokens.first;
final construct = target.targetTokenConstructID(token);
return analyticsService.getConstructUse(construct, language);
}
Future<void> waitForAnalytics() async {
if (!analyticsService.initCompleter.isCompleted) {
MatrixState.pangeaController.initControllers();
await analyticsService.initCompleter.future;
}
}
Future<void> waitForUpdate() => analyticsService
.updateDispatcher
.constructUpdateStream
.stream
.first
.timeout(const Duration(seconds: 10));
}