import '../../../l10n/app_localizations.dart'; import 'package:flutter/material.dart'; import 'package:kmobile/features/fund_transfer/screens/tpin_set_screen.dart'; class TpinOtpScreen extends StatefulWidget { const TpinOtpScreen({super.key}); @override State createState() => _TpinOtpScreenState(); } class _TpinOtpScreenState extends State { final List _focusNodes = List.generate(4, (_) => FocusNode()); final List _controllers = List.generate( 4, (_) => TextEditingController(), ); @override void dispose() { for (final node in _focusNodes) { node.dispose(); } for (final ctrl in _controllers) { ctrl.dispose(); } super.dispose(); } void _onOtpChanged(int idx, String value) { if (value.length == 1 && idx < 3) { _focusNodes[idx + 1].requestFocus(); } if (value.isEmpty && idx > 0) { _focusNodes[idx - 1].requestFocus(); } setState(() {}); } String get _enteredOtp => _controllers.map((c) => c.text).join(); void _verifyOtp() { if (_enteredOtp == '0000') { Navigator.pushReplacement( context, MaterialPageRoute(builder: (_) => TpinSetScreen()), ); } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(AppLocalizations.of(context).invalidOtp)), ); } } @override Widget build(BuildContext context) { final theme = Theme.of(context); return Scaffold( appBar: AppBar( title: Text(AppLocalizations.of(context).enterOtp), centerTitle: true, elevation: 0, ), body: Center( child: SingleChildScrollView( child: Column( // mainAxisSize: MainAxisSize.min, children: [ Icon( Icons.lock_outline, size: 48, color: theme.colorScheme.primary, ), const SizedBox(height: 16), Text( AppLocalizations.of(context).otpVerification, style: theme.textTheme.titleLarge?.copyWith( fontWeight: FontWeight.bold, color: theme.colorScheme.primary, ), ), const SizedBox(height: 8), Text( AppLocalizations.of(context).otpSentMessage, textAlign: TextAlign.center, style: theme.textTheme.bodyMedium?.copyWith( color: Colors.grey[700], ), ), const SizedBox(height: 32), Row( mainAxisAlignment: MainAxisAlignment.center, children: List.generate(4, (i) { return Container( width: 48, margin: const EdgeInsets.symmetric(horizontal: 8), child: TextField( controller: _controllers[i], focusNode: _focusNodes[i], keyboardType: TextInputType.number, textAlign: TextAlign.center, maxLength: 1, obscureText: true, obscuringCharacter: '⬤', decoration: InputDecoration( counterText: '', filled: true, fillColor: Colors.blue[50], border: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide( color: theme.colorScheme.primary, width: 2, ), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(12), borderSide: BorderSide( color: theme.colorScheme.primary, width: 2.5, ), ), ), onChanged: (val) => _onOtpChanged(i, val), ), ); }), ), const SizedBox(height: 32), ElevatedButton.icon( icon: const Icon(Icons.verified_user_rounded), label: Text( AppLocalizations.of(context).verifyOtp, style: TextStyle(fontSize: 18, fontWeight: FontWeight.w600), ), style: ElevatedButton.styleFrom( backgroundColor: theme.colorScheme.primary, padding: const EdgeInsets.symmetric( vertical: 14, horizontal: 28, ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(30), ), ), onPressed: _enteredOtp.length == 4 ? _verifyOtp : null, ), const SizedBox(height: 16), TextButton( onPressed: () { // Resend OTP logic here ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(AppLocalizations.of(context).otpResent), ), ); }, child: Text(AppLocalizations.of(context).resendOtp), ), const SizedBox(height: 60), ], ), ), ), ); } }