diff --git a/lib/domain/auth/value_objects.dart b/lib/domain/auth/value_objects.dart index 398dab79d..7477ff846 100644 --- a/lib/domain/auth/value_objects.dart +++ b/lib/domain/auth/value_objects.dart @@ -7,7 +7,8 @@ class EmailAddress extends ValueObject { factory EmailAddress(String input) { assert(input != null); return EmailAddress._( - validateEmailAddress(input), + validateEmailAddress(input) + .flatMap((result) => validateEmailWithoutSpace(result)), ); } @@ -20,9 +21,8 @@ class EmailAddress extends ValueObject { class Password extends ValueObject { factory Password(String input) { assert(input != null); - return Password._( - validatePassword(input), - ); + return Password._(validatePasswordLength(input) + .flatMap((result) => validatePasswordWithoutSpace(result))); } const Password._(this.value); diff --git a/lib/domain/core/failures.dart b/lib/domain/core/failures.dart index 411ec647e..bb50a24ec 100644 --- a/lib/domain/core/failures.dart +++ b/lib/domain/core/failures.dart @@ -19,8 +19,16 @@ class AuthValueFailure with _$AuthValueFailure { const factory AuthValueFailure.invalidPassword({ required String failedValue, + }) = InvalidPassword; + + const factory AuthValueFailure.shortPassword({ + required String failedValue, }) = ShortPassword; + const factory AuthValueFailure.containsSpace({ + required String failedValue, + }) = ContainsSpace; + const factory AuthValueFailure.empty({ required String failedValue, }) = Empty; diff --git a/lib/domain/core/failures.freezed.dart b/lib/domain/core/failures.freezed.dart index e4c0ea5f7..5b426253c 100644 --- a/lib/domain/core/failures.freezed.dart +++ b/lib/domain/core/failures.freezed.dart @@ -359,12 +359,24 @@ class _$AuthValueFailureTearOff { ); } - ShortPassword invalidPassword({required String failedValue}) { + InvalidPassword invalidPassword({required String failedValue}) { + return InvalidPassword( + failedValue: failedValue, + ); + } + + ShortPassword shortPassword({required String failedValue}) { return ShortPassword( failedValue: failedValue, ); } + ContainsSpace containsSpace({required String failedValue}) { + return ContainsSpace( + failedValue: failedValue, + ); + } + Empty empty({required String failedValue}) { return Empty( failedValue: failedValue, @@ -388,6 +400,8 @@ mixin _$AuthValueFailure { TResult when({ required TResult Function(String failedValue) invalidEmail, required TResult Function(String failedValue) invalidPassword, + required TResult Function(String failedValue) shortPassword, + required TResult Function(String failedValue) containsSpace, required TResult Function(String failedValue) empty, required TResult Function(T failedValue, int max) listTooLong, }) => @@ -396,6 +410,8 @@ mixin _$AuthValueFailure { TResult maybeWhen({ TResult Function(String failedValue)? invalidEmail, TResult Function(String failedValue)? invalidPassword, + TResult Function(String failedValue)? shortPassword, + TResult Function(String failedValue)? containsSpace, TResult Function(String failedValue)? empty, TResult Function(T failedValue, int max)? listTooLong, required TResult orElse(), @@ -404,7 +420,9 @@ mixin _$AuthValueFailure { @optionalTypeArgs TResult map({ required TResult Function(InvalidEmail value) invalidEmail, - required TResult Function(ShortPassword value) invalidPassword, + required TResult Function(InvalidPassword value) invalidPassword, + required TResult Function(ShortPassword value) shortPassword, + required TResult Function(ContainsSpace value) containsSpace, required TResult Function(Empty value) empty, required TResult Function(ListTooLong value) listTooLong, }) => @@ -412,7 +430,9 @@ mixin _$AuthValueFailure { @optionalTypeArgs TResult maybeMap({ TResult Function(InvalidEmail value)? invalidEmail, - TResult Function(ShortPassword value)? invalidPassword, + TResult Function(InvalidPassword value)? invalidPassword, + TResult Function(ShortPassword value)? shortPassword, + TResult Function(ContainsSpace value)? containsSpace, TResult Function(Empty value)? empty, TResult Function(ListTooLong value)? listTooLong, required TResult orElse(), @@ -505,6 +525,8 @@ class _$InvalidEmail implements InvalidEmail { TResult when({ required TResult Function(String failedValue) invalidEmail, required TResult Function(String failedValue) invalidPassword, + required TResult Function(String failedValue) shortPassword, + required TResult Function(String failedValue) containsSpace, required TResult Function(String failedValue) empty, required TResult Function(T failedValue, int max) listTooLong, }) { @@ -516,6 +538,8 @@ class _$InvalidEmail implements InvalidEmail { TResult maybeWhen({ TResult Function(String failedValue)? invalidEmail, TResult Function(String failedValue)? invalidPassword, + TResult Function(String failedValue)? shortPassword, + TResult Function(String failedValue)? containsSpace, TResult Function(String failedValue)? empty, TResult Function(T failedValue, int max)? listTooLong, required TResult orElse(), @@ -530,7 +554,9 @@ class _$InvalidEmail implements InvalidEmail { @optionalTypeArgs TResult map({ required TResult Function(InvalidEmail value) invalidEmail, - required TResult Function(ShortPassword value) invalidPassword, + required TResult Function(InvalidPassword value) invalidPassword, + required TResult Function(ShortPassword value) shortPassword, + required TResult Function(ContainsSpace value) containsSpace, required TResult Function(Empty value) empty, required TResult Function(ListTooLong value) listTooLong, }) { @@ -541,7 +567,9 @@ class _$InvalidEmail implements InvalidEmail { @optionalTypeArgs TResult maybeMap({ TResult Function(InvalidEmail value)? invalidEmail, - TResult Function(ShortPassword value)? invalidPassword, + TResult Function(InvalidPassword value)? invalidPassword, + TResult Function(ShortPassword value)? shortPassword, + TResult Function(ContainsSpace value)? containsSpace, TResult Function(Empty value)? empty, TResult Function(ListTooLong value)? listTooLong, required TResult orElse(), @@ -562,6 +590,140 @@ abstract class InvalidEmail implements AuthValueFailure { throw _privateConstructorUsedError; } +/// @nodoc +abstract class $InvalidPasswordCopyWith { + factory $InvalidPasswordCopyWith( + InvalidPassword value, $Res Function(InvalidPassword) then) = + _$InvalidPasswordCopyWithImpl; + $Res call({String failedValue}); +} + +/// @nodoc +class _$InvalidPasswordCopyWithImpl + extends _$AuthValueFailureCopyWithImpl + implements $InvalidPasswordCopyWith { + _$InvalidPasswordCopyWithImpl( + InvalidPassword _value, $Res Function(InvalidPassword) _then) + : super(_value, (v) => _then(v as InvalidPassword)); + + @override + InvalidPassword get _value => super._value as InvalidPassword; + + @override + $Res call({ + Object? failedValue = freezed, + }) { + return _then(InvalidPassword( + failedValue: failedValue == freezed + ? _value.failedValue + : failedValue // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$InvalidPassword implements InvalidPassword { + const _$InvalidPassword({required this.failedValue}); + + @override + final String failedValue; + + @override + String toString() { + return 'AuthValueFailure<$T>.invalidPassword(failedValue: $failedValue)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is InvalidPassword && + (identical(other.failedValue, failedValue) || + const DeepCollectionEquality() + .equals(other.failedValue, failedValue))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ const DeepCollectionEquality().hash(failedValue); + + @JsonKey(ignore: true) + @override + $InvalidPasswordCopyWith> get copyWith => + _$InvalidPasswordCopyWithImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(String failedValue) invalidEmail, + required TResult Function(String failedValue) invalidPassword, + required TResult Function(String failedValue) shortPassword, + required TResult Function(String failedValue) containsSpace, + required TResult Function(String failedValue) empty, + required TResult Function(T failedValue, int max) listTooLong, + }) { + return invalidPassword(failedValue); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(String failedValue)? invalidEmail, + TResult Function(String failedValue)? invalidPassword, + TResult Function(String failedValue)? shortPassword, + TResult Function(String failedValue)? containsSpace, + TResult Function(String failedValue)? empty, + TResult Function(T failedValue, int max)? listTooLong, + required TResult orElse(), + }) { + if (invalidPassword != null) { + return invalidPassword(failedValue); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(InvalidEmail value) invalidEmail, + required TResult Function(InvalidPassword value) invalidPassword, + required TResult Function(ShortPassword value) shortPassword, + required TResult Function(ContainsSpace value) containsSpace, + required TResult Function(Empty value) empty, + required TResult Function(ListTooLong value) listTooLong, + }) { + return invalidPassword(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(InvalidEmail value)? invalidEmail, + TResult Function(InvalidPassword value)? invalidPassword, + TResult Function(ShortPassword value)? shortPassword, + TResult Function(ContainsSpace value)? containsSpace, + TResult Function(Empty value)? empty, + TResult Function(ListTooLong value)? listTooLong, + required TResult orElse(), + }) { + if (invalidPassword != null) { + return invalidPassword(this); + } + return orElse(); + } +} + +abstract class InvalidPassword implements AuthValueFailure { + const factory InvalidPassword({required String failedValue}) = + _$InvalidPassword; + + String get failedValue => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $InvalidPasswordCopyWith> get copyWith => + throw _privateConstructorUsedError; +} + /// @nodoc abstract class $ShortPasswordCopyWith { factory $ShortPasswordCopyWith( @@ -604,7 +766,7 @@ class _$ShortPassword implements ShortPassword { @override String toString() { - return 'AuthValueFailure<$T>.invalidPassword(failedValue: $failedValue)'; + return 'AuthValueFailure<$T>.shortPassword(failedValue: $failedValue)'; } @override @@ -630,10 +792,12 @@ class _$ShortPassword implements ShortPassword { TResult when({ required TResult Function(String failedValue) invalidEmail, required TResult Function(String failedValue) invalidPassword, + required TResult Function(String failedValue) shortPassword, + required TResult Function(String failedValue) containsSpace, required TResult Function(String failedValue) empty, required TResult Function(T failedValue, int max) listTooLong, }) { - return invalidPassword(failedValue); + return shortPassword(failedValue); } @override @@ -641,12 +805,14 @@ class _$ShortPassword implements ShortPassword { TResult maybeWhen({ TResult Function(String failedValue)? invalidEmail, TResult Function(String failedValue)? invalidPassword, + TResult Function(String failedValue)? shortPassword, + TResult Function(String failedValue)? containsSpace, TResult Function(String failedValue)? empty, TResult Function(T failedValue, int max)? listTooLong, required TResult orElse(), }) { - if (invalidPassword != null) { - return invalidPassword(failedValue); + if (shortPassword != null) { + return shortPassword(failedValue); } return orElse(); } @@ -655,24 +821,28 @@ class _$ShortPassword implements ShortPassword { @optionalTypeArgs TResult map({ required TResult Function(InvalidEmail value) invalidEmail, - required TResult Function(ShortPassword value) invalidPassword, + required TResult Function(InvalidPassword value) invalidPassword, + required TResult Function(ShortPassword value) shortPassword, + required TResult Function(ContainsSpace value) containsSpace, required TResult Function(Empty value) empty, required TResult Function(ListTooLong value) listTooLong, }) { - return invalidPassword(this); + return shortPassword(this); } @override @optionalTypeArgs TResult maybeMap({ TResult Function(InvalidEmail value)? invalidEmail, - TResult Function(ShortPassword value)? invalidPassword, + TResult Function(InvalidPassword value)? invalidPassword, + TResult Function(ShortPassword value)? shortPassword, + TResult Function(ContainsSpace value)? containsSpace, TResult Function(Empty value)? empty, TResult Function(ListTooLong value)? listTooLong, required TResult orElse(), }) { - if (invalidPassword != null) { - return invalidPassword(this); + if (shortPassword != null) { + return shortPassword(this); } return orElse(); } @@ -688,6 +858,140 @@ abstract class ShortPassword implements AuthValueFailure { throw _privateConstructorUsedError; } +/// @nodoc +abstract class $ContainsSpaceCopyWith { + factory $ContainsSpaceCopyWith( + ContainsSpace value, $Res Function(ContainsSpace) then) = + _$ContainsSpaceCopyWithImpl; + $Res call({String failedValue}); +} + +/// @nodoc +class _$ContainsSpaceCopyWithImpl + extends _$AuthValueFailureCopyWithImpl + implements $ContainsSpaceCopyWith { + _$ContainsSpaceCopyWithImpl( + ContainsSpace _value, $Res Function(ContainsSpace) _then) + : super(_value, (v) => _then(v as ContainsSpace)); + + @override + ContainsSpace get _value => super._value as ContainsSpace; + + @override + $Res call({ + Object? failedValue = freezed, + }) { + return _then(ContainsSpace( + failedValue: failedValue == freezed + ? _value.failedValue + : failedValue // ignore: cast_nullable_to_non_nullable + as String, + )); + } +} + +/// @nodoc + +class _$ContainsSpace implements ContainsSpace { + const _$ContainsSpace({required this.failedValue}); + + @override + final String failedValue; + + @override + String toString() { + return 'AuthValueFailure<$T>.containsSpace(failedValue: $failedValue)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other is ContainsSpace && + (identical(other.failedValue, failedValue) || + const DeepCollectionEquality() + .equals(other.failedValue, failedValue))); + } + + @override + int get hashCode => + runtimeType.hashCode ^ const DeepCollectionEquality().hash(failedValue); + + @JsonKey(ignore: true) + @override + $ContainsSpaceCopyWith> get copyWith => + _$ContainsSpaceCopyWithImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function(String failedValue) invalidEmail, + required TResult Function(String failedValue) invalidPassword, + required TResult Function(String failedValue) shortPassword, + required TResult Function(String failedValue) containsSpace, + required TResult Function(String failedValue) empty, + required TResult Function(T failedValue, int max) listTooLong, + }) { + return containsSpace(failedValue); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function(String failedValue)? invalidEmail, + TResult Function(String failedValue)? invalidPassword, + TResult Function(String failedValue)? shortPassword, + TResult Function(String failedValue)? containsSpace, + TResult Function(String failedValue)? empty, + TResult Function(T failedValue, int max)? listTooLong, + required TResult orElse(), + }) { + if (containsSpace != null) { + return containsSpace(failedValue); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(InvalidEmail value) invalidEmail, + required TResult Function(InvalidPassword value) invalidPassword, + required TResult Function(ShortPassword value) shortPassword, + required TResult Function(ContainsSpace value) containsSpace, + required TResult Function(Empty value) empty, + required TResult Function(ListTooLong value) listTooLong, + }) { + return containsSpace(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(InvalidEmail value)? invalidEmail, + TResult Function(InvalidPassword value)? invalidPassword, + TResult Function(ShortPassword value)? shortPassword, + TResult Function(ContainsSpace value)? containsSpace, + TResult Function(Empty value)? empty, + TResult Function(ListTooLong value)? listTooLong, + required TResult orElse(), + }) { + if (containsSpace != null) { + return containsSpace(this); + } + return orElse(); + } +} + +abstract class ContainsSpace implements AuthValueFailure { + const factory ContainsSpace({required String failedValue}) = + _$ContainsSpace; + + String get failedValue => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $ContainsSpaceCopyWith> get copyWith => + throw _privateConstructorUsedError; +} + /// @nodoc abstract class $EmptyCopyWith { factory $EmptyCopyWith(Empty value, $Res Function(Empty) then) = @@ -754,6 +1058,8 @@ class _$Empty implements Empty { TResult when({ required TResult Function(String failedValue) invalidEmail, required TResult Function(String failedValue) invalidPassword, + required TResult Function(String failedValue) shortPassword, + required TResult Function(String failedValue) containsSpace, required TResult Function(String failedValue) empty, required TResult Function(T failedValue, int max) listTooLong, }) { @@ -765,6 +1071,8 @@ class _$Empty implements Empty { TResult maybeWhen({ TResult Function(String failedValue)? invalidEmail, TResult Function(String failedValue)? invalidPassword, + TResult Function(String failedValue)? shortPassword, + TResult Function(String failedValue)? containsSpace, TResult Function(String failedValue)? empty, TResult Function(T failedValue, int max)? listTooLong, required TResult orElse(), @@ -779,7 +1087,9 @@ class _$Empty implements Empty { @optionalTypeArgs TResult map({ required TResult Function(InvalidEmail value) invalidEmail, - required TResult Function(ShortPassword value) invalidPassword, + required TResult Function(InvalidPassword value) invalidPassword, + required TResult Function(ShortPassword value) shortPassword, + required TResult Function(ContainsSpace value) containsSpace, required TResult Function(Empty value) empty, required TResult Function(ListTooLong value) listTooLong, }) { @@ -790,7 +1100,9 @@ class _$Empty implements Empty { @optionalTypeArgs TResult maybeMap({ TResult Function(InvalidEmail value)? invalidEmail, - TResult Function(ShortPassword value)? invalidPassword, + TResult Function(InvalidPassword value)? invalidPassword, + TResult Function(ShortPassword value)? shortPassword, + TResult Function(ContainsSpace value)? containsSpace, TResult Function(Empty value)? empty, TResult Function(ListTooLong value)? listTooLong, required TResult orElse(), @@ -890,6 +1202,8 @@ class _$ListTooLong implements ListTooLong { TResult when({ required TResult Function(String failedValue) invalidEmail, required TResult Function(String failedValue) invalidPassword, + required TResult Function(String failedValue) shortPassword, + required TResult Function(String failedValue) containsSpace, required TResult Function(String failedValue) empty, required TResult Function(T failedValue, int max) listTooLong, }) { @@ -901,6 +1215,8 @@ class _$ListTooLong implements ListTooLong { TResult maybeWhen({ TResult Function(String failedValue)? invalidEmail, TResult Function(String failedValue)? invalidPassword, + TResult Function(String failedValue)? shortPassword, + TResult Function(String failedValue)? containsSpace, TResult Function(String failedValue)? empty, TResult Function(T failedValue, int max)? listTooLong, required TResult orElse(), @@ -915,7 +1231,9 @@ class _$ListTooLong implements ListTooLong { @optionalTypeArgs TResult map({ required TResult Function(InvalidEmail value) invalidEmail, - required TResult Function(ShortPassword value) invalidPassword, + required TResult Function(InvalidPassword value) invalidPassword, + required TResult Function(ShortPassword value) shortPassword, + required TResult Function(ContainsSpace value) containsSpace, required TResult Function(Empty value) empty, required TResult Function(ListTooLong value) listTooLong, }) { @@ -926,7 +1244,9 @@ class _$ListTooLong implements ListTooLong { @optionalTypeArgs TResult maybeMap({ TResult Function(InvalidEmail value)? invalidEmail, - TResult Function(ShortPassword value)? invalidPassword, + TResult Function(InvalidPassword value)? invalidPassword, + TResult Function(ShortPassword value)? shortPassword, + TResult Function(ContainsSpace value)? containsSpace, TResult Function(Empty value)? empty, TResult Function(ListTooLong value)? listTooLong, required TResult orElse(), diff --git a/lib/domain/core/value_validators.dart b/lib/domain/core/value_validators.dart index ca48d8b89..b3dfb6b60 100644 --- a/lib/domain/core/value_validators.dart +++ b/lib/domain/core/value_validators.dart @@ -1,42 +1,49 @@ import 'package:cybear_jinni/domain/core/failures.dart'; import 'package:dartz/dartz.dart'; -import 'package:kt_dart/collection.dart'; +import 'package:easy_localization/easy_localization.dart'; +/// Checking if the email is valid using regex. Either, String> validateEmailAddress(String input) { const emailRegex = r"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"; if (RegExp(emailRegex).hasMatch(input)) { return right(input); } else { - return left(AuthValueFailure.invalidEmail(failedValue: input)); + return left( + AuthValueFailure.invalidEmail(failedValue: 'Email_is_invalid'.tr())); } } -Either, String> validateStringNotEmpty(String input) { - if (input.isNotEmpty) { +/// Checking if the email contains spaces or tabs (' ' or \t) +Either, String> validateEmailWithoutSpace( + String input) { + if (!input.contains(' ') && !input.contains('\t')) { return right(input); } else { - return left(AuthValueFailure.empty(failedValue: input)); + return left(AuthValueFailure.containsSpace( + failedValue: 'Email_cannot_contain_spaces'.tr())); } } -// KtList is immutable list, you are modifying the list and not a copy -Either>, KtList> validateMaxLength( - KtList input, - int maxLength, -) { - if (input.size <= maxLength) { +/// Checking if the password is less then 6 characters. +Either, String> validatePasswordLength(String input) { + int maxLength = 6; + if (input.length >= maxLength) { return right(input); } else { - return left( - AuthValueFailure.listTooLong(failedValue: input, max: maxLength)); + return left(AuthValueFailure.shortPassword( + failedValue: 'Password_must_be_bigger_than__characters' + .tr(args: [maxLength.toString()]))); } } -Either, String> validatePassword(String input) { - if (input.length >= 6) { +/// Checking if the password contains spaces or tabs (' ' or \t). +Either, String> validatePasswordWithoutSpace( + String input) { + if (!input.contains(' ') && !input.contains('\t')) { return right(input); } else { - return left(AuthValueFailure.invalidEmail(failedValue: input)); + return left(AuthValueFailure.containsSpace( + failedValue: 'Password_cannot_contain_spaces'.tr())); } } diff --git a/lib/main.dart b/lib/main.dart index d363f6928..30145cd37 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -52,7 +52,6 @@ Future main() async { Firebase.initializeApp(); await configureLocalTimeZone(); - // await _configureLocalTimeZone(); await initialisationNotifications(); diff --git a/lib/presentation/core/notifications.dart b/lib/presentation/core/notifications.dart index 3e54f1e86..f31d81eb7 100644 --- a/lib/presentation/core/notifications.dart +++ b/lib/presentation/core/notifications.dart @@ -7,10 +7,14 @@ import 'package:timezone/timezone.dart' as tz; Future configureLocalTimeZone() async { tz.initializeTimeZones(); - // final String timeZoneName = await platform.invokeMethod('getTimeZoneName'); + final String timeZoneName = await FlutterNativeTimezone.getLocalTimezone(); - - tz.setLocalLocation(tz.getLocation(timeZoneName)); + + try{ + tz.setLocalLocation(tz.getLocation(timeZoneName)); + }catch(e){ + tz.setLocalLocation(tz.getLocation('US/Central')); + } } Future initialisationNotifications() async { diff --git a/lib/presentation/sign_in_page/widgets/sign_in_form.dart b/lib/presentation/sign_in_page/widgets/sign_in_form.dart index acb240d88..b65de861d 100644 --- a/lib/presentation/sign_in_page/widgets/sign_in_form.dart +++ b/lib/presentation/sign_in_page/widgets/sign_in_form.dart @@ -71,7 +71,8 @@ class SignInForm extends StatelessWidget { .value .fold( (f) => f.maybeMap( - invalidEmail: (_) => 'Invalid Email', + invalidEmail: (result) => result.failedValue, + containsSpace: (result) => result.failedValue, orElse: () => null), (r) => null), ), @@ -95,7 +96,8 @@ class SignInForm extends StatelessWidget { .value .fold( (f) => f.maybeMap( - invalidEmail: (_) => 'Short Password', + shortPassword: (result) => result.failedValue, + containsSpace: (result) => result.failedValue, orElse: () => null), (r) => null), ),