59 lines
1.7 KiB
Dart
59 lines
1.7 KiB
Dart
import 'package:flutter/services.dart';
|
|
|
|
import '../../../core/config/countries.dart';
|
|
|
|
class PhoneInputFormatter extends TextInputFormatter {
|
|
final CountryName country;
|
|
PhoneInputFormatter(this.country);
|
|
|
|
@override
|
|
TextEditingValue formatEditUpdate(
|
|
TextEditingValue oldValue,
|
|
TextEditingValue newValue,
|
|
) {
|
|
var text = newValue.text.replaceAll(RegExp(r'\D'), '');
|
|
|
|
if (newValue.text.length < oldValue.text.length) {
|
|
final oldDigits = oldValue.text.replaceAll(RegExp(r'\D'), '');
|
|
if (text.length == oldDigits.length && text.isNotEmpty) {
|
|
text = text.substring(0, text.length - 1);
|
|
}
|
|
}
|
|
|
|
if (text.length > country.phoneDigits) {
|
|
text = text.substring(0, country.phoneDigits);
|
|
}
|
|
|
|
final buffer = StringBuffer();
|
|
int digitIdx = 0;
|
|
|
|
for (int i = 0; i < country.phoneGroupSizes.length; i++) {
|
|
if (digitIdx >= text.length) break;
|
|
|
|
buffer.write(country.phoneGroupSeparators[i]);
|
|
|
|
final groupSize = country.phoneGroupSizes[i];
|
|
final remainingDigits = text.length - digitIdx;
|
|
final digitsToTake = remainingDigits < groupSize
|
|
? remainingDigits
|
|
: groupSize;
|
|
|
|
buffer.write(text.substring(digitIdx, digitIdx + digitsToTake));
|
|
digitIdx += digitsToTake;
|
|
}
|
|
|
|
if (digitIdx == text.length && text.length == country.phoneDigits) {
|
|
if (country.phoneGroupSeparators.length >
|
|
country.phoneGroupSizes.length) {
|
|
buffer.write(country.phoneGroupSeparators.last);
|
|
}
|
|
}
|
|
|
|
final formattedText = buffer.toString();
|
|
return TextEditingValue(
|
|
text: formattedText,
|
|
selection: TextSelection.collapsed(offset: formattedText.length),
|
|
);
|
|
}
|
|
}
|