import 'package:flutter/material.dart'; import 'package:pshared/models/payment/methods/russian_bank.dart'; import 'package:pweb/generated/i18n/app_localizations.dart'; import 'package:pweb/utils/text_field_styles.dart'; class RussianBankForm extends StatefulWidget { final void Function(RussianBankAccountPaymentMethod) onChanged; final RussianBankAccountPaymentMethod? initialData; final bool isEditable; const RussianBankForm({ super.key, required this.onChanged, this.initialData, required this.isEditable, }); @override State createState() => _RussianBankFormState(); } class _RussianBankFormState extends State { final _formKey = GlobalKey(); late final TextEditingController _recipientNameController; late final TextEditingController _innController; late final TextEditingController _kppController; late final TextEditingController _bankNameController; late final TextEditingController _bikController; late final TextEditingController _accountNumberController; late final TextEditingController _correspondentAccountController; @override void initState() { super.initState(); _recipientNameController = TextEditingController(text: widget.initialData?.recipientName ?? ''); _innController = TextEditingController(text: widget.initialData?.inn ?? ''); _kppController = TextEditingController(text: widget.initialData?.kpp ?? ''); _bankNameController = TextEditingController(text: widget.initialData?.bankName ?? ''); _bikController = TextEditingController(text: widget.initialData?.bik ?? ''); _accountNumberController = TextEditingController(text: widget.initialData?.accountNumber ?? ''); _correspondentAccountController = TextEditingController(text: widget.initialData?.correspondentAccount ?? ''); WidgetsBinding.instance.addPostFrameCallback((_) => _emitIfValid()); } void _emitIfValid() { if (_formKey.currentState?.validate() ?? false) { widget.onChanged( RussianBankAccountPaymentMethod( recipientName: _recipientNameController.text, inn: _innController.text, kpp: _kppController.text, bankName: _bankNameController.text, bik: _bikController.text, accountNumber: _accountNumberController.text, correspondentAccount: _correspondentAccountController.text, ), ); } } @override void didUpdateWidget(covariant RussianBankForm oldWidget) { super.didUpdateWidget(oldWidget); final newData = widget.initialData; final oldData = oldWidget.initialData; if (newData == null && oldData != null) { _recipientNameController.clear(); _innController.clear(); _kppController.clear(); _bankNameController.clear(); _bikController.clear(); _accountNumberController.clear(); _correspondentAccountController.clear(); return; } if (newData != null && newData != oldData) { _recipientNameController.text = newData.recipientName; _innController.text = newData.inn; _kppController.text = newData.kpp; _bankNameController.text = newData.bankName; _bikController.text = newData.bik; _accountNumberController.text = newData.accountNumber; _correspondentAccountController.text = newData.correspondentAccount; WidgetsBinding.instance.addPostFrameCallback((_) => _emitIfValid()); } } @override Widget build(BuildContext context) { final l10n = AppLocalizations.of(context)!; return Form( key: _formKey, onChanged: _emitIfValid, child: Column( mainAxisSize: MainAxisSize.min, children: [ TextFormField( readOnly: !widget.isEditable, controller: _recipientNameController, decoration: getInputDecoration(context, l10n.recipientName, widget.isEditable), style: getTextFieldStyle(context, widget.isEditable), validator: (val) => (val == null || val.isEmpty) ? l10n.enterRecipientName : null, ), const SizedBox(height: 12), TextFormField( readOnly: !widget.isEditable, controller: _innController, decoration: getInputDecoration(context, l10n.inn, widget.isEditable), style: getTextFieldStyle(context, widget.isEditable), validator: (val) => (val == null || val.isEmpty) ? l10n.enterInn : null, ), const SizedBox(height: 12), TextFormField( readOnly: !widget.isEditable, controller: _kppController, decoration: getInputDecoration(context, l10n.kpp, widget.isEditable), style: getTextFieldStyle(context, widget.isEditable), validator: (val) => (val == null || val.isEmpty) ? l10n.enterKpp : null, ), const SizedBox(height: 12), TextFormField( readOnly: !widget.isEditable, controller: _bankNameController, decoration: getInputDecoration(context, l10n.bankName, widget.isEditable), style: getTextFieldStyle(context, widget.isEditable), validator: (val) => (val == null || val.isEmpty) ? l10n.enterBankName : null, ), const SizedBox(height: 12), TextFormField( readOnly: !widget.isEditable, controller: _bikController, decoration: getInputDecoration(context, l10n.bik, widget.isEditable), style: getTextFieldStyle(context, widget.isEditable), validator: (val) => (val == null || val.isEmpty) ? l10n.enterBik : null, ), const SizedBox(height: 12), TextFormField( readOnly: !widget.isEditable, controller: _accountNumberController, decoration: getInputDecoration(context, l10n.accountNumber, widget.isEditable), style: getTextFieldStyle(context, widget.isEditable), validator: (val) => (val == null || val.isEmpty) ? l10n.enterAccountNumber : null, ), const SizedBox(height: 12), TextFormField( readOnly: !widget.isEditable, controller: _correspondentAccountController, decoration: getInputDecoration(context, l10n.correspondentAccount, widget.isEditable), style: getTextFieldStyle(context, widget.isEditable), validator: (val) => (val == null || val.isEmpty) ? l10n.enterCorrespondentAccount : null, ), ], ), ); } @override void dispose() { _recipientNameController.dispose(); _innController.dispose(); _kppController.dispose(); _bankNameController.dispose(); _bikController.dispose(); _accountNumberController.dispose(); _correspondentAccountController.dispose(); super.dispose(); } }