import '../vault.dart'; /// A recently opened or favorite file. Stored encrypted in the Vault (it /// can name servers and paths); never exported with profiles. class RecentFile { final String key, kind, name, location; final Map source; final DateTime opened; const RecentFile({ required this.key, required this.kind, required this.name, required this.location, required this.source, required this.opened, }); factory RecentFile.fromJson(Map m) => RecentFile( key: m['key'] as String, kind: m['kind'] as String, name: m['name'] as String, location: m['location'] as String? ?? '', source: Map.from(m['source'] as Map? ?? const {}), opened: DateTime.fromMillisecondsSinceEpoch(m['opened'] as int? ?? 0), ); Map toJson() => { 'key': key, 'kind': kind, 'name': name, 'location': location, 'source': source, 'opened': opened.millisecondsSinceEpoch, }; } class RecentFiles { static const section = 'documents', limit = 50; final Vault vault; RecentFiles(this.vault); Map get _data => vault.section(section); List get recent => [ for (final m in (_data['recent'] as List? ?? const [])) RecentFile.fromJson(m as Map), ]; List get favorites => [ for (final m in (_data['favorites'] as List? ?? const [])) RecentFile.fromJson(m as Map), ]; bool isFavorite(String key) => favorites.any((f) => f.key == key); Future touch(RecentFile file) { final data = _data; final list = [ file.toJson(), for (final m in (data['recent'] as List? ?? const [])) if ((m as Map)['key'] != file.key) m, ].take(limit).toList(); return vault.setSection(section, {...data, 'recent': list}); } Future setFavorite(RecentFile file, bool favorite) { final data = _data; final list = [ if (favorite) file.toJson(), for (final m in (data['favorites'] as List? ?? const [])) if ((m as Map)['key'] != file.key) m, ]; return vault.setSection(section, {...data, 'favorites': list}); } Future remove(String key) { final data = _data; return vault.setSection(section, { ...data, 'recent': [ for (final m in (data['recent'] as List? ?? const [])) if ((m as Map)['key'] != key) m, ], }); } Future clear() => vault.setSection(section, {..._data, 'recent': const []}); }