You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.5 KiB
Dart
125 lines
3.5 KiB
Dart
import 'dart:async';
|
|
import 'dart:developer';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
|
import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart';
|
|
import 'package:fluffychat/pangea/learning_settings/models/language_model.dart';
|
|
import 'package:fluffychat/pangea/learning_settings/repo/language_repo.dart';
|
|
import 'shared_prefs.dart';
|
|
|
|
class PLanguageStore {
|
|
PLanguageStore() {
|
|
initialize();
|
|
}
|
|
|
|
static List<LanguageModel> _langList = [];
|
|
|
|
List<LanguageModel> get langList => _langList;
|
|
|
|
List<LanguageModel> get targetOptions =>
|
|
_langList.where((element) => element.l2).toList();
|
|
|
|
List<LanguageModel> get baseOptions => _langList.toList();
|
|
|
|
static Future<void> initialize({forceRefresh = false}) async {
|
|
try {
|
|
_langList = await _getCachedLanguages();
|
|
if (forceRefresh ||
|
|
await _shouldFetch ||
|
|
_langList.isEmpty ||
|
|
_langList.every((lang) => !lang.l2)) {
|
|
_langList = await LanguageRepo.fetchLanguages();
|
|
|
|
await _saveLanguages(_langList);
|
|
await saveLastFetchDate();
|
|
}
|
|
_langList.removeWhere(
|
|
(element) => element.langCode == LanguageKeys.unknownLanguage,
|
|
);
|
|
// remove any duplicates
|
|
_langList = _langList.toSet().toList();
|
|
|
|
_langList.sort((a, b) => a.displayName.compareTo(b.displayName));
|
|
} catch (err, stack) {
|
|
debugger(when: kDebugMode);
|
|
ErrorHandler.logError(
|
|
e: err,
|
|
s: stack,
|
|
data: {
|
|
"langList": _langList.map((e) => e.toJson()),
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
static saveLastFetchDate() async {
|
|
final String now = DateTime.now().toIso8601String();
|
|
await MyShared.saveString(PrefKey.lastFetched, now);
|
|
}
|
|
|
|
static Future<bool> get _shouldFetch async {
|
|
final String? dateString = await MyShared.readString(PrefKey.lastFetched);
|
|
if (dateString == null) {
|
|
return true;
|
|
}
|
|
// return true;
|
|
final DateTime lastFetchedDate = DateTime.parse(dateString);
|
|
final DateTime targetDate = DateTime(2025, 2, 26);
|
|
if (lastFetchedDate.isBefore(targetDate)) {
|
|
return true;
|
|
}
|
|
|
|
final int lastFetched = DateTime.parse(dateString).millisecondsSinceEpoch;
|
|
final int now = DateTime.now().millisecondsSinceEpoch;
|
|
const int fetchIntervalInMilliseconds = 86534601;
|
|
return (now - lastFetched) >= fetchIntervalInMilliseconds ? true : false;
|
|
}
|
|
|
|
static Future<void> _saveLanguages(List<LanguageModel> languages) async {
|
|
final Map languagesMaps = {
|
|
PrefKey.languagesKey: languages.map((e) => e.toJson()).toList(),
|
|
};
|
|
await MyShared.saveJson(PrefKey.languagesKey, languagesMaps);
|
|
}
|
|
|
|
static Future<List<LanguageModel>> _getCachedLanguages() async {
|
|
final Map<dynamic, dynamic>? languagesMap =
|
|
await MyShared.readJson(PrefKey.languagesKey);
|
|
if (languagesMap == null) {
|
|
return [];
|
|
}
|
|
|
|
final List<LanguageModel> languages = [];
|
|
final List mapList = languagesMap[PrefKey.languagesKey] as List;
|
|
for (final element in mapList) {
|
|
languages.add(LanguageModel.fromJson(element));
|
|
}
|
|
|
|
return languages;
|
|
}
|
|
|
|
static LanguageModel? byLangCode(String langCode) {
|
|
for (final element in _langList) {
|
|
if (element.langCode == langCode) return element;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
static final List<String> rtlLanguageCodes = [
|
|
'ar',
|
|
'arc',
|
|
'dv',
|
|
'fa',
|
|
'ha',
|
|
'he',
|
|
'khw',
|
|
'ks',
|
|
'ku',
|
|
'ps',
|
|
'ur',
|
|
'yi',
|
|
];
|
|
}
|