flutter-freaccess-hub/lib/shared/helpers/secure_storage_helper.dart

113 lines
3.5 KiB
Dart

import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:hub/shared/utils/storage_util.dart';
import 'package:hub/shared/utils/cache_util.dart';
class SecureStorageHelper extends ChangeNotifier implements Storage {
static final SecureStorageHelper _instance = SecureStorageHelper._internal();
final FlutterSecureStorage _secureStorage = const FlutterSecureStorage();
factory SecureStorageHelper() => _instance;
SecureStorageHelper._internal();
static SecureStorageHelper get instance => _instance;
Future<void> setAndCacheString(
String key, String value, Function(String) cacheSetter) async {
log('setAndCacheString value for key: $key to $value');
await _secureStorage.write(key: key, value: value);
CacheUtil.instance.set(key, value);
cacheSetter(value);
}
Future<void> setAndCacheBool(
String key, bool value, Function(bool) cacheSetter) async {
log('setAndCacheBool value for key: $key to $value');
await _secureStorage.write(key: key, value: value.toString());
CacheUtil.instance.set(key, value);
cacheSetter(value);
}
Future<void> setAndCacheObject(
String key, String value, Function(String) cacheSetter) async {
log('setAndCacheObject value for key: $key to $value');
await _secureStorage.write(key: key, value: value);
CacheUtil.instance.set(key, value);
cacheSetter(value);
}
Future<String?> getString(String key) async {
log('getString value for key: $key');
var value = CacheUtil.instance.get(key);
if (value == null) {
value = await _secureStorage.read(key: key);
CacheUtil.instance.set(key, value);
}
return value;
}
Future<bool?> getBool(String key) async {
var value = CacheUtil.instance.get(key);
if (value == null || value == 'null') {
value = await _secureStorage.read(key: key);
CacheUtil.instance.set(key, value);
log('getBool $value for key: $key');
return value == 'true';
}
log('getBool $value for key: $key');
return value;
}
Future<BuildContext?> getObject(String key) async {
log('getObject value for key: $key');
var value = CacheUtil.instance.get(key);
if (value == null) {
value = await _secureStorage.read(key: key);
CacheUtil.instance.set(key, value);
}
return value as BuildContext?;
}
@override
Future<void> set(
String key, dynamic value, Function(dynamic) cacheSetter) async {
if (value is String? || value is String) {
await setAndCacheString(key, value!, cacheSetter);
} else if (value is bool? || value is bool) {
await setAndCacheBool(key, value, cacheSetter);
} else if (value is BuildContext || value is BuildContext?) {
await setAndCacheObject(key, value.toString(), cacheSetter);
}
}
@override
Future<dynamic> get(String key) async {
log('get value for key: $key');
var stringValue = await getString(key);
if (stringValue != null) return stringValue;
var boolValue = await getBool(key);
if (boolValue != null) return boolValue;
var objectValue = await getObject(key);
if (objectValue != null) return objectValue;
return null;
}
@override
Future<void> delete(String key) async {
log('delete value for key: $key');
await _secureStorage.delete(key: key);
CacheUtil.instance.delete(key);
}
Future<void> purge() async {
log('Purging secure storage');
await _secureStorage.deleteAll();
CacheUtil.instance.clear();
}
}