import 'package:flutter/material.dart'; import 'package:kmobile/api/services/auth_service.dart'; import 'package:kmobile/di/injection.dart'; import 'package:kmobile/features/fund_transfer/screens/tpin_prompt_screen.dart'; import '../../../l10n/app_localizations.dart'; class TransactionPinScreen extends StatefulWidget { final Future Function(BuildContext, String) onPinCompleted; const TransactionPinScreen({super.key, required this.onPinCompleted}); @override State createState() => _TransactionPinScreenState(); } class _TransactionPinScreenState extends State { final List _pin = []; bool _loading = true; bool _isSubmitting = false; @override void initState() { super.initState(); _checkIfTpinIsSet(); } Future _checkIfTpinIsSet() async { setState(() => _loading = true); try { final authService = getIt(); final isSet = await authService.checkTpin(); if (!isSet && mounted) { Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => const TpinSetupPromptScreen()), ); } else if (mounted) { setState(() => _loading = false); } } catch (e) { if (mounted) { setState(() => _loading = false); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(AppLocalizations.of(context).tpinStatusFailed), ), ); } } } void _onKeyPressed(String value) { if (_isSubmitting) return; setState(() { if (value == 'back') { if (_pin.isNotEmpty) _pin.removeLast(); } else if (_pin.length < 6) { _pin.add(value); } }); } Future _submitPin() async { if (_isSubmitting) return; if (_pin.length == 6) { setState(() => _isSubmitting = true); try { await widget.onPinCompleted(context, _pin.join()); } finally { if (mounted) { setState(() => _isSubmitting = false); } } } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(AppLocalizations.of(context).enter6DigitTpin), ), ); } } Widget _buildPinIndicators() { return Row( mainAxisAlignment: MainAxisAlignment.center, children: List.generate(6, (index) { return Container( margin: const EdgeInsets.symmetric(horizontal: 8), width: 20, height: 20, decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all(color: Theme.of(context).primaryColor, width: 2), color: index < _pin.length ? Theme.of(context).colorScheme.primary : Colors.transparent, ), ); }), ); } Widget _buildKey(String label, {IconData? icon}) { return Expanded( child: InkWell( onTap: () => label == 'done' ? _submitPin() : _onKeyPressed(label), child: Padding( padding: const EdgeInsets.symmetric(vertical: 20), child: Center( child: _isSubmitting && label == 'done' ? const CircularProgressIndicator() : icon != null ? Icon(icon, size: 28) : Text(label, style: const TextStyle(fontSize: 24)), ), ), ), ); } Widget _buildKeypad() { return Column( mainAxisSize: MainAxisSize.min, children: [ Row(children: [_buildKey('1'), _buildKey('2'), _buildKey('3')]), Row(children: [_buildKey('4'), _buildKey('5'), _buildKey('6')]), Row(children: [_buildKey('7'), _buildKey('8'), _buildKey('9')]), Row( children: [ _buildKey('done', icon: Icons.check), _buildKey('0'), _buildKey('back', icon: Icons.backspace_outlined), ], ), ], ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(AppLocalizations.of(context).tpin), centerTitle: false, ), body: _loading ? const Center(child: CircularProgressIndicator()) : Padding( padding: const EdgeInsets.only(bottom: 20.0), child: Column( children: [ const Spacer(), Text( AppLocalizations.of(context).enterTpin, style: const TextStyle(fontSize: 18), ), const SizedBox(height: 20), _buildPinIndicators(), const Spacer(), _buildKeypad(), ], ), ), ); } }