68 lines
1.8 KiB
Dart
68 lines
1.8 KiB
Dart
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();
|
|
}
|
|
}
|