import 'dart:convert'; import 'package:gopeed/util/util.dart'; import 'package:hive/hive.dart'; import 'entity.dart'; const String _startConfig = 'startConfig'; const String _windowState = 'windowState'; const String _bookmark = 'bookmark'; const String _createHistory = 'createHistory'; const String _webToken = 'webToken'; const String _runAsMenubarApp = 'runAsMenubarApp'; const String _analyticsEnabled = 'analyticsEnabled'; const String _analyticsClientId = 'analyticsClientId'; class Database { static final Database _instance = Database._internal(); static Database get instance => _instance; factory Database() { return _instance; } late Box box; Database._internal(); Future init() async { Hive.init(Util.getStorageDir()); box = await Hive.openBox('database'); } void save(String key, T entity) { box.put(key, jsonEncode(entity)); } T? get(String key, T Function(dynamic json) fromJsonT) { final json = box.get(key); if (json == null) { return null; } return fromJsonT(jsonDecode(json)); } void clear(String key) { box.delete(key); } void saveStartConfig(StartConfigEntity entity) { save(_startConfig, entity); } StartConfigEntity? getStartConfig() { return get( _startConfig, (json) => StartConfigEntity.fromJson(json)); } /// Patch non-null fields with the original value void saveWindowState(WindowStateEntity entity) { final state = getWindowState(); entity.isMaximized ??= state?.isMaximized; entity.width ??= state?.width; entity.height ??= state?.height; save(_windowState, entity); } WindowStateEntity? getWindowState() { return get( _windowState, (json) => WindowStateEntity.fromJson(json)); } /// Use map to ensure that the same directory only saves the latest bookmark void saveBookmark(MapEntry entry) { final map = getBookmark() ?? {}; map[entry.key] = entry.value; save>(_bookmark, map); } Map? getBookmark() { return get>(_bookmark, (json) { return (json as Map) .map((key, value) => MapEntry(key, value.toString())); }); } void saveWebToken(String token) { save(_webToken, token); } String? getWebToken() { return get(_webToken, (json) => json.toString()); } void saveCreateHistory(String url) { var list = getCreateHistory() ?? []; list.remove(url); list.insert(0, url); if (list.length > 64) { list.removeLast(); } save>(_createHistory, list); } List? getCreateHistory() { return get>(_createHistory, (json) { return (json as List).map((e) => e.toString()).toList(); }); } void clearCreateHistory() { clear(_createHistory); } void saveRunAsMenubarApp(bool value) { box.put(_runAsMenubarApp, value); } bool getRunAsMenubarApp() { return box.get(_runAsMenubarApp, defaultValue: false) as bool; } void saveAnalyticsEnabled(bool value) { box.put(_analyticsEnabled, value); } bool getAnalyticsEnabled() { return box.get(_analyticsEnabled, defaultValue: true) as bool; } void saveAnalyticsClientId(String clientId) { box.put(_analyticsClientId, clientId); } String? getAnalyticsClientId() { return box.get(_analyticsClientId) as String?; } }