import 'dart:developer'; import 'package:hub/shared/utils/storage_util.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:hub/shared/utils/cache_util.dart'; class SharedPreferencesStorageHelper implements Storage { static final SharedPreferencesStorageHelper _instance = SharedPreferencesStorageHelper._internal(); SharedPreferences? _prefs; SharedPreferences? get prefs => _prefs; set prefs(SharedPreferences? value) => _prefs = value; factory SharedPreferencesStorageHelper() => _instance; SharedPreferencesStorageHelper._internal(); static SharedPreferencesStorageHelper get instance => _instance; bool _isFirstRun = true; bool get isFirstRun => _isFirstRun; set isFirstRun(bool value) => _setAndCacheBool('first_run', value, (v) => _isFirstRun = v); Future _setAndCache(String key, T value, Function(T) cacheSetter, Future Function(String, T) setFunc) async { log('setAndCache value for key: $key to $value'); await setFunc(key, value); CacheUtil.instance.set(key, value); cacheSetter(value); } Future _setAndCacheString(String key, String value, Function(String) cacheSetter) async { log('setAndCacheString value for key: $key to $value'); await _setAndCache(key, value, cacheSetter, _prefs!.setString); } Future _setAndCacheBool(String key, bool value, Function(bool) cacheSetter) async { log('setAndCacheBool value for key: $key to $value'); await _setAndCache(key, value, cacheSetter, _prefs!.setBool); } Future _setAndCacheInt(String key, int value, Function(int) cacheSetter) async { log('setAndCacheInt value for key: $key to $value'); await _setAndCache(key, value, cacheSetter, _prefs!.setInt); } Future _setAndCacheDouble(String key, double value, Function(double) cacheSetter) async { log('setAndCacheDouble value for key: $key to $value'); await _setAndCache(key, value, cacheSetter, _prefs!.setDouble); } Future _setAndCacheStringList(String key, List value, Function(List) cacheSetter) async { log('setAndCacheStringList value for key: $key to $value'); await _setAndCache(key, value, cacheSetter, _prefs!.setStringList); } @override Future set(String key, dynamic value, Function(dynamic) cacheSetter) async { if (value is bool) { await _prefs?.setBool(key, value); } else if (value is String) { await _prefs?.setString(key, value); } else if (value is int) { await _prefs?.setInt(key, value); } else if (value is double) { await _prefs?.setDouble(key, value); } else if (value is List) { await _prefs?.setStringList(key, value); } CacheUtil.instance.set(key, value); } @override Future get(String key) async { log('Getting value for key: $key'); var value = CacheUtil.instance.get(key); if (value == null) { value = _prefs?.get(key); CacheUtil.instance.set(key, value); } return value; } @override Future delete(String key) async { log('Deleting value for key: $key'); await _prefs?.remove(key); CacheUtil.instance.delete(key); } @override Future purge() async { log('Purging shared preferences'); await _prefs?.clear(); CacheUtil.instance.clear(); } }