Skip to content

Commit eb6e68b

Browse files
fix(authenticator): required phone number validator (#4106)
* fix(authenticator):required phone number validator * fix: typo in validator
1 parent 4619117 commit eb6e68b

File tree

7 files changed

+63
-8
lines changed

7 files changed

+63
-8
lines changed

packages/authenticator/amplify_authenticator/lib/src/mixins/authenticator_phone_field.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ mixin AuthenticatorPhoneFieldMixin<FieldType extends Enum,
4747
return phoneNumber?.ensureStartsWith('+${state.dialCode.value}');
4848
}
4949

50-
String displayPhoneNumber(String phoneNumber) {
50+
String displayPhoneNumber(String? phoneNumber) {
51+
phoneNumber = phoneNumber ?? '';
5152
final prefix = '+${state.dialCode.value}';
5253
if (phoneNumber.startsWith(prefix)) {
5354
phoneNumber = phoneNumber.substring(prefix.length);

packages/authenticator/amplify_authenticator/lib/src/mixins/authenticator_username_field.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,15 @@ mixin AuthenticatorUsernameField<FieldType extends Enum,
164164
}
165165
}
166166

167+
String displayPhoneNumber(String? phoneNumber) {
168+
phoneNumber = phoneNumber ?? '';
169+
final prefix = '+${state.dialCode.value}';
170+
if (phoneNumber.startsWith(prefix)) {
171+
phoneNumber = phoneNumber.substring(prefix.length);
172+
}
173+
return phoneNumber;
174+
}
175+
167176
@override
168177
FormFieldValidator<UsernameInput> get validator {
169178
switch (selectedUsernameType) {
@@ -183,7 +192,7 @@ mixin AuthenticatorUsernameField<FieldType extends Enum,
183192
isOptional: isOptional,
184193
context: context,
185194
inputResolver: stringResolver.inputs,
186-
)(input?.username);
195+
)(displayPhoneNumber(input?.username));
187196
}
188197
}
189198

packages/authenticator/amplify_authenticator/lib/src/utils/validators.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@ import 'package:flutter/material.dart';
1111
*/
1212
final usernameRegex = RegExp(r'^\S+$');
1313
final emailRegex = RegExp(r'^\S+@\S+$');
14-
final phoneNumberRegex = RegExp(r'^\+\d+$');
14+
15+
/// Regex for a valid phone number.
16+
///
17+
/// The "+" prefix is excluded since validation is performed against the number
18+
/// without the prefix. That is, if the full number is "+1-123-555-7890", the
19+
/// "+1" is dropped prior to validation.
20+
final phoneNumberRegex = RegExp(r'^\d+$');
1521
final _codeRegex = RegExp(r'^\d{6}$');
1622
final _uppercase = RegExp(r'[A-Z]');
1723
final _lowercase = RegExp(r'[a-z]');
@@ -156,8 +162,8 @@ FormFieldValidator<String> validatePhoneNumber({
156162
InputResolverKey.phoneNumberEmpty,
157163
);
158164
}
159-
phoneNumber = phoneNumber.trim();
160-
if (!phoneNumberRegex.hasMatch(phoneNumber)) {
165+
final formattedNumber = phoneNumber.trim();
166+
if (!phoneNumberRegex.hasMatch(formattedNumber)) {
161167
return inputResolver.resolve(context, InputResolverKey.phoneNumberFormat);
162168
}
163169
return null;

packages/authenticator/amplify_authenticator/lib/src/widgets/form_fields/confirm_sign_in_form_field.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ class _ConfirmSignInPhoneFieldState extends _ConfirmSignInTextFieldState
559559
@override
560560
FormFieldValidator<String> get validator {
561561
return (phoneNumber) {
562-
phoneNumber = formatPhoneNumber(phoneNumber);
562+
phoneNumber = displayPhoneNumber(phoneNumber);
563563
return validatePhoneNumber(
564564
inputResolver: stringResolver.inputs,
565565
context: context,

packages/authenticator/amplify_authenticator/lib/src/widgets/form_fields/phone_number_field.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,12 @@ class _AuthenticatorPhoneFieldState<FieldType extends Enum>
8686
@override
8787
FormFieldValidator<String> get validator {
8888
return (String? phoneNumber) {
89-
phoneNumber = formatPhoneNumber(phoneNumber);
9089
final validator = widget.validator;
9190
if (validator != null) {
91+
phoneNumber = formatPhoneNumber(phoneNumber);
9292
return validator(phoneNumber);
9393
}
94+
phoneNumber = displayPhoneNumber(phoneNumber);
9495
return validatePhoneNumber(
9596
inputResolver: stringResolver.inputs,
9697
context: context,

packages/authenticator/amplify_authenticator/lib/src/widgets/form_fields/sign_up_form_field.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,7 @@ class _SignUpPhoneFieldState extends _SignUpTextFieldState
738738
@override
739739
FormFieldValidator<String> get validator {
740740
return (phoneNumber) {
741-
phoneNumber = formatPhoneNumber(phoneNumber);
741+
phoneNumber = displayPhoneNumber(phoneNumber);
742742
return validatePhoneNumber(
743743
inputResolver: stringResolver.inputs,
744744
context: context,

packages/authenticator/amplify_authenticator/test/sign_up_form_test.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,44 @@ void main() {
118118
},
119119
);
120120

121+
testWidgets(
122+
'displays message when submitted with empty phone number if the field is required',
123+
(tester) async {
124+
await tester.pumpWidget(
125+
MockAuthenticatorApp(
126+
initialStep: AuthenticatorStep.signUp,
127+
signUpForm: SignUpForm.custom(
128+
fields: [
129+
SignUpFormField.username(),
130+
SignUpFormField.phoneNumber(required: true),
131+
SignUpFormField.password(),
132+
],
133+
),
134+
),
135+
);
136+
await tester.pumpAndSettle();
137+
138+
final signUpPage = SignUpPage(tester: tester);
139+
140+
await signUpPage.submitSignUp();
141+
142+
await tester.pumpAndSettle();
143+
144+
Finder findPhoneFieldError() => find.descendant(
145+
of: signUpPage.phoneField,
146+
matching: find.text('Phone Number field must not be blank.'),
147+
);
148+
149+
expect(findPhoneFieldError(), findsOneWidget);
150+
151+
await signUpPage.enterPhoneNumber('1235556789');
152+
153+
await signUpPage.submitSignUp();
154+
155+
expect(findPhoneFieldError(), findsNothing);
156+
},
157+
);
158+
121159
testWidgets(
122160
'displays message when submitted with invalid birth date',
123161
(tester) async {

0 commit comments

Comments
 (0)