refactoring for recipient addition page

This commit is contained in:
Arseni
2026-01-29 19:22:30 +03:00
parent da8da04ae9
commit efa69b43b2
47 changed files with 1376 additions and 532 deletions

View File

@@ -0,0 +1,121 @@
import 'package:flutter/material.dart';
import 'package:pshared/models/payment/methods/ledger.dart';
import 'package:pweb/utils/text_field_styles.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class LedgerForm extends StatefulWidget {
final void Function(LedgerPaymentMethod) onChanged;
final LedgerPaymentMethod? initialData;
final bool isEditable;
const LedgerForm({
super.key,
required this.onChanged,
this.initialData,
required this.isEditable,
});
@override
State<LedgerForm> createState() => _LedgerFormState();
}
class _LedgerFormState extends State<LedgerForm> {
final _formKey = GlobalKey<FormState>();
late final TextEditingController _ledgerAccountRefController;
late final TextEditingController _contraLedgerAccountRefController;
@override
void initState() {
super.initState();
_ledgerAccountRefController = TextEditingController(
text: widget.initialData?.ledgerAccountRef ?? '',
);
_contraLedgerAccountRefController = TextEditingController(
text: widget.initialData?.contraLedgerAccountRef ?? '',
);
WidgetsBinding.instance.addPostFrameCallback((_) => _emitIfValid());
}
void _emitIfValid() {
if (_formKey.currentState?.validate() ?? false) {
final contraRef = _contraLedgerAccountRefController.text.trim();
widget.onChanged(
LedgerPaymentMethod(
ledgerAccountRef: _ledgerAccountRefController.text.trim(),
contraLedgerAccountRef: contraRef.isEmpty ? null : contraRef,
),
);
}
}
@override
void didUpdateWidget(covariant LedgerForm oldWidget) {
super.didUpdateWidget(oldWidget);
final newData = widget.initialData;
final oldData = oldWidget.initialData;
if (newData == null && oldData != null) {
_ledgerAccountRefController.clear();
_contraLedgerAccountRefController.clear();
return;
}
if (newData != null && newData != oldData) {
final hasLedgerRefChange = newData.ledgerAccountRef != _ledgerAccountRefController.text;
final hasContraRefChange = (newData.contraLedgerAccountRef ?? '') != _contraLedgerAccountRefController.text;
if (hasLedgerRefChange) _ledgerAccountRefController.text = newData.ledgerAccountRef;
if (hasContraRefChange) {
_contraLedgerAccountRefController.text = newData.contraLedgerAccountRef ?? '';
}
if (hasLedgerRefChange || hasContraRefChange) {
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: _ledgerAccountRefController,
decoration: getInputDecoration(context, l10n.ledgerAccountRef, widget.isEditable),
style: getTextFieldStyle(context, widget.isEditable),
validator: (val) => (val == null || val.trim().isEmpty)
? l10n.enterLedgerAccountRef
: null,
),
const SizedBox(height: 12),
TextFormField(
readOnly: !widget.isEditable,
controller: _contraLedgerAccountRefController,
decoration: getInputDecoration(context, l10n.contraLedgerAccountRef, widget.isEditable),
style: getTextFieldStyle(context, widget.isEditable),
),
],
),
);
}
@override
void dispose() {
_ledgerAccountRefController.dispose();
_contraLedgerAccountRefController.dispose();
super.dispose();
}
}