import 'package:flutter_secure_storage/flutter_secure_storage.dart'; class StoredCredentials { final String relayUrl; final String token; final String? pubkey; final String? nsec; const StoredCredentials({ required this.relayUrl, required this.token, this.pubkey, this.nsec, }); } class CredentialStorage { static const _keyRelayUrl = 'sprout_relay_url'; static const _keyToken = 'sprout_token'; static const _keyPubkey = 'sprout_pubkey'; static const _keyNsec = 'sprout_nsec'; final FlutterSecureStorage _storage; CredentialStorage([FlutterSecureStorage? storage]) : _storage = storage ?? const FlutterSecureStorage(); Future load() async { final relayUrl = await _storage.read(key: _keyRelayUrl); final token = await _storage.read(key: _keyToken); if (relayUrl == null || token == null) return null; final pubkey = await _storage.read(key: _keyPubkey); final nsec = await _storage.read(key: _keyNsec); return StoredCredentials( relayUrl: relayUrl, token: token, pubkey: pubkey, nsec: nsec, ); } Future save(StoredCredentials credentials) async { await _storage.write(key: _keyRelayUrl, value: credentials.relayUrl); await _storage.write(key: _keyToken, value: credentials.token); if (credentials.pubkey != null) { await _storage.write(key: _keyPubkey, value: credentials.pubkey); } if (credentials.nsec != null) { await _storage.write(key: _keyNsec, value: credentials.nsec); } } Future clear() async { await _storage.delete(key: _keyRelayUrl); await _storage.delete(key: _keyToken); await _storage.delete(key: _keyPubkey); await _storage.delete(key: _keyNsec); } }