import 'package:flutter/material.dart'; import 'package:pshared/provider/payment/amount.dart'; import 'package:pshared/utils/currency.dart'; import 'package:pshared/utils/money.dart'; class PaymentAmountFieldController extends ChangeNotifier { final TextEditingController textController; PaymentAmountProvider? _provider; bool _isSyncingText = false; PaymentAmountFieldController({required double initialAmount}) : textController = TextEditingController( text: amountToString(initialAmount), ); void update(PaymentAmountProvider provider) { if (identical(_provider, provider)) return; _provider?.removeListener(_handleProviderChanged); _provider = provider; _provider?.addListener(_handleProviderChanged); _syncTextWithAmount(provider.amount); } void handleChanged(String value) { if (_isSyncingText) return; final parsed = _parseAmount(value); if (parsed != null) { _provider?.setAmount(parsed); } } void _handleProviderChanged() { final provider = _provider; if (provider == null) return; _syncTextWithAmount(provider.amount); } double? _parseAmount(String value) { final parsed = parseMoneyAmount( value.replaceAll(',', '.'), fallback: double.nan, ); return parsed.isNaN ? null : parsed; } void _syncTextWithAmount(double amount) { final parsedText = _parseAmount(textController.text); if (parsedText != null && parsedText == amount) return; final nextText = amountToString(amount); _isSyncingText = true; textController.value = TextEditingValue( text: nextText, selection: TextSelection.collapsed(offset: nextText.length), ); _isSyncingText = false; } @override void dispose() { _provider?.removeListener(_handleProviderChanged); textController.dispose(); super.dispose(); } }