From ddc40f73e2ca7848a40a2aebe3145ff3eeb3b9e6 Mon Sep 17 00:00:00 2001 From: MarcosPereira1 Date: Mon, 22 Sep 2025 23:08:27 -0400 Subject: [PATCH 1/2] fix: preserve Brazilian area code 83 in phone formatter Fixes issue where Brazilian numbers starting with 83 were incorrectly converted to Russian format. Adds tests to ensure proper formatting for both Brazilian and Russian phone numbers. --- lib/formatters/phone_input_formatter.dart | 7 ++- test/flutter_multi_formatter_test.dart | 62 +++++++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/lib/formatters/phone_input_formatter.dart b/lib/formatters/phone_input_formatter.dart index 862ea87..ac35432 100644 --- a/lib/formatters/phone_input_formatter.dart +++ b/lib/formatters/phone_input_formatter.dart @@ -91,10 +91,9 @@ class PhoneInputFormatter extends TextInputFormatter { } if (shouldCorrectNumber && onlyNumbers.length >= 2) { /// хак специально для России, со вводом номера с восьмерки - /// меняем ее на 7 - var isRussianWrongNumber = - onlyNumbers[0] == '8' && onlyNumbers[1] == '9' || - onlyNumbers[0] == '8' && onlyNumbers[1] == '3'; + /// меняем ее на 7, но только если это не бразильский номер + final isRussianWrongNumber = + onlyNumbers[0] == '8' && onlyNumbers[1] == '9'; if (isRussianWrongNumber) { onlyNumbers = '7${onlyNumbers.substring(1)}'; _countryData = null; diff --git a/test/flutter_multi_formatter_test.dart b/test/flutter_multi_formatter_test.dart index b28e54a..c99dbf7 100644 --- a/test/flutter_multi_formatter_test.dart +++ b/test/flutter_multi_formatter_test.dart @@ -169,4 +169,66 @@ void main() { }); }); }); + + group('Brazilian phone numbers', () { + test('should preserve area code 83 when formatting', () { + final formatter = PhoneInputFormatter(defaultCountryCode: 'BR'); + final result = formatter.formatEditUpdate( + TextEditingValue(), + TextEditingValue(text: '83987654321'), + ); + expect(result.text, '(83) 98765-4321'); + }); + + test('should preserve area code 83 when typing step by step', () { + final formatter = PhoneInputFormatter(defaultCountryCode: 'BR'); + + var result = formatter.formatEditUpdate( + TextEditingValue(), + TextEditingValue(text: '8'), + ); + expect(result.text, '(8'); + + result = formatter.formatEditUpdate( + result, + TextEditingValue(text: '83'), + ); + expect(result.text, '(83'); + + result = formatter.formatEditUpdate( + result, + TextEditingValue(text: '839'), + ); + expect(result.text, '(83) 9'); + }); + + test('should format Brazilian landline numbers', () { + final formatter = PhoneInputFormatter(defaultCountryCode: 'BR'); + final result = formatter.formatEditUpdate( + TextEditingValue(), + TextEditingValue(text: '8332123456'), + ); + expect(result.text, '(83) 32123-456'); + }); + }); + + group('Russian phone correction', () { + test('should convert 89 to Russian number', () { + final formatter = PhoneInputFormatter(); + final result = formatter.formatEditUpdate( + TextEditingValue(), + TextEditingValue(text: '89123456789'), + ); + expect(result.text, startsWith('+7 (912)')); + }); + + test('should not convert 83 to Russian number', () { + final formatter = PhoneInputFormatter(); + final result = formatter.formatEditUpdate( + TextEditingValue(), + TextEditingValue(text: '83123456789'), + ); + expect(result.text, isNot(startsWith('+7'))); + }); + }); } From 12c736967052f34502d88b772b26e00fe5f42067 Mon Sep 17 00:00:00 2001 From: MarcosPereira1 Date: Mon, 22 Sep 2025 23:51:43 -0400 Subject: [PATCH 2/2] test: add tests for Brazilian area code 83 phone formatting --- test/flutter_multi_formatter_test.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/flutter_multi_formatter_test.dart b/test/flutter_multi_formatter_test.dart index c99dbf7..b353c11 100644 --- a/test/flutter_multi_formatter_test.dart +++ b/test/flutter_multi_formatter_test.dart @@ -183,23 +183,23 @@ void main() { test('should preserve area code 83 when typing step by step', () { final formatter = PhoneInputFormatter(defaultCountryCode: 'BR'); - var result = formatter.formatEditUpdate( + final result1 = formatter.formatEditUpdate( TextEditingValue(), TextEditingValue(text: '8'), ); - expect(result.text, '(8'); + expect(result1.text, '(8'); - result = formatter.formatEditUpdate( - result, + final result2 = formatter.formatEditUpdate( + result1, TextEditingValue(text: '83'), ); - expect(result.text, '(83'); + expect(result2.text, '(83'); - result = formatter.formatEditUpdate( - result, + final result3 = formatter.formatEditUpdate( + result2, TextEditingValue(text: '839'), ); - expect(result.text, '(83) 9'); + expect(result3.text, '(83) 9'); }); test('should format Brazilian landline numbers', () {