fluffychat/lib/pangea/user/analytics_profile_model.dart

154 lines
4.6 KiB
Dart

import 'package:fluffychat/pangea/common/constants/model_keys.dart';
import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart';
import 'package:fluffychat/pangea/languages/language_model.dart';
import 'package:fluffychat/pangea/languages/p_language_store.dart';
class AnalyticsProfileModel {
LanguageModel? baseLanguage;
LanguageModel? targetLanguage;
Map<LanguageModel, LanguageAnalyticsProfileEntry>? languageAnalytics;
AnalyticsProfileModel({
this.baseLanguage,
this.targetLanguage,
this.languageAnalytics,
});
factory AnalyticsProfileModel.fromJson(Map<String, dynamic> json) {
if (!json.containsKey(PangeaEventTypes.profileAnalytics)) {
return AnalyticsProfileModel();
}
final profileJson = json[PangeaEventTypes.profileAnalytics];
final baseLanguage = profileJson[ModelKey.sourceLanguage] != null
? PLanguageStore.byLangCode(profileJson[ModelKey.sourceLanguage])
: null;
final targetLanguage = profileJson[ModelKey.targetLanguage] != null
? PLanguageStore.byLangCode(profileJson[ModelKey.targetLanguage])
: null;
final languageAnalytics = <LanguageModel, LanguageAnalyticsProfileEntry>{};
if (profileJson[ModelKey.analytics] != null &&
profileJson[ModelKey.analytics]!.isNotEmpty) {
for (final entry in profileJson[ModelKey.analytics].entries) {
final lang = PLanguageStore.byLangCode(entry.key);
if (lang == null) continue;
final level = entry.value[ModelKey.level];
final xpOffset = entry.value[ModelKey.xpOffset] ?? 0;
final analyticsRoomId =
entry.value[ModelKey.analyticsRoomId] as String?;
languageAnalytics[lang] = LanguageAnalyticsProfileEntry(
level,
xpOffset,
analyticsRoomId: analyticsRoomId,
);
}
}
final profile = AnalyticsProfileModel(
baseLanguage: baseLanguage,
targetLanguage: targetLanguage,
languageAnalytics: languageAnalytics,
);
return profile;
}
Map<String, dynamic> toJson() {
final json = <String, dynamic>{};
if (targetLanguage != null) {
json[ModelKey.targetLanguage] = targetLanguage!.langCodeShort;
}
if (baseLanguage != null) {
json[ModelKey.sourceLanguage] = baseLanguage!.langCodeShort;
}
final analytics = {};
if (languageAnalytics != null && languageAnalytics!.isNotEmpty) {
for (final entry in languageAnalytics!.entries) {
analytics[entry.key.langCode] = {
ModelKey.level: entry.value.level,
ModelKey.xpOffset: entry.value.xpOffset,
if (entry.value.analyticsRoomId != null)
ModelKey.analyticsRoomId: entry.value.analyticsRoomId,
};
}
}
json[ModelKey.analytics] = analytics;
return json;
}
bool get isEmpty =>
baseLanguage == null ||
targetLanguage == null ||
(languageAnalytics == null || languageAnalytics!.isEmpty);
String? analyticsRoomIdByLanguage(LanguageModel language) =>
languageAnalytics![language]?.analyticsRoomId;
/// Set the level and analytics room ID for the a given language.
void setLanguageInfo(
LanguageModel language,
int level,
String? analyticsRoomId,
) {
languageAnalytics ??= {};
languageAnalytics![language] ??= LanguageAnalyticsProfileEntry(
0,
0,
analyticsRoomId: analyticsRoomId,
);
if (languageAnalytics![language]!.level < level) {
languageAnalytics![language]!.level = level;
}
final currentRoomId = analyticsRoomIdByLanguage(language);
if (currentRoomId != analyticsRoomId) {
languageAnalytics![language]!.analyticsRoomId = analyticsRoomId;
}
languageAnalytics![language]!.level = level;
}
void addXPOffset(
LanguageModel language,
int xpOffset,
String? analyticsRoomId,
) {
languageAnalytics ??= {};
languageAnalytics![language] ??= LanguageAnalyticsProfileEntry(
0,
0,
analyticsRoomId: analyticsRoomId,
);
final currentRoomId = analyticsRoomIdByLanguage(language);
if (currentRoomId == null) {
languageAnalytics![language]!.analyticsRoomId = analyticsRoomId;
}
languageAnalytics![language]!.xpOffset += xpOffset;
}
int? get level => languageAnalytics?[targetLanguage]?.level;
int? get xpOffset => languageAnalytics?[targetLanguage]?.xpOffset;
int? xpOffsetByLanguage(LanguageModel language) =>
languageAnalytics?[language]?.xpOffset;
}
class LanguageAnalyticsProfileEntry {
int level;
int xpOffset = 0;
String? analyticsRoomId;
LanguageAnalyticsProfileEntry(
this.level,
this.xpOffset, {
this.analyticsRoomId,
});
}