Files
sendico/frontend/pweb/lib/pages/address_book/form/view.dart
2026-01-29 19:22:30 +03:00

146 lines
5.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:pshared/models/payment/type.dart';
import 'package:pshared/models/payment/methods/data.dart';
import 'package:pshared/models/recipient/payment_method_draft.dart';
import 'package:pweb/pages/address_book/form/widgets/feilds/email.dart';
import 'package:pweb/pages/address_book/form/widgets/header.dart';
import 'package:pweb/pages/address_book/form/widgets/feilds/name.dart';
import 'package:pweb/pages/address_book/form/widgets/payment_methods/panel.dart';
import 'package:pweb/pages/address_book/form/widgets/payment_methods/selector_row.dart';
import 'package:pweb/pages/address_book/form/widgets/save_button.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class FormView extends StatelessWidget {
final GlobalKey<FormState> formKey;
final TextEditingController nameCtrl;
final TextEditingController emailCtrl;
final List<PaymentType> types;
final PaymentType selectedType;
final int? selectedIndex;
final Map<PaymentType, List<RecipientMethodDraft>> methods;
final void Function(PaymentType type, int index) onMethodSelected;
final ValueChanged<PaymentType> onMethodAdd;
final Set<PaymentType> disabledTypes;
final ValueChanged<int> onMethodRemove;
final void Function(int, PaymentMethodData) onMethodChanged;
final VoidCallback onSave;
final bool isEditing;
final VoidCallback onBack;
final double maxWidth;
final double elevation;
final double borderRadius;
final EdgeInsetsGeometry padding;
final double spacingHeader;
final double spacingFields;
final double spacingDivider;
final double spacingSave;
final double spacingBottom;
final TextStyle? titleTextStyle;
const FormView({
super.key,
required this.formKey,
required this.nameCtrl,
required this.emailCtrl,
required this.types,
required this.selectedType,
required this.selectedIndex,
required this.methods,
required this.onMethodSelected,
required this.onMethodAdd,
this.disabledTypes = const {},
required this.onMethodRemove,
required this.onMethodChanged,
required this.onSave,
required this.isEditing,
required this.onBack,
this.maxWidth = 800,
this.elevation = 4,
this.borderRadius = 16,
this.padding = const EdgeInsets.all(20),
this.spacingHeader = 20,
this.spacingFields = 12,
this.spacingDivider = 40,
this.spacingSave = 30,
this.spacingBottom = 16,
this.titleTextStyle,
});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final entries = methods[selectedType] ?? const <RecipientMethodDraft>[];
final hasSelection = selectedIndex != null &&
selectedIndex! >= 0 &&
selectedIndex! < entries.length;
return Align(
alignment: Alignment.topCenter,
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: maxWidth),
child: Material(
elevation: elevation,
borderRadius: BorderRadius.circular(borderRadius),
color: theme.colorScheme.onSecondary,
child: Padding(
padding: padding,
child: Form(
key: formKey,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
HeaderWidget(
isEditing: isEditing,
onBack: onBack,
),
SizedBox(height: spacingHeader),
NameField(controller: nameCtrl),
SizedBox(height: spacingFields),
EmailField(controller: emailCtrl),
Divider(height: spacingDivider),
Text(
AppLocalizations.of(context)!.choosePaymentMethod,
style: titleTextStyle ??
theme.textTheme.titleMedium
?.copyWith(fontWeight: FontWeight.bold),
),
SizedBox(height: spacingFields),
PaymentMethodSelectorRow(
types: types,
selectedType: selectedType,
selectedIndex: selectedIndex,
methods: methods,
onSelected: onMethodSelected,
onAdd: onMethodAdd,
disabledTypes: disabledTypes,
),
if (hasSelection) ...[
SizedBox(height: spacingFields),
PaymentMethodPanel(
selectedType: selectedType,
selectedIndex: selectedIndex!,
entries: entries,
onRemove: onMethodRemove,
onChanged: onMethodChanged,
),
],
SizedBox(height: spacingSave),
SaveButton(onSave: onSave),
SizedBox(height: spacingBottom),
],
),
),
),
),
),
),
);
}
}