QoL changes
All checks were successful
All checks were successful
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
/// Stores the auth token in secure storage and falls back to SharedPreferences
|
||||
/// so debug builds and platforms without a working keyring still persist.
|
||||
class TokenStorageService {
|
||||
// Singleton pattern (optional but usually handy for services)
|
||||
TokenStorageService._internal();
|
||||
|
||||
static final TokenStorageService _instance = TokenStorageService._internal();
|
||||
@@ -9,26 +11,45 @@ class TokenStorageService {
|
||||
factory TokenStorageService() => _instance;
|
||||
|
||||
static const _tokenKey = 'auth_token';
|
||||
final FlutterSecureStorage _secureStorage = const FlutterSecureStorage();
|
||||
|
||||
// Use const constructor for secure storage
|
||||
final FlutterSecureStorage _storage = const FlutterSecureStorage();
|
||||
Future<SharedPreferences> get _prefs async =>
|
||||
await SharedPreferences.getInstance();
|
||||
|
||||
/// Save or update the token
|
||||
Future<void> setToken(String token) async {
|
||||
await _storage.write(key: _tokenKey, value: token);
|
||||
try {
|
||||
await _secureStorage.write(key: _tokenKey, value: token);
|
||||
} catch (_) {
|
||||
// ignore secure storage failures in debug/unsupported environments
|
||||
}
|
||||
final prefs = await _prefs;
|
||||
await prefs.setString(_tokenKey, token);
|
||||
}
|
||||
|
||||
/// Retrieve the stored token (null if none)
|
||||
Future<String?> getToken() async {
|
||||
return _storage.read(key: _tokenKey);
|
||||
try {
|
||||
final secured = await _secureStorage.read(key: _tokenKey);
|
||||
if (secured != null && secured.isNotEmpty) {
|
||||
return secured;
|
||||
}
|
||||
} catch (_) {
|
||||
// ignore and fall back
|
||||
}
|
||||
final prefs = await _prefs;
|
||||
final token = prefs.getString(_tokenKey);
|
||||
return (token == null || token.isEmpty) ? null : token;
|
||||
}
|
||||
|
||||
/// Delete the token
|
||||
Future<void> clearToken() async {
|
||||
await _storage.delete(key: _tokenKey);
|
||||
try {
|
||||
await _secureStorage.delete(key: _tokenKey);
|
||||
} catch (_) {
|
||||
// ignore
|
||||
}
|
||||
final prefs = await _prefs;
|
||||
await prefs.remove(_tokenKey);
|
||||
}
|
||||
|
||||
/// Optional: check quickly if a token exists
|
||||
Future<bool> hasToken() async {
|
||||
final token = await getToken();
|
||||
return token != null && token.isNotEmpty;
|
||||
|
||||
Reference in New Issue
Block a user