import 'dart:convert'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:moneymgr_mobile/services/api/api_token.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'secure_storage.g.dart'; @riverpod Future secureStorage(Ref ref) => SecureStorage.getInstance(keys: {'token'}); class SecureStorage { SecureStorage._(this._flutterSecureStorage, this._cache); late final FlutterSecureStorage _flutterSecureStorage; late final Map _cache; static Future getInstance({required Set keys}) async { const flutterSecureStorage = FlutterSecureStorage(); final cache = {}; await keys .map( (key) => flutterSecureStorage.read(key: key).then((value) { if (value != null) { cache[key] = value; } }), ) .wait; return SecureStorage._(flutterSecureStorage, cache); } String? get(String key) => _cache[key]; Future set(String key, String value) { _cache[key] = value; return _flutterSecureStorage.write(key: key, value: value); } Future remove(String key) { _cache.remove(key); return _flutterSecureStorage.delete(key: key); } /// Get auth token ApiToken? token() { final tokenStr = get("token"); if (tokenStr != null) { return ApiToken.fromJson(jsonDecode(tokenStr)); } } /// Set auth token Future setToken(ApiToken token) => set("token", jsonEncode(token.toJson())); /// Remove auth token Future removeToken() => remove("token"); }