import 'dart:async'; import 'dart:convert'; import 'dart:developer'; import 'package:mnemo_cards_common/mnemo_cards_common.dart'; import 'package:rxdart/rxdart.dart'; import '../../main.dart'; class PreviewPackHolder { final StreamController _streamController = StreamController.broadcast(); PreviewPackState? _state; PreviewPackHolder(); Future init() async { if (_state == null) { await loadFromCache(); } } Future loadFromCache() async { final sp = globalSharedPreferences; final previewPacksStrings = sp.getStringList('preview_packs'); if (previewPacksStrings == null || previewPacksStrings.isEmpty) { return; } final List previewPacks = []; previewPacksStrings.forEach((string) { try { final pack = string.decode(CardPackPreviewDto.fromJson); previewPacks.add(pack); } catch (e, s) { log('Cant load preview pack', error: e, stackTrace: s); } }); setPreviewPacks(previewPacks); } Future savePreviewPacks() async { final packs = state?.previewPacks ?? []; final stringsList = []; 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 packs, {bool save = false}) { _state = PreviewPackState(packs); if (save) { savePreviewPacks(); } _streamController.add(_state); } void clear() { _state = null; _streamController.add(_state); } PreviewPackState? get state => _state; Stream get asStream => _streamController.stream.startWith(_state); } class PreviewPackState { final List previewPacks; PreviewPackState(this.previewPacks); }