diff --git a/lib/auth_screen.dart b/lib/auth_screen.dart index a498c40..4ed7d7e 100644 --- a/lib/auth_screen.dart +++ b/lib/auth_screen.dart @@ -21,6 +21,8 @@ class _AuthScreenState extends State { bool _busy = false; String? _error; String? _bioMsg; + bool _biometricAvailable = false; + bool _biometricEnabled = false; @override void initState() { @@ -32,10 +34,16 @@ class _AuthScreenState extends State { Future _initMode() async { final registered = await widget.auth.isRegistered(); if (!mounted) return; - setState(() => _isLogin = registered); + final avail = await widget.auth.canUseBiometrics(); + final enabled = await widget.auth.isBiometricEnabled(); + setState(() { + _isLogin = registered; + _biometricAvailable = avail; + _biometricEnabled = enabled; + }); // If already registered and biometric is enabled, prompt fingerprint // automatically (unless a valid session already skips to dashboard). - if (registered && await widget.auth.isBiometricEnabled()) { + if (registered && enabled) { final timeout = await widget.auth.getTimeoutMinutes(); final valid = await widget.auth.hasValidSession(timeout); if (!valid) { @@ -154,9 +162,25 @@ class _AuthScreenState extends State { const SizedBox(height: 12), _busy ? const CircularProgressIndicator() - : ElevatedButton( - onPressed: _submit, - child: Text(_isLogin ? 'Masuk' : 'Daftar'), + : Column( + children: [ + ElevatedButton( + onPressed: _submit, + child: Text(_isLogin ? 'Masuk' : 'Daftar'), + ), + // Biometric retry button (only when enabled + registered) + if (_isLogin && + _biometricAvailable && + _biometricEnabled) + TextButton.icon( + onPressed: () { + setState(() => _bioMsg = null); + _promptBiometricOnOpen(); + }, + icon: const Icon(Icons.fingerprint), + label: const Text('Gunakan Sidik Jari'), + ), + ], ), ], ),