diff --git a/lib/data/sources/local/credential_store.dart b/lib/data/sources/local/credential_store.dart index 16ac9ec..47030ff 100644 --- a/lib/data/sources/local/credential_store.dart +++ b/lib/data/sources/local/credential_store.dart @@ -1,10 +1,14 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import '../../../domain/models/server_config.dart'; + typedef Credentials = ({String username, String password}); class CredentialStore { static const _usernameKey = 'localiserd_username'; static const _passwordKey = 'localiserd_password'; + static const _hostKey = 'localiserd_host'; + static const _portKey = 'localiserd_port'; final _storage = const FlutterSecureStorage(); @@ -24,8 +28,28 @@ class CredentialStore { return (username: username, password: password); } + Future saveServer(ServerConfig config) => Future.wait([ + _storage.write(key: _hostKey, value: config.host), + _storage.write(key: _portKey, value: config.port.toString()), + ]).then((_) {}); + + Future loadServer() async { + final results = await Future.wait([ + _storage.read(key: _hostKey), + _storage.read(key: _portKey), + ]); + final host = results[0]; + final portStr = results[1]; + if (host == null || portStr == null) return null; + final port = int.tryParse(portStr); + if (port == null) return null; + return ServerConfig(host: host, port: port); + } + Future clear() => Future.wait([ _storage.delete(key: _usernameKey), _storage.delete(key: _passwordKey), + _storage.delete(key: _hostKey), + _storage.delete(key: _portKey), ]).then((_) {}); } diff --git a/lib/features/connection/login_screen.dart b/lib/features/connection/login_screen.dart index ff54ef7..26debb5 100644 --- a/lib/features/connection/login_screen.dart +++ b/lib/features/connection/login_screen.dart @@ -18,12 +18,6 @@ class _LoginScreenState extends ConsumerState { bool _loading = false; String? _error; - @override - void initState() { - super.initState(); - _tryAutoLogin(); - } - @override void dispose() { _usernameController.dispose(); @@ -31,18 +25,7 @@ class _LoginScreenState extends ConsumerState { super.dispose(); } - Future _tryAutoLogin() async { - final store = ref.read(credentialStoreProvider); - final saved = await store.load(); - if (saved == null || !mounted) return; - - _usernameController.text = saved.username; - _passwordController.text = saved.password; - await _login(saved.username, saved.password, saveCredentials: false); - } - - Future _login(String username, String password, - {bool saveCredentials = true}) async { + Future _login(String username, String password) async { setState(() { _loading = true; _error = null; @@ -59,11 +42,9 @@ class _LoginScreenState extends ConsumerState { await realtime.connect(); ref.read(realtimeDataClientProvider.notifier).state = realtime; - if (saveCredentials) { - await ref - .read(credentialStoreProvider) - .save((username: username, password: password)); - } + await ref + .read(credentialStoreProvider) + .save((username: username, password: password)); if (mounted) context.go('/floorplan'); } on Exception catch (e) { diff --git a/lib/features/connection/server_discovery_screen.dart b/lib/features/connection/server_discovery_screen.dart index 511d336..2d6eacd 100644 --- a/lib/features/connection/server_discovery_screen.dart +++ b/lib/features/connection/server_discovery_screen.dart @@ -59,12 +59,13 @@ class _ServerDiscoveryScreenState extends ConsumerState { await OnboardingClient(config: config).getChecklist(); ref.read(serverConfigProvider.notifier).state = config; + await ref.read(credentialStoreProvider).saveServer(config); if (!mounted) return; if (!checklist.hasAdmin) { - context.go('/onboarding'); + context.push('/onboarding'); } else { - context.go('/login'); + context.push('/login'); } } catch (e) { setState(() => _error = e.toString());