mnemo_cards/lib/features/packs/preview_pack_holder.dart

81 lines
2 KiB
Dart
Raw Normal View History

2024-05-22 20:48:44 +00:00
import 'dart:async';
2024-05-28 21:25:51 +00:00
import 'dart:convert';
import 'dart:developer';
2024-05-22 20:48:44 +00:00
import 'package:mnemo_cards_common/mnemo_cards_common.dart';
2024-06-12 23:00:13 +00:00
2024-05-22 20:48:44 +00:00
import 'package:rxdart/rxdart.dart';
2024-05-28 21:25:51 +00:00
import '../../main.dart';
2024-05-22 20:48:44 +00:00
class PreviewPackHolder {
final StreamController<PreviewPackState?> _streamController =
2024-08-18 16:52:03 +00:00
StreamController.broadcast(sync: true);
2024-05-22 20:48:44 +00:00
PreviewPackState? _state;
PreviewPackHolder();
2024-05-28 21:25:51 +00:00
Future<void> init() async {
if (_state == null) {
await loadFromCache();
}
}
Future<void> loadFromCache() async {
final sp = globalSharedPreferences;
final previewPacksStrings = sp.getStringList('preview_packs');
if (previewPacksStrings == null || previewPacksStrings.isEmpty) {
return;
}
final List<CardPackPreviewDto> previewPacks = [];
previewPacksStrings.forEach((string) {
try {
2024-06-12 23:00:13 +00:00
final pack = string.decode(CardPackPreviewDto.fromJson);
2024-05-28 21:25:51 +00:00
previewPacks.add(pack);
} catch (e, s) {
log('Cant load preview pack', error: e, stackTrace: s);
}
});
setPreviewPacks(previewPacks);
}
Future<void> savePreviewPacks() async {
final packs = state?.previewPacks ?? [];
final stringsList = <String>[];
packs.forEach((pack) {
try {
final string = jsonEncode(pack);
stringsList.add(string);
} catch (e, s) {
log('Cant load preview pack', error: e, stackTrace: s);
}
});
final sp = globalSharedPreferences;
sp.setStringList('preview_packs', stringsList);
}
void setPreviewPacks(List<CardPackPreviewDto> packs, {bool save = false}) {
2024-05-22 20:48:44 +00:00
_state = PreviewPackState(packs);
2024-05-28 21:25:51 +00:00
if (save) {
savePreviewPacks();
}
2024-05-22 20:48:44 +00:00
_streamController.add(_state);
}
void clear() {
_state = null;
_streamController.add(_state);
}
PreviewPackState? get state => _state;
Stream<PreviewPackState?> get asStream =>
_streamController.stream.startWith(_state);
}
class PreviewPackState {
final List<CardPackPreviewDto> previewPacks;
PreviewPackState(this.previewPacks);
}