import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:pshared/models/payment/type.dart'; import 'package:pshared/models/recipient/recipient.dart'; import 'package:pshared/models/recipient/status.dart'; import 'package:pshared/models/recipient/type.dart'; import 'package:pshared/provider/organizations.dart'; import 'package:pshared/provider/recipient/pmethods.dart'; import 'package:pweb/pages/address_book/form/view.dart'; import 'package:pweb/services/amplitude.dart'; import 'package:pweb/generated/i18n/app_localizations.dart'; class AdressBookRecipientForm extends StatefulWidget { final Recipient? recipient; final ValueChanged? onSaved; const AdressBookRecipientForm({super.key, this.recipient, this.onSaved}); @override State createState() => _AdressBookRecipientFormState(); } class _AdressBookRecipientFormState extends State { final _formKey = GlobalKey(); late TextEditingController _nameCtrl; late TextEditingController _emailCtrl; RecipientType _type = RecipientType.internal; RecipientStatus _status = RecipientStatus.ready; final Map _methods = {}; late PaymentMethodsProvider _methodsProvider; Future _loadMethods() async { _methodsProvider = PaymentMethodsProvider()..addListener(_onProviderChanged); await _methodsProvider.loadMethods( context.read(), widget.recipient?.id, ); for (final m in _methodsProvider.methods) { _methods[m.type] = switch (m.type) { PaymentType.card => m.cardData, PaymentType.iban => m.ibanData, PaymentType.wallet => m.walletData, PaymentType.bankAccount => m.bankAccountData, PaymentType.cryptoAddress => m.cryptoAddressData, }; } } @override void initState() { super.initState(); final r = widget.recipient; _nameCtrl = TextEditingController(text: r?.name ?? ''); _emailCtrl = TextEditingController(text: r?.email ?? ''); _type = r?.type ?? RecipientType.internal; _status = r?.status ?? RecipientStatus.ready; _loadMethods(); } //TODO: Change when registration is ready void _save() { if (!_formKey.currentState!.validate() || _methods.isEmpty) { AmplitudeService.recipientAddCompleted( _type, _status, _methods.keys.toSet(), ); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(AppLocalizations.of(context)!.recipientFormRule), ), ); return; } final recipient = newRecipient( name: _nameCtrl.text, email: _emailCtrl.text, type: _type, status: _status, avatarUrl: null, organizationRef: context.read().current.id ); widget.onSaved?.call(recipient); } @override void dispose() { _methodsProvider.removeListener(_onProviderChanged); _methodsProvider.dispose(); super.dispose(); } void _onProviderChanged() => setState(() {}); @override Widget build(BuildContext context) => FormView( formKey: _formKey, nameCtrl: _nameCtrl, emailCtrl: _emailCtrl, type: _type, status: _status, methods: _methods, onTypeChanged: (t) => setState(() => _type = t), onStatusChanged: (s) => setState(() => _status = s), onMethodsChanged: (type, data) { setState(() { if (data != null) { _methods[type] = data; } else { _methods.remove(type); } }); }, onSave: _save, isEditing: widget.recipient != null, onBack: () { widget.onSaved?.call(null); }, ); }