Files
Qlyra/lib/frontend/screens/auth/phone_input_formatter.dart
T

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),
);
}
}