sign up feature #13

Merged
Raul merged 9 commits from auth-recover-password into develop 2026-01-05 09:51:51 +00:00
62 changed files with 6125 additions and 522 deletions
Showing only changes of commit 4c46b2f498 - Show all commits

View File

@@ -472,6 +472,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.9.0"
json_serializable:
dependency: transitive
description:
name: json_serializable
sha256: c5b2ee75210a0f263c6c7b9eeea80553dbae96ea1bf57f02484e806a3ffdffa3
url: "https://pub.dev"
source: hosted
version: "6.11.2"
leak_tracker:
dependency: transitive
description:
@@ -830,6 +838,14 @@ packages:
relative: true
source: path
version: "0.0.1"
uuid:
dependency: transitive
description:
name: uuid
sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8
url: "https://pub.dev"
source: hosted
version: "4.5.2"
vector_graphics:
dependency: transitive
description:

View File

@@ -5,4 +5,4 @@ export 'src/features/link_phone/presentation/verify_code/verify_link_phone_code_
export 'src/features/login/login_builder.dart';
export 'src/features/recover_password/recover_password_builder.dart';
export 'src/features/device_sign_up/device_signup_builder.dart';
export 'src/features/sign_up/signup_builder.dart';
export 'src/features/sign_up/sign_up_builder.dart';

View File

@@ -1,3 +1,6 @@
import 'package:auth/src/features/sign_up/domain/entities/sign_up_request_entity.dart';
import 'package:auth/src/features/sign_up/domain/entities/two_fa_secret_entity.dart';
abstract class AuthRemoteDatasource {
Future<void> requestPhoneCode({required String phone});
@@ -6,4 +9,12 @@ abstract class AuthRemoteDatasource {
Future<String> login({required String email, required String password});
Future<void> twoFALogin({required String token, required String code});
Future<String> signUp({required SignUpRequestEntity request});
Future<TwoFASecretEntity> generateTwoFASignUp({required String token});
Future<void> verifyTwoFACodeSignUp({
required String token,
required String code,
});
}

View File

@@ -1,6 +1,12 @@
import 'dart:convert';
import 'package:auth/src/core/data/models/sign_up_request_model.dart';
import 'package:auth/src/core/data/models/sign_up_response_model.dart';
import 'package:auth/src/core/data/models/two_fa_secret_response_model.dart';
import 'package:auth/src/features/sign_up/domain/entities/sign_up_request_entity.dart';
import 'package:auth/src/features/sign_up/domain/entities/two_fa_secret_entity.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:sf_infrastructure/sf_infrastructure.dart';
import 'auth_remote_datasource.dart';
@@ -85,6 +91,82 @@ class AuthRemoteDatasourceImpl implements AuthRemoteDatasource {
throw _mapDioError(error, defaultMessage: 'Error in twoFALogin');
}
}
@override
Future<String> signUp({required SignUpRequestEntity request}) async {
try {
final body = request.toModel().toJson();
debugPrint(body.toString());
debugPrint(const JsonEncoder.withIndent(' ').convert(body));
final response = await _repository.post<Map<String, dynamic>>(
'/payment-profiles/signup',
body: body,
);
final data = response.data;
if (data == null || data.isEmpty) {
throw Exception('Empty response from /payment-profiles/signup');
}
final parsed = SignUpResponseModel.fromJson(data);
if (!parsed.isCreated) {
throw Exception('Sign up failed: isCreated=false');
}
final token = parsed.item.token.trim();
if (token.isEmpty) {
throw Exception('Sign up response has empty token');
}
return token;
} on DioException catch (error) {
throw _mapDioError(error, defaultMessage: 'Error in signUp');
}
}
@override
Future<TwoFASecretEntity> generateTwoFASignUp({required String token}) async {
try {
final response = await _repository.post<Map<String, dynamic>>(
'/auth/totp/secret',
body: <String, dynamic>{'token': token},
);
final data = response.data;
if (data == null || data.isEmpty) {
throw Exception('Empty response from /auth/totp/secret');
}
final model = TwoFASecretResponseModel.fromJson(data);
return model.toEntity();
} on DioException catch (error) {
throw _mapDioError(error, defaultMessage: 'Error in twoFASignUp');
}
}
@override
Future<String> verifyTwoFACodeSignUp({
required String token,
required String code,
}) async {
try {
final response = await _repository.post<String>(
'/auth/totp/code',
body: <String, dynamic>{'token': token, 'code': code},
);
final data = response.data;
if (data == null || data.isEmpty) {
throw Exception('Empty response from /auth/totp/code');
}
return data;
} on DioException catch (error) {
throw _mapDioError(error, defaultMessage: 'Error in twoFaCodeSignUp');
}
}
}
Exception _mapDioError(DioException error, {required String defaultMessage}) {

View File

@@ -0,0 +1,31 @@
import 'package:auth/src/features/sign_up/domain/entities/address_entity.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'address_model.freezed.dart';
part 'address_model.g.dart';
@freezed
abstract class AddressModel with _$AddressModel {
const factory AddressModel({
required String street,
required String city,
required String province,
required String state,
required String country,
required int postCode,
}) = _AddressModel;
factory AddressModel.fromJson(Map<String, dynamic> json) =>
_$AddressModelFromJson(json);
}
extension AddressModelMapper on AddressEntity {
AddressModel toModel() => AddressModel(
street: street,
city: city,
province: province,
state: state,
country: country,
postCode: postCode,
);
}

View File

@@ -0,0 +1,292 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'address_model.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$AddressModel {
String get street; String get city; String get province; String get state; String get country; int get postCode;
/// Create a copy of AddressModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$AddressModelCopyWith<AddressModel> get copyWith => _$AddressModelCopyWithImpl<AddressModel>(this as AddressModel, _$identity);
/// Serializes this AddressModel to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is AddressModel&&(identical(other.street, street) || other.street == street)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.state, state) || other.state == state)&&(identical(other.country, country) || other.country == country)&&(identical(other.postCode, postCode) || other.postCode == postCode));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,street,city,province,state,country,postCode);
@override
String toString() {
return 'AddressModel(street: $street, city: $city, province: $province, state: $state, country: $country, postCode: $postCode)';
}
}
/// @nodoc
abstract mixin class $AddressModelCopyWith<$Res> {
factory $AddressModelCopyWith(AddressModel value, $Res Function(AddressModel) _then) = _$AddressModelCopyWithImpl;
@useResult
$Res call({
String street, String city, String province, String state, String country, int postCode
});
}
/// @nodoc
class _$AddressModelCopyWithImpl<$Res>
implements $AddressModelCopyWith<$Res> {
_$AddressModelCopyWithImpl(this._self, this._then);
final AddressModel _self;
final $Res Function(AddressModel) _then;
/// Create a copy of AddressModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? street = null,Object? city = null,Object? province = null,Object? state = null,Object? country = null,Object? postCode = null,}) {
return _then(_self.copyWith(
street: null == street ? _self.street : street // ignore: cast_nullable_to_non_nullable
as String,city: null == city ? _self.city : city // ignore: cast_nullable_to_non_nullable
as String,province: null == province ? _self.province : province // ignore: cast_nullable_to_non_nullable
as String,state: null == state ? _self.state : state // ignore: cast_nullable_to_non_nullable
as String,country: null == country ? _self.country : country // ignore: cast_nullable_to_non_nullable
as String,postCode: null == postCode ? _self.postCode : postCode // ignore: cast_nullable_to_non_nullable
as int,
));
}
}
/// Adds pattern-matching-related methods to [AddressModel].
extension AddressModelPatterns on AddressModel {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _AddressModel value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _AddressModel() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _AddressModel value) $default,){
final _that = this;
switch (_that) {
case _AddressModel():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _AddressModel value)? $default,){
final _that = this;
switch (_that) {
case _AddressModel() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String street, String city, String province, String state, String country, int postCode)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _AddressModel() when $default != null:
return $default(_that.street,_that.city,_that.province,_that.state,_that.country,_that.postCode);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String street, String city, String province, String state, String country, int postCode) $default,) {final _that = this;
switch (_that) {
case _AddressModel():
return $default(_that.street,_that.city,_that.province,_that.state,_that.country,_that.postCode);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String street, String city, String province, String state, String country, int postCode)? $default,) {final _that = this;
switch (_that) {
case _AddressModel() when $default != null:
return $default(_that.street,_that.city,_that.province,_that.state,_that.country,_that.postCode);case _:
return null;
}
}
}
/// @nodoc
@JsonSerializable()
class _AddressModel implements AddressModel {
const _AddressModel({required this.street, required this.city, required this.province, required this.state, required this.country, required this.postCode});
factory _AddressModel.fromJson(Map<String, dynamic> json) => _$AddressModelFromJson(json);
@override final String street;
@override final String city;
@override final String province;
@override final String state;
@override final String country;
@override final int postCode;
/// Create a copy of AddressModel
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$AddressModelCopyWith<_AddressModel> get copyWith => __$AddressModelCopyWithImpl<_AddressModel>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$AddressModelToJson(this, );
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _AddressModel&&(identical(other.street, street) || other.street == street)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.state, state) || other.state == state)&&(identical(other.country, country) || other.country == country)&&(identical(other.postCode, postCode) || other.postCode == postCode));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,street,city,province,state,country,postCode);
@override
String toString() {
return 'AddressModel(street: $street, city: $city, province: $province, state: $state, country: $country, postCode: $postCode)';
}
}
/// @nodoc
abstract mixin class _$AddressModelCopyWith<$Res> implements $AddressModelCopyWith<$Res> {
factory _$AddressModelCopyWith(_AddressModel value, $Res Function(_AddressModel) _then) = __$AddressModelCopyWithImpl;
@override @useResult
$Res call({
String street, String city, String province, String state, String country, int postCode
});
}
/// @nodoc
class __$AddressModelCopyWithImpl<$Res>
implements _$AddressModelCopyWith<$Res> {
__$AddressModelCopyWithImpl(this._self, this._then);
final _AddressModel _self;
final $Res Function(_AddressModel) _then;
/// Create a copy of AddressModel
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? street = null,Object? city = null,Object? province = null,Object? state = null,Object? country = null,Object? postCode = null,}) {
return _then(_AddressModel(
street: null == street ? _self.street : street // ignore: cast_nullable_to_non_nullable
as String,city: null == city ? _self.city : city // ignore: cast_nullable_to_non_nullable
as String,province: null == province ? _self.province : province // ignore: cast_nullable_to_non_nullable
as String,state: null == state ? _self.state : state // ignore: cast_nullable_to_non_nullable
as String,country: null == country ? _self.country : country // ignore: cast_nullable_to_non_nullable
as String,postCode: null == postCode ? _self.postCode : postCode // ignore: cast_nullable_to_non_nullable
as int,
));
}
}
// dart format on

View File

@@ -0,0 +1,27 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'address_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_AddressModel _$AddressModelFromJson(Map<String, dynamic> json) =>
_AddressModel(
street: json['street'] as String,
city: json['city'] as String,
province: json['province'] as String,
state: json['state'] as String,
country: json['country'] as String,
postCode: (json['postCode'] as num).toInt(),
);
Map<String, dynamic> _$AddressModelToJson(_AddressModel instance) =>
<String, dynamic>{
'street': instance.street,
'city': instance.city,
'province': instance.province,
'state': instance.state,
'country': instance.country,
'postCode': instance.postCode,
};

View File

@@ -0,0 +1,53 @@
import 'package:auth/src/features/sign_up/domain/entities/sign_up_request_entity.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'address_model.dart';
part 'sign_up_request_model.freezed.dart';
part 'sign_up_request_model.g.dart';
@freezed
abstract class SignUpRequestModel with _$SignUpRequestModel {
const factory SignUpRequestModel({
required String firstName,
required String lastName,
required String email,
required String phone,
required String language,
required String password,
required List<AddressModel> taxResidences,
required List<AddressModel> addresses,
required int bornAt,
required String userId,
required String placeOfBirth,
required String birthCountry,
@JsonKey(name: 'dni') required String documentNumber,
required String relationship,
}) = _SignUpRequestModel;
factory SignUpRequestModel.fromJson(Map<String, dynamic> json) =>
_$SignUpRequestModelFromJson(json);
}
extension SignUpRequestModelMapper on SignUpRequestEntity {
SignUpRequestModel toModel() => SignUpRequestModel(
firstName: firstName,
lastName: lastName,
email: email,
phone: phone,
language: language,
password: password,
taxResidences: taxResidences
.map((e) => e.toModel())
.toList(growable: false),
addresses: addresses.map((e) => e.toModel()).toList(growable: false),
bornAt: bornAt,
userId: userId,
placeOfBirth: placeOfBirth,
birthCountry: birthCountry,
documentNumber: documentNumber,
relationship: relationship,
);
}

View File

@@ -0,0 +1,328 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'sign_up_request_model.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$SignUpRequestModel {
String get firstName; String get lastName; String get email; String get phone; String get language; String get password; List<AddressModel> get taxResidences; List<AddressModel> get addresses; int get bornAt; String get userId; String get placeOfBirth; String get birthCountry;@JsonKey(name: 'dni') String get documentNumber; String get relationship;
/// Create a copy of SignUpRequestModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$SignUpRequestModelCopyWith<SignUpRequestModel> get copyWith => _$SignUpRequestModelCopyWithImpl<SignUpRequestModel>(this as SignUpRequestModel, _$identity);
/// Serializes this SignUpRequestModel to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is SignUpRequestModel&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.email, email) || other.email == email)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.language, language) || other.language == language)&&(identical(other.password, password) || other.password == password)&&const DeepCollectionEquality().equals(other.taxResidences, taxResidences)&&const DeepCollectionEquality().equals(other.addresses, addresses)&&(identical(other.bornAt, bornAt) || other.bornAt == bornAt)&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.placeOfBirth, placeOfBirth) || other.placeOfBirth == placeOfBirth)&&(identical(other.birthCountry, birthCountry) || other.birthCountry == birthCountry)&&(identical(other.documentNumber, documentNumber) || other.documentNumber == documentNumber)&&(identical(other.relationship, relationship) || other.relationship == relationship));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,firstName,lastName,email,phone,language,password,const DeepCollectionEquality().hash(taxResidences),const DeepCollectionEquality().hash(addresses),bornAt,userId,placeOfBirth,birthCountry,documentNumber,relationship);
@override
String toString() {
return 'SignUpRequestModel(firstName: $firstName, lastName: $lastName, email: $email, phone: $phone, language: $language, password: $password, taxResidences: $taxResidences, addresses: $addresses, bornAt: $bornAt, userId: $userId, placeOfBirth: $placeOfBirth, birthCountry: $birthCountry, documentNumber: $documentNumber, relationship: $relationship)';
}
}
/// @nodoc
abstract mixin class $SignUpRequestModelCopyWith<$Res> {
factory $SignUpRequestModelCopyWith(SignUpRequestModel value, $Res Function(SignUpRequestModel) _then) = _$SignUpRequestModelCopyWithImpl;
@useResult
$Res call({
String firstName, String lastName, String email, String phone, String language, String password, List<AddressModel> taxResidences, List<AddressModel> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry,@JsonKey(name: 'dni') String documentNumber, String relationship
});
}
/// @nodoc
class _$SignUpRequestModelCopyWithImpl<$Res>
implements $SignUpRequestModelCopyWith<$Res> {
_$SignUpRequestModelCopyWithImpl(this._self, this._then);
final SignUpRequestModel _self;
final $Res Function(SignUpRequestModel) _then;
/// Create a copy of SignUpRequestModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? firstName = null,Object? lastName = null,Object? email = null,Object? phone = null,Object? language = null,Object? password = null,Object? taxResidences = null,Object? addresses = null,Object? bornAt = null,Object? userId = null,Object? placeOfBirth = null,Object? birthCountry = null,Object? documentNumber = null,Object? relationship = null,}) {
return _then(_self.copyWith(
firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
as String,lastName: null == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable
as String,email: null == email ? _self.email : email // ignore: cast_nullable_to_non_nullable
as String,phone: null == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable
as String,language: null == language ? _self.language : language // ignore: cast_nullable_to_non_nullable
as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable
as String,taxResidences: null == taxResidences ? _self.taxResidences : taxResidences // ignore: cast_nullable_to_non_nullable
as List<AddressModel>,addresses: null == addresses ? _self.addresses : addresses // ignore: cast_nullable_to_non_nullable
as List<AddressModel>,bornAt: null == bornAt ? _self.bornAt : bornAt // ignore: cast_nullable_to_non_nullable
as int,userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable
as String,placeOfBirth: null == placeOfBirth ? _self.placeOfBirth : placeOfBirth // ignore: cast_nullable_to_non_nullable
as String,birthCountry: null == birthCountry ? _self.birthCountry : birthCountry // ignore: cast_nullable_to_non_nullable
as String,documentNumber: null == documentNumber ? _self.documentNumber : documentNumber // ignore: cast_nullable_to_non_nullable
as String,relationship: null == relationship ? _self.relationship : relationship // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// Adds pattern-matching-related methods to [SignUpRequestModel].
extension SignUpRequestModelPatterns on SignUpRequestModel {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SignUpRequestModel value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _SignUpRequestModel() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SignUpRequestModel value) $default,){
final _that = this;
switch (_that) {
case _SignUpRequestModel():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SignUpRequestModel value)? $default,){
final _that = this;
switch (_that) {
case _SignUpRequestModel() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String firstName, String lastName, String email, String phone, String language, String password, List<AddressModel> taxResidences, List<AddressModel> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry, @JsonKey(name: 'dni') String documentNumber, String relationship)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _SignUpRequestModel() when $default != null:
return $default(_that.firstName,_that.lastName,_that.email,_that.phone,_that.language,_that.password,_that.taxResidences,_that.addresses,_that.bornAt,_that.userId,_that.placeOfBirth,_that.birthCountry,_that.documentNumber,_that.relationship);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String firstName, String lastName, String email, String phone, String language, String password, List<AddressModel> taxResidences, List<AddressModel> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry, @JsonKey(name: 'dni') String documentNumber, String relationship) $default,) {final _that = this;
switch (_that) {
case _SignUpRequestModel():
return $default(_that.firstName,_that.lastName,_that.email,_that.phone,_that.language,_that.password,_that.taxResidences,_that.addresses,_that.bornAt,_that.userId,_that.placeOfBirth,_that.birthCountry,_that.documentNumber,_that.relationship);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String firstName, String lastName, String email, String phone, String language, String password, List<AddressModel> taxResidences, List<AddressModel> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry, @JsonKey(name: 'dni') String documentNumber, String relationship)? $default,) {final _that = this;
switch (_that) {
case _SignUpRequestModel() when $default != null:
return $default(_that.firstName,_that.lastName,_that.email,_that.phone,_that.language,_that.password,_that.taxResidences,_that.addresses,_that.bornAt,_that.userId,_that.placeOfBirth,_that.birthCountry,_that.documentNumber,_that.relationship);case _:
return null;
}
}
}
/// @nodoc
@JsonSerializable()
class _SignUpRequestModel implements SignUpRequestModel {
const _SignUpRequestModel({required this.firstName, required this.lastName, required this.email, required this.phone, required this.language, required this.password, required final List<AddressModel> taxResidences, required final List<AddressModel> addresses, required this.bornAt, required this.userId, required this.placeOfBirth, required this.birthCountry, @JsonKey(name: 'dni') required this.documentNumber, required this.relationship}): _taxResidences = taxResidences,_addresses = addresses;
factory _SignUpRequestModel.fromJson(Map<String, dynamic> json) => _$SignUpRequestModelFromJson(json);
@override final String firstName;
@override final String lastName;
@override final String email;
@override final String phone;
@override final String language;
@override final String password;
final List<AddressModel> _taxResidences;
@override List<AddressModel> get taxResidences {
if (_taxResidences is EqualUnmodifiableListView) return _taxResidences;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_taxResidences);
}
final List<AddressModel> _addresses;
@override List<AddressModel> get addresses {
if (_addresses is EqualUnmodifiableListView) return _addresses;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_addresses);
}
@override final int bornAt;
@override final String userId;
@override final String placeOfBirth;
@override final String birthCountry;
@override@JsonKey(name: 'dni') final String documentNumber;
@override final String relationship;
/// Create a copy of SignUpRequestModel
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$SignUpRequestModelCopyWith<_SignUpRequestModel> get copyWith => __$SignUpRequestModelCopyWithImpl<_SignUpRequestModel>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$SignUpRequestModelToJson(this, );
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SignUpRequestModel&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.email, email) || other.email == email)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.language, language) || other.language == language)&&(identical(other.password, password) || other.password == password)&&const DeepCollectionEquality().equals(other._taxResidences, _taxResidences)&&const DeepCollectionEquality().equals(other._addresses, _addresses)&&(identical(other.bornAt, bornAt) || other.bornAt == bornAt)&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.placeOfBirth, placeOfBirth) || other.placeOfBirth == placeOfBirth)&&(identical(other.birthCountry, birthCountry) || other.birthCountry == birthCountry)&&(identical(other.documentNumber, documentNumber) || other.documentNumber == documentNumber)&&(identical(other.relationship, relationship) || other.relationship == relationship));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,firstName,lastName,email,phone,language,password,const DeepCollectionEquality().hash(_taxResidences),const DeepCollectionEquality().hash(_addresses),bornAt,userId,placeOfBirth,birthCountry,documentNumber,relationship);
@override
String toString() {
return 'SignUpRequestModel(firstName: $firstName, lastName: $lastName, email: $email, phone: $phone, language: $language, password: $password, taxResidences: $taxResidences, addresses: $addresses, bornAt: $bornAt, userId: $userId, placeOfBirth: $placeOfBirth, birthCountry: $birthCountry, documentNumber: $documentNumber, relationship: $relationship)';
}
}
/// @nodoc
abstract mixin class _$SignUpRequestModelCopyWith<$Res> implements $SignUpRequestModelCopyWith<$Res> {
factory _$SignUpRequestModelCopyWith(_SignUpRequestModel value, $Res Function(_SignUpRequestModel) _then) = __$SignUpRequestModelCopyWithImpl;
@override @useResult
$Res call({
String firstName, String lastName, String email, String phone, String language, String password, List<AddressModel> taxResidences, List<AddressModel> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry,@JsonKey(name: 'dni') String documentNumber, String relationship
});
}
/// @nodoc
class __$SignUpRequestModelCopyWithImpl<$Res>
implements _$SignUpRequestModelCopyWith<$Res> {
__$SignUpRequestModelCopyWithImpl(this._self, this._then);
final _SignUpRequestModel _self;
final $Res Function(_SignUpRequestModel) _then;
/// Create a copy of SignUpRequestModel
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? firstName = null,Object? lastName = null,Object? email = null,Object? phone = null,Object? language = null,Object? password = null,Object? taxResidences = null,Object? addresses = null,Object? bornAt = null,Object? userId = null,Object? placeOfBirth = null,Object? birthCountry = null,Object? documentNumber = null,Object? relationship = null,}) {
return _then(_SignUpRequestModel(
firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
as String,lastName: null == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable
as String,email: null == email ? _self.email : email // ignore: cast_nullable_to_non_nullable
as String,phone: null == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable
as String,language: null == language ? _self.language : language // ignore: cast_nullable_to_non_nullable
as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable
as String,taxResidences: null == taxResidences ? _self._taxResidences : taxResidences // ignore: cast_nullable_to_non_nullable
as List<AddressModel>,addresses: null == addresses ? _self._addresses : addresses // ignore: cast_nullable_to_non_nullable
as List<AddressModel>,bornAt: null == bornAt ? _self.bornAt : bornAt // ignore: cast_nullable_to_non_nullable
as int,userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable
as String,placeOfBirth: null == placeOfBirth ? _self.placeOfBirth : placeOfBirth // ignore: cast_nullable_to_non_nullable
as String,birthCountry: null == birthCountry ? _self.birthCountry : birthCountry // ignore: cast_nullable_to_non_nullable
as String,documentNumber: null == documentNumber ? _self.documentNumber : documentNumber // ignore: cast_nullable_to_non_nullable
as String,relationship: null == relationship ? _self.relationship : relationship // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
// dart format on

View File

@@ -0,0 +1,47 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'sign_up_request_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_SignUpRequestModel _$SignUpRequestModelFromJson(Map<String, dynamic> json) =>
_SignUpRequestModel(
firstName: json['firstName'] as String,
lastName: json['lastName'] as String,
email: json['email'] as String,
phone: json['phone'] as String,
language: json['language'] as String,
password: json['password'] as String,
taxResidences: (json['taxResidences'] as List<dynamic>)
.map((e) => AddressModel.fromJson(e as Map<String, dynamic>))
.toList(),
addresses: (json['addresses'] as List<dynamic>)
.map((e) => AddressModel.fromJson(e as Map<String, dynamic>))
.toList(),
bornAt: (json['bornAt'] as num).toInt(),
userId: json['userId'] as String,
placeOfBirth: json['placeOfBirth'] as String,
birthCountry: json['birthCountry'] as String,
documentNumber: json['dni'] as String,
relationship: json['relationship'] as String,
);
Map<String, dynamic> _$SignUpRequestModelToJson(_SignUpRequestModel instance) =>
<String, dynamic>{
'firstName': instance.firstName,
'lastName': instance.lastName,
'email': instance.email,
'phone': instance.phone,
'language': instance.language,
'password': instance.password,
'taxResidences': instance.taxResidences,
'addresses': instance.addresses,
'bornAt': instance.bornAt,
'userId': instance.userId,
'placeOfBirth': instance.placeOfBirth,
'birthCountry': instance.birthCountry,
'dni': instance.documentNumber,
'relationship': instance.relationship,
};

View File

@@ -0,0 +1,24 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'sign_up_response_model.freezed.dart';
part 'sign_up_response_model.g.dart';
@freezed
abstract class SignUpResponseModel with _$SignUpResponseModel {
const factory SignUpResponseModel({
required bool isCreated,
required SignUpResponseItemModel item,
}) = _SignUpResponseModel;
factory SignUpResponseModel.fromJson(Map<String, dynamic> json) =>
_$SignUpResponseModelFromJson(json);
}
@freezed
abstract class SignUpResponseItemModel with _$SignUpResponseItemModel {
const factory SignUpResponseItemModel({required String token}) =
_SignUpResponseItemModel;
factory SignUpResponseItemModel.fromJson(Map<String, dynamic> json) =>
_$SignUpResponseItemModelFromJson(json);
}

View File

@@ -0,0 +1,561 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'sign_up_response_model.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$SignUpResponseModel {
bool get isCreated; SignUpResponseItemModel get item;
/// Create a copy of SignUpResponseModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$SignUpResponseModelCopyWith<SignUpResponseModel> get copyWith => _$SignUpResponseModelCopyWithImpl<SignUpResponseModel>(this as SignUpResponseModel, _$identity);
/// Serializes this SignUpResponseModel to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is SignUpResponseModel&&(identical(other.isCreated, isCreated) || other.isCreated == isCreated)&&(identical(other.item, item) || other.item == item));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,isCreated,item);
@override
String toString() {
return 'SignUpResponseModel(isCreated: $isCreated, item: $item)';
}
}
/// @nodoc
abstract mixin class $SignUpResponseModelCopyWith<$Res> {
factory $SignUpResponseModelCopyWith(SignUpResponseModel value, $Res Function(SignUpResponseModel) _then) = _$SignUpResponseModelCopyWithImpl;
@useResult
$Res call({
bool isCreated, SignUpResponseItemModel item
});
$SignUpResponseItemModelCopyWith<$Res> get item;
}
/// @nodoc
class _$SignUpResponseModelCopyWithImpl<$Res>
implements $SignUpResponseModelCopyWith<$Res> {
_$SignUpResponseModelCopyWithImpl(this._self, this._then);
final SignUpResponseModel _self;
final $Res Function(SignUpResponseModel) _then;
/// Create a copy of SignUpResponseModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? isCreated = null,Object? item = null,}) {
return _then(_self.copyWith(
isCreated: null == isCreated ? _self.isCreated : isCreated // ignore: cast_nullable_to_non_nullable
as bool,item: null == item ? _self.item : item // ignore: cast_nullable_to_non_nullable
as SignUpResponseItemModel,
));
}
/// Create a copy of SignUpResponseModel
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$SignUpResponseItemModelCopyWith<$Res> get item {
return $SignUpResponseItemModelCopyWith<$Res>(_self.item, (value) {
return _then(_self.copyWith(item: value));
});
}
}
/// Adds pattern-matching-related methods to [SignUpResponseModel].
extension SignUpResponseModelPatterns on SignUpResponseModel {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SignUpResponseModel value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _SignUpResponseModel() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SignUpResponseModel value) $default,){
final _that = this;
switch (_that) {
case _SignUpResponseModel():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SignUpResponseModel value)? $default,){
final _that = this;
switch (_that) {
case _SignUpResponseModel() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( bool isCreated, SignUpResponseItemModel item)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _SignUpResponseModel() when $default != null:
return $default(_that.isCreated,_that.item);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( bool isCreated, SignUpResponseItemModel item) $default,) {final _that = this;
switch (_that) {
case _SignUpResponseModel():
return $default(_that.isCreated,_that.item);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool isCreated, SignUpResponseItemModel item)? $default,) {final _that = this;
switch (_that) {
case _SignUpResponseModel() when $default != null:
return $default(_that.isCreated,_that.item);case _:
return null;
}
}
}
/// @nodoc
@JsonSerializable()
class _SignUpResponseModel implements SignUpResponseModel {
const _SignUpResponseModel({required this.isCreated, required this.item});
factory _SignUpResponseModel.fromJson(Map<String, dynamic> json) => _$SignUpResponseModelFromJson(json);
@override final bool isCreated;
@override final SignUpResponseItemModel item;
/// Create a copy of SignUpResponseModel
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$SignUpResponseModelCopyWith<_SignUpResponseModel> get copyWith => __$SignUpResponseModelCopyWithImpl<_SignUpResponseModel>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$SignUpResponseModelToJson(this, );
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SignUpResponseModel&&(identical(other.isCreated, isCreated) || other.isCreated == isCreated)&&(identical(other.item, item) || other.item == item));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,isCreated,item);
@override
String toString() {
return 'SignUpResponseModel(isCreated: $isCreated, item: $item)';
}
}
/// @nodoc
abstract mixin class _$SignUpResponseModelCopyWith<$Res> implements $SignUpResponseModelCopyWith<$Res> {
factory _$SignUpResponseModelCopyWith(_SignUpResponseModel value, $Res Function(_SignUpResponseModel) _then) = __$SignUpResponseModelCopyWithImpl;
@override @useResult
$Res call({
bool isCreated, SignUpResponseItemModel item
});
@override $SignUpResponseItemModelCopyWith<$Res> get item;
}
/// @nodoc
class __$SignUpResponseModelCopyWithImpl<$Res>
implements _$SignUpResponseModelCopyWith<$Res> {
__$SignUpResponseModelCopyWithImpl(this._self, this._then);
final _SignUpResponseModel _self;
final $Res Function(_SignUpResponseModel) _then;
/// Create a copy of SignUpResponseModel
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? isCreated = null,Object? item = null,}) {
return _then(_SignUpResponseModel(
isCreated: null == isCreated ? _self.isCreated : isCreated // ignore: cast_nullable_to_non_nullable
as bool,item: null == item ? _self.item : item // ignore: cast_nullable_to_non_nullable
as SignUpResponseItemModel,
));
}
/// Create a copy of SignUpResponseModel
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$SignUpResponseItemModelCopyWith<$Res> get item {
return $SignUpResponseItemModelCopyWith<$Res>(_self.item, (value) {
return _then(_self.copyWith(item: value));
});
}
}
/// @nodoc
mixin _$SignUpResponseItemModel {
String get token;
/// Create a copy of SignUpResponseItemModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$SignUpResponseItemModelCopyWith<SignUpResponseItemModel> get copyWith => _$SignUpResponseItemModelCopyWithImpl<SignUpResponseItemModel>(this as SignUpResponseItemModel, _$identity);
/// Serializes this SignUpResponseItemModel to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is SignUpResponseItemModel&&(identical(other.token, token) || other.token == token));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,token);
@override
String toString() {
return 'SignUpResponseItemModel(token: $token)';
}
}
/// @nodoc
abstract mixin class $SignUpResponseItemModelCopyWith<$Res> {
factory $SignUpResponseItemModelCopyWith(SignUpResponseItemModel value, $Res Function(SignUpResponseItemModel) _then) = _$SignUpResponseItemModelCopyWithImpl;
@useResult
$Res call({
String token
});
}
/// @nodoc
class _$SignUpResponseItemModelCopyWithImpl<$Res>
implements $SignUpResponseItemModelCopyWith<$Res> {
_$SignUpResponseItemModelCopyWithImpl(this._self, this._then);
final SignUpResponseItemModel _self;
final $Res Function(SignUpResponseItemModel) _then;
/// Create a copy of SignUpResponseItemModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? token = null,}) {
return _then(_self.copyWith(
token: null == token ? _self.token : token // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// Adds pattern-matching-related methods to [SignUpResponseItemModel].
extension SignUpResponseItemModelPatterns on SignUpResponseItemModel {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SignUpResponseItemModel value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _SignUpResponseItemModel() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SignUpResponseItemModel value) $default,){
final _that = this;
switch (_that) {
case _SignUpResponseItemModel():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SignUpResponseItemModel value)? $default,){
final _that = this;
switch (_that) {
case _SignUpResponseItemModel() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String token)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _SignUpResponseItemModel() when $default != null:
return $default(_that.token);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String token) $default,) {final _that = this;
switch (_that) {
case _SignUpResponseItemModel():
return $default(_that.token);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String token)? $default,) {final _that = this;
switch (_that) {
case _SignUpResponseItemModel() when $default != null:
return $default(_that.token);case _:
return null;
}
}
}
/// @nodoc
@JsonSerializable()
class _SignUpResponseItemModel implements SignUpResponseItemModel {
const _SignUpResponseItemModel({required this.token});
factory _SignUpResponseItemModel.fromJson(Map<String, dynamic> json) => _$SignUpResponseItemModelFromJson(json);
@override final String token;
/// Create a copy of SignUpResponseItemModel
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$SignUpResponseItemModelCopyWith<_SignUpResponseItemModel> get copyWith => __$SignUpResponseItemModelCopyWithImpl<_SignUpResponseItemModel>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$SignUpResponseItemModelToJson(this, );
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SignUpResponseItemModel&&(identical(other.token, token) || other.token == token));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,token);
@override
String toString() {
return 'SignUpResponseItemModel(token: $token)';
}
}
/// @nodoc
abstract mixin class _$SignUpResponseItemModelCopyWith<$Res> implements $SignUpResponseItemModelCopyWith<$Res> {
factory _$SignUpResponseItemModelCopyWith(_SignUpResponseItemModel value, $Res Function(_SignUpResponseItemModel) _then) = __$SignUpResponseItemModelCopyWithImpl;
@override @useResult
$Res call({
String token
});
}
/// @nodoc
class __$SignUpResponseItemModelCopyWithImpl<$Res>
implements _$SignUpResponseItemModelCopyWith<$Res> {
__$SignUpResponseItemModelCopyWithImpl(this._self, this._then);
final _SignUpResponseItemModel _self;
final $Res Function(_SignUpResponseItemModel) _then;
/// Create a copy of SignUpResponseItemModel
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? token = null,}) {
return _then(_SignUpResponseItemModel(
token: null == token ? _self.token : token // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
// dart format on

View File

@@ -0,0 +1,27 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'sign_up_response_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_SignUpResponseModel _$SignUpResponseModelFromJson(Map<String, dynamic> json) =>
_SignUpResponseModel(
isCreated: json['isCreated'] as bool,
item: SignUpResponseItemModel.fromJson(
json['item'] as Map<String, dynamic>,
),
);
Map<String, dynamic> _$SignUpResponseModelToJson(
_SignUpResponseModel instance,
) => <String, dynamic>{'isCreated': instance.isCreated, 'item': instance.item};
_SignUpResponseItemModel _$SignUpResponseItemModelFromJson(
Map<String, dynamic> json,
) => _SignUpResponseItemModel(token: json['token'] as String);
Map<String, dynamic> _$SignUpResponseItemModelToJson(
_SignUpResponseItemModel instance,
) => <String, dynamic>{'token': instance.token};

View File

@@ -0,0 +1,37 @@
import 'package:auth/src/features/sign_up/domain/entities/two_fa_secret_entity.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'two_fa_secret_response_model.freezed.dart';
part 'two_fa_secret_response_model.g.dart';
@freezed
abstract class TwoFASecretResponseModel with _$TwoFASecretResponseModel {
const factory TwoFASecretResponseModel({
required bool isCreated,
required TwoFASecretItemResponseModel item,
}) = _TwoFASecretResponseModel;
factory TwoFASecretResponseModel.fromJson(Map<String, dynamic> json) =>
_$TwoFASecretResponseModelFromJson(json);
}
@freezed
abstract class TwoFASecretItemResponseModel
with _$TwoFASecretItemResponseModel {
const factory TwoFASecretItemResponseModel({
required String secret,
required String qr,
}) = _TwoFASecretItemResponseModel;
factory TwoFASecretItemResponseModel.fromJson(Map<String, dynamic> json) =>
_$TwoFASecretItemResponseModelFromJson(json);
}
extension TwoFASecretResponseModelMapper on TwoFASecretResponseModel {
TwoFASecretEntity toEntity() {
return TwoFASecretEntity(
isCreated: isCreated,
item: TwoFASecretItemEntity(secret: item.secret, qr: item.qr),
);
}
}

View File

@@ -0,0 +1,564 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'two_fa_secret_response_model.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$TwoFASecretResponseModel {
bool get isCreated; TwoFASecretItemResponseModel get item;
/// Create a copy of TwoFASecretResponseModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$TwoFASecretResponseModelCopyWith<TwoFASecretResponseModel> get copyWith => _$TwoFASecretResponseModelCopyWithImpl<TwoFASecretResponseModel>(this as TwoFASecretResponseModel, _$identity);
/// Serializes this TwoFASecretResponseModel to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is TwoFASecretResponseModel&&(identical(other.isCreated, isCreated) || other.isCreated == isCreated)&&(identical(other.item, item) || other.item == item));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,isCreated,item);
@override
String toString() {
return 'TwoFASecretResponseModel(isCreated: $isCreated, item: $item)';
}
}
/// @nodoc
abstract mixin class $TwoFASecretResponseModelCopyWith<$Res> {
factory $TwoFASecretResponseModelCopyWith(TwoFASecretResponseModel value, $Res Function(TwoFASecretResponseModel) _then) = _$TwoFASecretResponseModelCopyWithImpl;
@useResult
$Res call({
bool isCreated, TwoFASecretItemResponseModel item
});
$TwoFASecretItemResponseModelCopyWith<$Res> get item;
}
/// @nodoc
class _$TwoFASecretResponseModelCopyWithImpl<$Res>
implements $TwoFASecretResponseModelCopyWith<$Res> {
_$TwoFASecretResponseModelCopyWithImpl(this._self, this._then);
final TwoFASecretResponseModel _self;
final $Res Function(TwoFASecretResponseModel) _then;
/// Create a copy of TwoFASecretResponseModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? isCreated = null,Object? item = null,}) {
return _then(_self.copyWith(
isCreated: null == isCreated ? _self.isCreated : isCreated // ignore: cast_nullable_to_non_nullable
as bool,item: null == item ? _self.item : item // ignore: cast_nullable_to_non_nullable
as TwoFASecretItemResponseModel,
));
}
/// Create a copy of TwoFASecretResponseModel
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TwoFASecretItemResponseModelCopyWith<$Res> get item {
return $TwoFASecretItemResponseModelCopyWith<$Res>(_self.item, (value) {
return _then(_self.copyWith(item: value));
});
}
}
/// Adds pattern-matching-related methods to [TwoFASecretResponseModel].
extension TwoFASecretResponseModelPatterns on TwoFASecretResponseModel {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _TwoFASecretResponseModel value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _TwoFASecretResponseModel() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _TwoFASecretResponseModel value) $default,){
final _that = this;
switch (_that) {
case _TwoFASecretResponseModel():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TwoFASecretResponseModel value)? $default,){
final _that = this;
switch (_that) {
case _TwoFASecretResponseModel() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( bool isCreated, TwoFASecretItemResponseModel item)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _TwoFASecretResponseModel() when $default != null:
return $default(_that.isCreated,_that.item);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( bool isCreated, TwoFASecretItemResponseModel item) $default,) {final _that = this;
switch (_that) {
case _TwoFASecretResponseModel():
return $default(_that.isCreated,_that.item);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool isCreated, TwoFASecretItemResponseModel item)? $default,) {final _that = this;
switch (_that) {
case _TwoFASecretResponseModel() when $default != null:
return $default(_that.isCreated,_that.item);case _:
return null;
}
}
}
/// @nodoc
@JsonSerializable()
class _TwoFASecretResponseModel implements TwoFASecretResponseModel {
const _TwoFASecretResponseModel({required this.isCreated, required this.item});
factory _TwoFASecretResponseModel.fromJson(Map<String, dynamic> json) => _$TwoFASecretResponseModelFromJson(json);
@override final bool isCreated;
@override final TwoFASecretItemResponseModel item;
/// Create a copy of TwoFASecretResponseModel
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$TwoFASecretResponseModelCopyWith<_TwoFASecretResponseModel> get copyWith => __$TwoFASecretResponseModelCopyWithImpl<_TwoFASecretResponseModel>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$TwoFASecretResponseModelToJson(this, );
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TwoFASecretResponseModel&&(identical(other.isCreated, isCreated) || other.isCreated == isCreated)&&(identical(other.item, item) || other.item == item));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,isCreated,item);
@override
String toString() {
return 'TwoFASecretResponseModel(isCreated: $isCreated, item: $item)';
}
}
/// @nodoc
abstract mixin class _$TwoFASecretResponseModelCopyWith<$Res> implements $TwoFASecretResponseModelCopyWith<$Res> {
factory _$TwoFASecretResponseModelCopyWith(_TwoFASecretResponseModel value, $Res Function(_TwoFASecretResponseModel) _then) = __$TwoFASecretResponseModelCopyWithImpl;
@override @useResult
$Res call({
bool isCreated, TwoFASecretItemResponseModel item
});
@override $TwoFASecretItemResponseModelCopyWith<$Res> get item;
}
/// @nodoc
class __$TwoFASecretResponseModelCopyWithImpl<$Res>
implements _$TwoFASecretResponseModelCopyWith<$Res> {
__$TwoFASecretResponseModelCopyWithImpl(this._self, this._then);
final _TwoFASecretResponseModel _self;
final $Res Function(_TwoFASecretResponseModel) _then;
/// Create a copy of TwoFASecretResponseModel
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? isCreated = null,Object? item = null,}) {
return _then(_TwoFASecretResponseModel(
isCreated: null == isCreated ? _self.isCreated : isCreated // ignore: cast_nullable_to_non_nullable
as bool,item: null == item ? _self.item : item // ignore: cast_nullable_to_non_nullable
as TwoFASecretItemResponseModel,
));
}
/// Create a copy of TwoFASecretResponseModel
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TwoFASecretItemResponseModelCopyWith<$Res> get item {
return $TwoFASecretItemResponseModelCopyWith<$Res>(_self.item, (value) {
return _then(_self.copyWith(item: value));
});
}
}
/// @nodoc
mixin _$TwoFASecretItemResponseModel {
String get secret; String get qr;
/// Create a copy of TwoFASecretItemResponseModel
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$TwoFASecretItemResponseModelCopyWith<TwoFASecretItemResponseModel> get copyWith => _$TwoFASecretItemResponseModelCopyWithImpl<TwoFASecretItemResponseModel>(this as TwoFASecretItemResponseModel, _$identity);
/// Serializes this TwoFASecretItemResponseModel to a JSON map.
Map<String, dynamic> toJson();
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is TwoFASecretItemResponseModel&&(identical(other.secret, secret) || other.secret == secret)&&(identical(other.qr, qr) || other.qr == qr));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,secret,qr);
@override
String toString() {
return 'TwoFASecretItemResponseModel(secret: $secret, qr: $qr)';
}
}
/// @nodoc
abstract mixin class $TwoFASecretItemResponseModelCopyWith<$Res> {
factory $TwoFASecretItemResponseModelCopyWith(TwoFASecretItemResponseModel value, $Res Function(TwoFASecretItemResponseModel) _then) = _$TwoFASecretItemResponseModelCopyWithImpl;
@useResult
$Res call({
String secret, String qr
});
}
/// @nodoc
class _$TwoFASecretItemResponseModelCopyWithImpl<$Res>
implements $TwoFASecretItemResponseModelCopyWith<$Res> {
_$TwoFASecretItemResponseModelCopyWithImpl(this._self, this._then);
final TwoFASecretItemResponseModel _self;
final $Res Function(TwoFASecretItemResponseModel) _then;
/// Create a copy of TwoFASecretItemResponseModel
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? secret = null,Object? qr = null,}) {
return _then(_self.copyWith(
secret: null == secret ? _self.secret : secret // ignore: cast_nullable_to_non_nullable
as String,qr: null == qr ? _self.qr : qr // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// Adds pattern-matching-related methods to [TwoFASecretItemResponseModel].
extension TwoFASecretItemResponseModelPatterns on TwoFASecretItemResponseModel {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _TwoFASecretItemResponseModel value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _TwoFASecretItemResponseModel() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _TwoFASecretItemResponseModel value) $default,){
final _that = this;
switch (_that) {
case _TwoFASecretItemResponseModel():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TwoFASecretItemResponseModel value)? $default,){
final _that = this;
switch (_that) {
case _TwoFASecretItemResponseModel() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String secret, String qr)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _TwoFASecretItemResponseModel() when $default != null:
return $default(_that.secret,_that.qr);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String secret, String qr) $default,) {final _that = this;
switch (_that) {
case _TwoFASecretItemResponseModel():
return $default(_that.secret,_that.qr);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String secret, String qr)? $default,) {final _that = this;
switch (_that) {
case _TwoFASecretItemResponseModel() when $default != null:
return $default(_that.secret,_that.qr);case _:
return null;
}
}
}
/// @nodoc
@JsonSerializable()
class _TwoFASecretItemResponseModel implements TwoFASecretItemResponseModel {
const _TwoFASecretItemResponseModel({required this.secret, required this.qr});
factory _TwoFASecretItemResponseModel.fromJson(Map<String, dynamic> json) => _$TwoFASecretItemResponseModelFromJson(json);
@override final String secret;
@override final String qr;
/// Create a copy of TwoFASecretItemResponseModel
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$TwoFASecretItemResponseModelCopyWith<_TwoFASecretItemResponseModel> get copyWith => __$TwoFASecretItemResponseModelCopyWithImpl<_TwoFASecretItemResponseModel>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$TwoFASecretItemResponseModelToJson(this, );
}
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TwoFASecretItemResponseModel&&(identical(other.secret, secret) || other.secret == secret)&&(identical(other.qr, qr) || other.qr == qr));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@override
int get hashCode => Object.hash(runtimeType,secret,qr);
@override
String toString() {
return 'TwoFASecretItemResponseModel(secret: $secret, qr: $qr)';
}
}
/// @nodoc
abstract mixin class _$TwoFASecretItemResponseModelCopyWith<$Res> implements $TwoFASecretItemResponseModelCopyWith<$Res> {
factory _$TwoFASecretItemResponseModelCopyWith(_TwoFASecretItemResponseModel value, $Res Function(_TwoFASecretItemResponseModel) _then) = __$TwoFASecretItemResponseModelCopyWithImpl;
@override @useResult
$Res call({
String secret, String qr
});
}
/// @nodoc
class __$TwoFASecretItemResponseModelCopyWithImpl<$Res>
implements _$TwoFASecretItemResponseModelCopyWith<$Res> {
__$TwoFASecretItemResponseModelCopyWithImpl(this._self, this._then);
final _TwoFASecretItemResponseModel _self;
final $Res Function(_TwoFASecretItemResponseModel) _then;
/// Create a copy of TwoFASecretItemResponseModel
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? secret = null,Object? qr = null,}) {
return _then(_TwoFASecretItemResponseModel(
secret: null == secret ? _self.secret : secret // ignore: cast_nullable_to_non_nullable
as String,qr: null == qr ? _self.qr : qr // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
// dart format on

View File

@@ -0,0 +1,31 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'two_fa_secret_response_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_TwoFASecretResponseModel _$TwoFASecretResponseModelFromJson(
Map<String, dynamic> json,
) => _TwoFASecretResponseModel(
isCreated: json['isCreated'] as bool,
item: TwoFASecretItemResponseModel.fromJson(
json['item'] as Map<String, dynamic>,
),
);
Map<String, dynamic> _$TwoFASecretResponseModelToJson(
_TwoFASecretResponseModel instance,
) => <String, dynamic>{'isCreated': instance.isCreated, 'item': instance.item};
_TwoFASecretItemResponseModel _$TwoFASecretItemResponseModelFromJson(
Map<String, dynamic> json,
) => _TwoFASecretItemResponseModel(
secret: json['secret'] as String,
qr: json['qr'] as String,
);
Map<String, dynamic> _$TwoFASecretItemResponseModelToJson(
_TwoFASecretItemResponseModel instance,
) => <String, dynamic>{'secret': instance.secret, 'qr': instance.qr};

View File

@@ -1,5 +1,7 @@
import 'package:auth/src/core/data/datasource/auth_remote_datasource.dart';
import 'package:auth/src/core/domain/repositories/auth_repository.dart';
import 'package:auth/src/features/sign_up/domain/entities/sign_up_request_entity.dart';
import 'package:auth/src/features/sign_up/domain/entities/two_fa_secret_entity.dart';
class AuthRepositoryImpl implements AuthRepository {
const AuthRepositoryImpl(this._remote);
@@ -25,4 +27,22 @@ class AuthRepositoryImpl implements AuthRepository {
Future<void> twoFactor({required String token, required String code}) {
return _remote.twoFALogin(token: token, code: code);
}
@override
Future<String> signUp({required SignUpRequestEntity request}) {
return _remote.signUp(request: request);
}
@override
Future<TwoFASecretEntity> generateTwoFASignUp({required String token}) {
return _remote.generateTwoFASignUp(token: token);
}
@override
Future<void> verifyTwoFACodeSignUp({
required String token,
required String code,
}) {
return _remote.verifyTwoFACodeSignUp(token: token, code: code);
}
}

View File

@@ -1,3 +1,6 @@
import 'package:auth/src/features/sign_up/domain/entities/sign_up_request_entity.dart';
import 'package:auth/src/features/sign_up/domain/entities/two_fa_secret_entity.dart';
abstract class AuthRepository {
Future<void> requestPhoneCode({required String phone});
@@ -6,4 +9,12 @@ abstract class AuthRepository {
Future<String> login({required String email, required String password});
Future<void> twoFactor({required String token, required String code});
Future<String> signUp({required SignUpRequestEntity request});
Future<TwoFASecretEntity> generateTwoFASignUp({required String token});
Future<void> verifyTwoFACodeSignUp({
required String token,
required String code,
});
}

View File

@@ -2,7 +2,7 @@ import 'package:auth/auth.dart';
import 'package:auth/src/features/device_sign_up/add_kid_screen.dart';
import 'package:auth/src/features/device_sign_up/link_watch/link_watch_screen.dart';
import 'package:auth/src/features/device_sign_up/link_watch/link_watch_previous_screen.dart';
import 'package:auth/src/features/sign_up/account_created_screen.dart';
import 'package:auth/src/features/sign_up/presentation/account_created_screen.dart';
import 'package:auth/src/widgets/layouts/form_step_layout.dart';
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
@@ -103,10 +103,7 @@ class DeviceSignupScreenState extends ConsumerState<DeviceSignupScreen> {
nextStep: () => {},
previousStep: () => {},
),
AccountCreatedScreen(
navigationContract: navigationContract,
kidAccount: true,
),
AccountCreatedScreen(navigationContract: navigationContract),
];
}
}

View File

@@ -31,7 +31,51 @@ class LoginScreen extends ConsumerWidget {
isDismissible: false,
enableDrag: false,
backgroundColor: Colors.transparent,
builder: (_) => TwoFactorBottomSheet(token: token),
builder: (context) {
return Consumer(
builder: (context, ref, _) {
final theme = ref.watch(themePortProvider);
final vm = ref.read(loginViewModelProvider.notifier);
final otpErrorKey = ref.watch(
loginViewModelProvider.select((s) => s.otpError),
);
final isOtpLoading = ref.watch(
loginViewModelProvider.select((s) => s.isOtpLoading),
);
final otpCode = ref.watch(
loginViewModelProvider.select((s) => s.otpCode),
);
final otpErrorText = otpErrorKey.isEmpty
? ''
: context.translate(otpErrorKey);
Future<void> onVerify() async {
FocusManager.instance.primaryFocus?.unfocus();
final ok = await vm.twoFactor(token: token);
if (!context.mounted) return;
if (ok) Navigator.of(context).pop(true);
}
return TwoFactorBottomSheetView(
theme: theme,
title: context.translate(I18n.twoFactorTitle),
subtitle: context.translate(I18n.twoFactorSubtitle),
verifyText: context.translate(I18n.twoFactorVerify),
closeText: context.translate(I18n.close),
isOtpLoading: isOtpLoading,
otpCode: otpCode,
otpErrorText: otpErrorText,
onChanged: vm.setOtpCode,
onVerify: onVerify,
onClose: () => Navigator.of(context).pop(false),
);
},
);
},
);
if (!context.mounted) return;
@@ -54,7 +98,7 @@ class LoginScreen extends ConsumerWidget {
child: AbsorbPointer(
absorbing: isLoading,
child: SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 40),
padding: EdgeInsets.symmetric(horizontal: 24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
@@ -320,7 +364,7 @@ class _Footer extends ConsumerWidget {
TextButton(
onPressed: isLoading
? null
: () => navigationContract.goTo(AppRoutes.signup),
: () => navigationContract.pushTo(AppRoutes.signup),
child: Text(
context.translate(I18n.createOneNow),
style: const TextStyle(

View File

@@ -1,53 +1,52 @@
import 'package:auth/src/features/login/presentation/state/login_view_model.dart';
import 'dart:async';
import 'package:auth/src/features/login/presentation/widgets/otp_code_fields.dart';
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:sf_localizations/sf_localizations.dart';
class TwoFactorBottomSheet extends ConsumerWidget {
const TwoFactorBottomSheet({super.key, required this.token});
class TwoFactorBottomSheetView extends StatelessWidget {
const TwoFactorBottomSheetView({
super.key,
required this.theme,
required this.title,
required this.subtitle,
required this.verifyText,
required this.closeText,
required this.isOtpLoading,
required this.otpCode,
required this.otpErrorText,
required this.onChanged,
required this.onVerify,
required this.onClose,
});
final String token;
final ThemePort theme;
final String title;
final String subtitle;
final String verifyText;
final String closeText;
final bool isOtpLoading;
final String otpCode;
final String otpErrorText;
final ValueChanged<String> onChanged;
final Future<void> Function() onVerify;
final VoidCallback onClose;
bool get _isValidOtp => otpCode.trim().length == 6;
@override
Widget build(BuildContext context, WidgetRef ref) {
final theme = ref.watch(themePortProvider);
final vm = ref.read(loginViewModelProvider.notifier);
final String otpErrorKey = ref.watch(
loginViewModelProvider.select((s) => s.otpError),
);
final bool isOtpLoading = ref.watch(
loginViewModelProvider.select((s) => s.isOtpLoading),
);
final String otpCode = ref.watch(
loginViewModelProvider.select((s) => s.otpCode),
);
final String otpErrorText = otpErrorKey.isEmpty
? ''
: context.translate(otpErrorKey);
Future<void> onVerify() async {
FocusManager.instance.primaryFocus?.unfocus();
final ok = await vm.twoFactor(token: token);
if (!context.mounted) return;
if (ok) Navigator.of(context).pop(true);
}
Widget build(BuildContext context) {
final bottomInset = MediaQuery.of(context).viewInsets.bottom;
return Container(
decoration: BoxDecoration(
color: theme.getColorFor(ThemeCode.backgroundPrimary),
borderRadius: const BorderRadius.vertical(top: Radius.circular(24)),
),
padding: EdgeInsets.fromLTRB(
24,
12,
24,
24 + MediaQuery.of(context).viewInsets.bottom,
),
padding: EdgeInsets.fromLTRB(24, 12, 24, 24 + bottomInset),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
@@ -62,13 +61,13 @@ class TwoFactorBottomSheet extends ConsumerWidget {
const SizedBox(height: 16),
Text(
context.translate(I18n.twoFactorTitle),
title,
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w700),
),
const SizedBox(height: 8),
Text(
context.translate(I18n.twoFactorSubtitle),
subtitle,
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 14),
),
@@ -78,18 +77,19 @@ class TwoFactorBottomSheet extends ConsumerWidget {
length: 6,
enabled: !isOtpLoading,
errorText: otpErrorText.isEmpty ? null : otpErrorText,
onChanged: (code) {
vm.setOtpCode(code);
onChanged: onChanged,
onCompleted: (_) {
if (isOtpLoading || !_isValidOtp) return;
unawaited(onVerify());
},
onCompleted: (_) => onVerify(),
),
const SizedBox(height: 20),
PrimaryButton(
onPressed: (isOtpLoading || otpCode.trim().length != 6)
onPressed: (isOtpLoading || !_isValidOtp)
? () {}
: onVerify,
text: context.translate(I18n.twoFactorVerify),
: () => unawaited(onVerify()),
text: verifyText,
color: theme.getColorFor(ThemeCode.buttonPrimary),
leading: isOtpLoading
? const SizedBox(
@@ -106,10 +106,8 @@ class TwoFactorBottomSheet extends ConsumerWidget {
const SizedBox(height: 12),
TextButton(
onPressed: isOtpLoading
? null
: () => Navigator.of(context).pop(false),
child: Text(context.translate(I18n.close)),
onPressed: isOtpLoading ? null : onClose,
child: Text(closeText),
),
],
),

View File

@@ -1,90 +0,0 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:navigation/navigation.dart';
class AccountCreatedScreen extends ConsumerWidget {
final bool kidAccount;
final NavigationContract navigationContract;
const AccountCreatedScreen({
super.key,
required this.kidAccount,
required this.navigationContract,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
final theme = ref.watch(themePortProvider);
final email = "usuario@example.com";
final fullName = "Carlos Pérez Cruz";
final model = "SaveWatch Plus 2";
final id = "1106652524";
return Scaffold(
backgroundColor: theme.getColorFor(ThemeCode.backgroundPrimary),
body: Container(
margin: EdgeInsets.all(30),
child: Center(
child: Column(
spacing: 20,
children: [
Spacer(flex: 10),
Icon(
Icons.check,
color: theme.getColorFor(ThemeCode.buttonPrimary),
size: 50,
),
Text(
"Cuenta creada",
style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
),
Text.rich(
textAlign: TextAlign.center,
TextSpan(
text: "Has creado la cuenta para:\n",
children: [
TextSpan(
text: fullName,
style: TextStyle(fontWeight: FontWeight.bold),
),
],
),
),
if (!kidAccount) Text.rich(
textAlign: TextAlign.center,
TextSpan(
text: "Hemos enviado un email de verificación a:\n",
children: [
TextSpan(
text: email,
style: TextStyle(fontWeight: FontWeight.bold),
),
],
),
),
if (kidAccount) Text("Reloj: $model\nID del reloj: $id"),
Text(
"Crea la cuenta de tu peque e ingresa su \nprimera paga para utilizarla con su reloj",
textAlign: TextAlign.center,
),
PrimaryButton(
onPressed: () => {
if (kidAccount){
navigationContract.goTo(AppRoutes.dashboardHome)
} else {
navigationContract.pushTo(AppRoutes.deviceSignup)
}
},
text: "Continuar",
color: theme.getColorFor(ThemeCode.buttonPrimary)
),
Spacer(flex: 8),
],
),
),
),
);
}
}

View File

@@ -0,0 +1,15 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'address_entity.freezed.dart';
@freezed
abstract class AddressEntity with _$AddressEntity {
const factory AddressEntity({
required String street,
required String city,
required String province,
required String state,
required String country,
required int postCode,
}) = _AddressEntity;
}

View File

@@ -0,0 +1,286 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'address_entity.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$AddressEntity {
String get street; String get city; String get province; String get state; String get country; int get postCode;
/// Create a copy of AddressEntity
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$AddressEntityCopyWith<AddressEntity> get copyWith => _$AddressEntityCopyWithImpl<AddressEntity>(this as AddressEntity, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is AddressEntity&&(identical(other.street, street) || other.street == street)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.state, state) || other.state == state)&&(identical(other.country, country) || other.country == country)&&(identical(other.postCode, postCode) || other.postCode == postCode));
}
@override
int get hashCode => Object.hash(runtimeType,street,city,province,state,country,postCode);
@override
String toString() {
return 'AddressEntity(street: $street, city: $city, province: $province, state: $state, country: $country, postCode: $postCode)';
}
}
/// @nodoc
abstract mixin class $AddressEntityCopyWith<$Res> {
factory $AddressEntityCopyWith(AddressEntity value, $Res Function(AddressEntity) _then) = _$AddressEntityCopyWithImpl;
@useResult
$Res call({
String street, String city, String province, String state, String country, int postCode
});
}
/// @nodoc
class _$AddressEntityCopyWithImpl<$Res>
implements $AddressEntityCopyWith<$Res> {
_$AddressEntityCopyWithImpl(this._self, this._then);
final AddressEntity _self;
final $Res Function(AddressEntity) _then;
/// Create a copy of AddressEntity
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? street = null,Object? city = null,Object? province = null,Object? state = null,Object? country = null,Object? postCode = null,}) {
return _then(_self.copyWith(
street: null == street ? _self.street : street // ignore: cast_nullable_to_non_nullable
as String,city: null == city ? _self.city : city // ignore: cast_nullable_to_non_nullable
as String,province: null == province ? _self.province : province // ignore: cast_nullable_to_non_nullable
as String,state: null == state ? _self.state : state // ignore: cast_nullable_to_non_nullable
as String,country: null == country ? _self.country : country // ignore: cast_nullable_to_non_nullable
as String,postCode: null == postCode ? _self.postCode : postCode // ignore: cast_nullable_to_non_nullable
as int,
));
}
}
/// Adds pattern-matching-related methods to [AddressEntity].
extension AddressEntityPatterns on AddressEntity {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _AddressEntity value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _AddressEntity() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _AddressEntity value) $default,){
final _that = this;
switch (_that) {
case _AddressEntity():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _AddressEntity value)? $default,){
final _that = this;
switch (_that) {
case _AddressEntity() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String street, String city, String province, String state, String country, int postCode)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _AddressEntity() when $default != null:
return $default(_that.street,_that.city,_that.province,_that.state,_that.country,_that.postCode);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String street, String city, String province, String state, String country, int postCode) $default,) {final _that = this;
switch (_that) {
case _AddressEntity():
return $default(_that.street,_that.city,_that.province,_that.state,_that.country,_that.postCode);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String street, String city, String province, String state, String country, int postCode)? $default,) {final _that = this;
switch (_that) {
case _AddressEntity() when $default != null:
return $default(_that.street,_that.city,_that.province,_that.state,_that.country,_that.postCode);case _:
return null;
}
}
}
/// @nodoc
class _AddressEntity implements AddressEntity {
const _AddressEntity({required this.street, required this.city, required this.province, required this.state, required this.country, required this.postCode});
@override final String street;
@override final String city;
@override final String province;
@override final String state;
@override final String country;
@override final int postCode;
/// Create a copy of AddressEntity
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$AddressEntityCopyWith<_AddressEntity> get copyWith => __$AddressEntityCopyWithImpl<_AddressEntity>(this, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _AddressEntity&&(identical(other.street, street) || other.street == street)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.state, state) || other.state == state)&&(identical(other.country, country) || other.country == country)&&(identical(other.postCode, postCode) || other.postCode == postCode));
}
@override
int get hashCode => Object.hash(runtimeType,street,city,province,state,country,postCode);
@override
String toString() {
return 'AddressEntity(street: $street, city: $city, province: $province, state: $state, country: $country, postCode: $postCode)';
}
}
/// @nodoc
abstract mixin class _$AddressEntityCopyWith<$Res> implements $AddressEntityCopyWith<$Res> {
factory _$AddressEntityCopyWith(_AddressEntity value, $Res Function(_AddressEntity) _then) = __$AddressEntityCopyWithImpl;
@override @useResult
$Res call({
String street, String city, String province, String state, String country, int postCode
});
}
/// @nodoc
class __$AddressEntityCopyWithImpl<$Res>
implements _$AddressEntityCopyWith<$Res> {
__$AddressEntityCopyWithImpl(this._self, this._then);
final _AddressEntity _self;
final $Res Function(_AddressEntity) _then;
/// Create a copy of AddressEntity
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? street = null,Object? city = null,Object? province = null,Object? state = null,Object? country = null,Object? postCode = null,}) {
return _then(_AddressEntity(
street: null == street ? _self.street : street // ignore: cast_nullable_to_non_nullable
as String,city: null == city ? _self.city : city // ignore: cast_nullable_to_non_nullable
as String,province: null == province ? _self.province : province // ignore: cast_nullable_to_non_nullable
as String,state: null == state ? _self.state : state // ignore: cast_nullable_to_non_nullable
as String,country: null == country ? _self.country : country // ignore: cast_nullable_to_non_nullable
as String,postCode: null == postCode ? _self.postCode : postCode // ignore: cast_nullable_to_non_nullable
as int,
));
}
}
// dart format on

View File

@@ -0,0 +1,25 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'address_entity.dart';
part 'sign_up_request_entity.freezed.dart';
@freezed
abstract class SignUpRequestEntity with _$SignUpRequestEntity {
const factory SignUpRequestEntity({
required String documentType,
required String documentNumber,
required String relationship,
required String firstName,
required String lastName,
required String email,
required String phone,
required String language,
required String password,
required List<AddressEntity> taxResidences,
required List<AddressEntity> addresses,
required int bornAt,
required String userId, // UUID
required String placeOfBirth,
required String birthCountry,
}) = _SignUpRequestEntity;
}

View File

@@ -0,0 +1,327 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'sign_up_request_entity.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$SignUpRequestEntity {
String get documentType; String get documentNumber; String get relationship; String get firstName; String get lastName; String get email; String get phone; String get language; String get password; List<AddressEntity> get taxResidences; List<AddressEntity> get addresses; int get bornAt; String get userId;// UUID
String get placeOfBirth; String get birthCountry;
/// Create a copy of SignUpRequestEntity
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$SignUpRequestEntityCopyWith<SignUpRequestEntity> get copyWith => _$SignUpRequestEntityCopyWithImpl<SignUpRequestEntity>(this as SignUpRequestEntity, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is SignUpRequestEntity&&(identical(other.documentType, documentType) || other.documentType == documentType)&&(identical(other.documentNumber, documentNumber) || other.documentNumber == documentNumber)&&(identical(other.relationship, relationship) || other.relationship == relationship)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.email, email) || other.email == email)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.language, language) || other.language == language)&&(identical(other.password, password) || other.password == password)&&const DeepCollectionEquality().equals(other.taxResidences, taxResidences)&&const DeepCollectionEquality().equals(other.addresses, addresses)&&(identical(other.bornAt, bornAt) || other.bornAt == bornAt)&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.placeOfBirth, placeOfBirth) || other.placeOfBirth == placeOfBirth)&&(identical(other.birthCountry, birthCountry) || other.birthCountry == birthCountry));
}
@override
int get hashCode => Object.hash(runtimeType,documentType,documentNumber,relationship,firstName,lastName,email,phone,language,password,const DeepCollectionEquality().hash(taxResidences),const DeepCollectionEquality().hash(addresses),bornAt,userId,placeOfBirth,birthCountry);
@override
String toString() {
return 'SignUpRequestEntity(documentType: $documentType, documentNumber: $documentNumber, relationship: $relationship, firstName: $firstName, lastName: $lastName, email: $email, phone: $phone, language: $language, password: $password, taxResidences: $taxResidences, addresses: $addresses, bornAt: $bornAt, userId: $userId, placeOfBirth: $placeOfBirth, birthCountry: $birthCountry)';
}
}
/// @nodoc
abstract mixin class $SignUpRequestEntityCopyWith<$Res> {
factory $SignUpRequestEntityCopyWith(SignUpRequestEntity value, $Res Function(SignUpRequestEntity) _then) = _$SignUpRequestEntityCopyWithImpl;
@useResult
$Res call({
String documentType, String documentNumber, String relationship, String firstName, String lastName, String email, String phone, String language, String password, List<AddressEntity> taxResidences, List<AddressEntity> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry
});
}
/// @nodoc
class _$SignUpRequestEntityCopyWithImpl<$Res>
implements $SignUpRequestEntityCopyWith<$Res> {
_$SignUpRequestEntityCopyWithImpl(this._self, this._then);
final SignUpRequestEntity _self;
final $Res Function(SignUpRequestEntity) _then;
/// Create a copy of SignUpRequestEntity
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? documentType = null,Object? documentNumber = null,Object? relationship = null,Object? firstName = null,Object? lastName = null,Object? email = null,Object? phone = null,Object? language = null,Object? password = null,Object? taxResidences = null,Object? addresses = null,Object? bornAt = null,Object? userId = null,Object? placeOfBirth = null,Object? birthCountry = null,}) {
return _then(_self.copyWith(
documentType: null == documentType ? _self.documentType : documentType // ignore: cast_nullable_to_non_nullable
as String,documentNumber: null == documentNumber ? _self.documentNumber : documentNumber // ignore: cast_nullable_to_non_nullable
as String,relationship: null == relationship ? _self.relationship : relationship // ignore: cast_nullable_to_non_nullable
as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
as String,lastName: null == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable
as String,email: null == email ? _self.email : email // ignore: cast_nullable_to_non_nullable
as String,phone: null == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable
as String,language: null == language ? _self.language : language // ignore: cast_nullable_to_non_nullable
as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable
as String,taxResidences: null == taxResidences ? _self.taxResidences : taxResidences // ignore: cast_nullable_to_non_nullable
as List<AddressEntity>,addresses: null == addresses ? _self.addresses : addresses // ignore: cast_nullable_to_non_nullable
as List<AddressEntity>,bornAt: null == bornAt ? _self.bornAt : bornAt // ignore: cast_nullable_to_non_nullable
as int,userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable
as String,placeOfBirth: null == placeOfBirth ? _self.placeOfBirth : placeOfBirth // ignore: cast_nullable_to_non_nullable
as String,birthCountry: null == birthCountry ? _self.birthCountry : birthCountry // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// Adds pattern-matching-related methods to [SignUpRequestEntity].
extension SignUpRequestEntityPatterns on SignUpRequestEntity {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SignUpRequestEntity value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _SignUpRequestEntity() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SignUpRequestEntity value) $default,){
final _that = this;
switch (_that) {
case _SignUpRequestEntity():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SignUpRequestEntity value)? $default,){
final _that = this;
switch (_that) {
case _SignUpRequestEntity() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String documentType, String documentNumber, String relationship, String firstName, String lastName, String email, String phone, String language, String password, List<AddressEntity> taxResidences, List<AddressEntity> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _SignUpRequestEntity() when $default != null:
return $default(_that.documentType,_that.documentNumber,_that.relationship,_that.firstName,_that.lastName,_that.email,_that.phone,_that.language,_that.password,_that.taxResidences,_that.addresses,_that.bornAt,_that.userId,_that.placeOfBirth,_that.birthCountry);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String documentType, String documentNumber, String relationship, String firstName, String lastName, String email, String phone, String language, String password, List<AddressEntity> taxResidences, List<AddressEntity> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry) $default,) {final _that = this;
switch (_that) {
case _SignUpRequestEntity():
return $default(_that.documentType,_that.documentNumber,_that.relationship,_that.firstName,_that.lastName,_that.email,_that.phone,_that.language,_that.password,_that.taxResidences,_that.addresses,_that.bornAt,_that.userId,_that.placeOfBirth,_that.birthCountry);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String documentType, String documentNumber, String relationship, String firstName, String lastName, String email, String phone, String language, String password, List<AddressEntity> taxResidences, List<AddressEntity> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry)? $default,) {final _that = this;
switch (_that) {
case _SignUpRequestEntity() when $default != null:
return $default(_that.documentType,_that.documentNumber,_that.relationship,_that.firstName,_that.lastName,_that.email,_that.phone,_that.language,_that.password,_that.taxResidences,_that.addresses,_that.bornAt,_that.userId,_that.placeOfBirth,_that.birthCountry);case _:
return null;
}
}
}
/// @nodoc
class _SignUpRequestEntity implements SignUpRequestEntity {
const _SignUpRequestEntity({required this.documentType, required this.documentNumber, required this.relationship, required this.firstName, required this.lastName, required this.email, required this.phone, required this.language, required this.password, required final List<AddressEntity> taxResidences, required final List<AddressEntity> addresses, required this.bornAt, required this.userId, required this.placeOfBirth, required this.birthCountry}): _taxResidences = taxResidences,_addresses = addresses;
@override final String documentType;
@override final String documentNumber;
@override final String relationship;
@override final String firstName;
@override final String lastName;
@override final String email;
@override final String phone;
@override final String language;
@override final String password;
final List<AddressEntity> _taxResidences;
@override List<AddressEntity> get taxResidences {
if (_taxResidences is EqualUnmodifiableListView) return _taxResidences;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_taxResidences);
}
final List<AddressEntity> _addresses;
@override List<AddressEntity> get addresses {
if (_addresses is EqualUnmodifiableListView) return _addresses;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_addresses);
}
@override final int bornAt;
@override final String userId;
// UUID
@override final String placeOfBirth;
@override final String birthCountry;
/// Create a copy of SignUpRequestEntity
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$SignUpRequestEntityCopyWith<_SignUpRequestEntity> get copyWith => __$SignUpRequestEntityCopyWithImpl<_SignUpRequestEntity>(this, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SignUpRequestEntity&&(identical(other.documentType, documentType) || other.documentType == documentType)&&(identical(other.documentNumber, documentNumber) || other.documentNumber == documentNumber)&&(identical(other.relationship, relationship) || other.relationship == relationship)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.email, email) || other.email == email)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.language, language) || other.language == language)&&(identical(other.password, password) || other.password == password)&&const DeepCollectionEquality().equals(other._taxResidences, _taxResidences)&&const DeepCollectionEquality().equals(other._addresses, _addresses)&&(identical(other.bornAt, bornAt) || other.bornAt == bornAt)&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.placeOfBirth, placeOfBirth) || other.placeOfBirth == placeOfBirth)&&(identical(other.birthCountry, birthCountry) || other.birthCountry == birthCountry));
}
@override
int get hashCode => Object.hash(runtimeType,documentType,documentNumber,relationship,firstName,lastName,email,phone,language,password,const DeepCollectionEquality().hash(_taxResidences),const DeepCollectionEquality().hash(_addresses),bornAt,userId,placeOfBirth,birthCountry);
@override
String toString() {
return 'SignUpRequestEntity(documentType: $documentType, documentNumber: $documentNumber, relationship: $relationship, firstName: $firstName, lastName: $lastName, email: $email, phone: $phone, language: $language, password: $password, taxResidences: $taxResidences, addresses: $addresses, bornAt: $bornAt, userId: $userId, placeOfBirth: $placeOfBirth, birthCountry: $birthCountry)';
}
}
/// @nodoc
abstract mixin class _$SignUpRequestEntityCopyWith<$Res> implements $SignUpRequestEntityCopyWith<$Res> {
factory _$SignUpRequestEntityCopyWith(_SignUpRequestEntity value, $Res Function(_SignUpRequestEntity) _then) = __$SignUpRequestEntityCopyWithImpl;
@override @useResult
$Res call({
String documentType, String documentNumber, String relationship, String firstName, String lastName, String email, String phone, String language, String password, List<AddressEntity> taxResidences, List<AddressEntity> addresses, int bornAt, String userId, String placeOfBirth, String birthCountry
});
}
/// @nodoc
class __$SignUpRequestEntityCopyWithImpl<$Res>
implements _$SignUpRequestEntityCopyWith<$Res> {
__$SignUpRequestEntityCopyWithImpl(this._self, this._then);
final _SignUpRequestEntity _self;
final $Res Function(_SignUpRequestEntity) _then;
/// Create a copy of SignUpRequestEntity
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? documentType = null,Object? documentNumber = null,Object? relationship = null,Object? firstName = null,Object? lastName = null,Object? email = null,Object? phone = null,Object? language = null,Object? password = null,Object? taxResidences = null,Object? addresses = null,Object? bornAt = null,Object? userId = null,Object? placeOfBirth = null,Object? birthCountry = null,}) {
return _then(_SignUpRequestEntity(
documentType: null == documentType ? _self.documentType : documentType // ignore: cast_nullable_to_non_nullable
as String,documentNumber: null == documentNumber ? _self.documentNumber : documentNumber // ignore: cast_nullable_to_non_nullable
as String,relationship: null == relationship ? _self.relationship : relationship // ignore: cast_nullable_to_non_nullable
as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
as String,lastName: null == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable
as String,email: null == email ? _self.email : email // ignore: cast_nullable_to_non_nullable
as String,phone: null == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable
as String,language: null == language ? _self.language : language // ignore: cast_nullable_to_non_nullable
as String,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable
as String,taxResidences: null == taxResidences ? _self._taxResidences : taxResidences // ignore: cast_nullable_to_non_nullable
as List<AddressEntity>,addresses: null == addresses ? _self._addresses : addresses // ignore: cast_nullable_to_non_nullable
as List<AddressEntity>,bornAt: null == bornAt ? _self.bornAt : bornAt // ignore: cast_nullable_to_non_nullable
as int,userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable
as String,placeOfBirth: null == placeOfBirth ? _self.placeOfBirth : placeOfBirth // ignore: cast_nullable_to_non_nullable
as String,birthCountry: null == birthCountry ? _self.birthCountry : birthCountry // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
// dart format on

View File

@@ -0,0 +1,19 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'two_fa_secret_entity.freezed.dart';
@freezed
abstract class TwoFASecretEntity with _$TwoFASecretEntity {
const factory TwoFASecretEntity({
required bool isCreated,
required TwoFASecretItemEntity item,
}) = _TwoFASecretEntity;
}
@freezed
abstract class TwoFASecretItemEntity with _$TwoFASecretItemEntity {
const factory TwoFASecretItemEntity({
required String secret,
required String qr,
}) = _TwoFASecretItemEntity;
}

View File

@@ -0,0 +1,552 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'two_fa_secret_entity.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$TwoFASecretEntity {
bool get isCreated; TwoFASecretItemEntity get item;
/// Create a copy of TwoFASecretEntity
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$TwoFASecretEntityCopyWith<TwoFASecretEntity> get copyWith => _$TwoFASecretEntityCopyWithImpl<TwoFASecretEntity>(this as TwoFASecretEntity, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is TwoFASecretEntity&&(identical(other.isCreated, isCreated) || other.isCreated == isCreated)&&(identical(other.item, item) || other.item == item));
}
@override
int get hashCode => Object.hash(runtimeType,isCreated,item);
@override
String toString() {
return 'TwoFASecretEntity(isCreated: $isCreated, item: $item)';
}
}
/// @nodoc
abstract mixin class $TwoFASecretEntityCopyWith<$Res> {
factory $TwoFASecretEntityCopyWith(TwoFASecretEntity value, $Res Function(TwoFASecretEntity) _then) = _$TwoFASecretEntityCopyWithImpl;
@useResult
$Res call({
bool isCreated, TwoFASecretItemEntity item
});
$TwoFASecretItemEntityCopyWith<$Res> get item;
}
/// @nodoc
class _$TwoFASecretEntityCopyWithImpl<$Res>
implements $TwoFASecretEntityCopyWith<$Res> {
_$TwoFASecretEntityCopyWithImpl(this._self, this._then);
final TwoFASecretEntity _self;
final $Res Function(TwoFASecretEntity) _then;
/// Create a copy of TwoFASecretEntity
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? isCreated = null,Object? item = null,}) {
return _then(_self.copyWith(
isCreated: null == isCreated ? _self.isCreated : isCreated // ignore: cast_nullable_to_non_nullable
as bool,item: null == item ? _self.item : item // ignore: cast_nullable_to_non_nullable
as TwoFASecretItemEntity,
));
}
/// Create a copy of TwoFASecretEntity
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TwoFASecretItemEntityCopyWith<$Res> get item {
return $TwoFASecretItemEntityCopyWith<$Res>(_self.item, (value) {
return _then(_self.copyWith(item: value));
});
}
}
/// Adds pattern-matching-related methods to [TwoFASecretEntity].
extension TwoFASecretEntityPatterns on TwoFASecretEntity {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _TwoFASecretEntity value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _TwoFASecretEntity() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _TwoFASecretEntity value) $default,){
final _that = this;
switch (_that) {
case _TwoFASecretEntity():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TwoFASecretEntity value)? $default,){
final _that = this;
switch (_that) {
case _TwoFASecretEntity() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( bool isCreated, TwoFASecretItemEntity item)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _TwoFASecretEntity() when $default != null:
return $default(_that.isCreated,_that.item);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( bool isCreated, TwoFASecretItemEntity item) $default,) {final _that = this;
switch (_that) {
case _TwoFASecretEntity():
return $default(_that.isCreated,_that.item);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( bool isCreated, TwoFASecretItemEntity item)? $default,) {final _that = this;
switch (_that) {
case _TwoFASecretEntity() when $default != null:
return $default(_that.isCreated,_that.item);case _:
return null;
}
}
}
/// @nodoc
class _TwoFASecretEntity implements TwoFASecretEntity {
const _TwoFASecretEntity({required this.isCreated, required this.item});
@override final bool isCreated;
@override final TwoFASecretItemEntity item;
/// Create a copy of TwoFASecretEntity
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$TwoFASecretEntityCopyWith<_TwoFASecretEntity> get copyWith => __$TwoFASecretEntityCopyWithImpl<_TwoFASecretEntity>(this, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TwoFASecretEntity&&(identical(other.isCreated, isCreated) || other.isCreated == isCreated)&&(identical(other.item, item) || other.item == item));
}
@override
int get hashCode => Object.hash(runtimeType,isCreated,item);
@override
String toString() {
return 'TwoFASecretEntity(isCreated: $isCreated, item: $item)';
}
}
/// @nodoc
abstract mixin class _$TwoFASecretEntityCopyWith<$Res> implements $TwoFASecretEntityCopyWith<$Res> {
factory _$TwoFASecretEntityCopyWith(_TwoFASecretEntity value, $Res Function(_TwoFASecretEntity) _then) = __$TwoFASecretEntityCopyWithImpl;
@override @useResult
$Res call({
bool isCreated, TwoFASecretItemEntity item
});
@override $TwoFASecretItemEntityCopyWith<$Res> get item;
}
/// @nodoc
class __$TwoFASecretEntityCopyWithImpl<$Res>
implements _$TwoFASecretEntityCopyWith<$Res> {
__$TwoFASecretEntityCopyWithImpl(this._self, this._then);
final _TwoFASecretEntity _self;
final $Res Function(_TwoFASecretEntity) _then;
/// Create a copy of TwoFASecretEntity
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? isCreated = null,Object? item = null,}) {
return _then(_TwoFASecretEntity(
isCreated: null == isCreated ? _self.isCreated : isCreated // ignore: cast_nullable_to_non_nullable
as bool,item: null == item ? _self.item : item // ignore: cast_nullable_to_non_nullable
as TwoFASecretItemEntity,
));
}
/// Create a copy of TwoFASecretEntity
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TwoFASecretItemEntityCopyWith<$Res> get item {
return $TwoFASecretItemEntityCopyWith<$Res>(_self.item, (value) {
return _then(_self.copyWith(item: value));
});
}
}
/// @nodoc
mixin _$TwoFASecretItemEntity {
String get secret; String get qr;
/// Create a copy of TwoFASecretItemEntity
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$TwoFASecretItemEntityCopyWith<TwoFASecretItemEntity> get copyWith => _$TwoFASecretItemEntityCopyWithImpl<TwoFASecretItemEntity>(this as TwoFASecretItemEntity, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is TwoFASecretItemEntity&&(identical(other.secret, secret) || other.secret == secret)&&(identical(other.qr, qr) || other.qr == qr));
}
@override
int get hashCode => Object.hash(runtimeType,secret,qr);
@override
String toString() {
return 'TwoFASecretItemEntity(secret: $secret, qr: $qr)';
}
}
/// @nodoc
abstract mixin class $TwoFASecretItemEntityCopyWith<$Res> {
factory $TwoFASecretItemEntityCopyWith(TwoFASecretItemEntity value, $Res Function(TwoFASecretItemEntity) _then) = _$TwoFASecretItemEntityCopyWithImpl;
@useResult
$Res call({
String secret, String qr
});
}
/// @nodoc
class _$TwoFASecretItemEntityCopyWithImpl<$Res>
implements $TwoFASecretItemEntityCopyWith<$Res> {
_$TwoFASecretItemEntityCopyWithImpl(this._self, this._then);
final TwoFASecretItemEntity _self;
final $Res Function(TwoFASecretItemEntity) _then;
/// Create a copy of TwoFASecretItemEntity
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? secret = null,Object? qr = null,}) {
return _then(_self.copyWith(
secret: null == secret ? _self.secret : secret // ignore: cast_nullable_to_non_nullable
as String,qr: null == qr ? _self.qr : qr // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// Adds pattern-matching-related methods to [TwoFASecretItemEntity].
extension TwoFASecretItemEntityPatterns on TwoFASecretItemEntity {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _TwoFASecretItemEntity value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _TwoFASecretItemEntity() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _TwoFASecretItemEntity value) $default,){
final _that = this;
switch (_that) {
case _TwoFASecretItemEntity():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _TwoFASecretItemEntity value)? $default,){
final _that = this;
switch (_that) {
case _TwoFASecretItemEntity() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String secret, String qr)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _TwoFASecretItemEntity() when $default != null:
return $default(_that.secret,_that.qr);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String secret, String qr) $default,) {final _that = this;
switch (_that) {
case _TwoFASecretItemEntity():
return $default(_that.secret,_that.qr);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String secret, String qr)? $default,) {final _that = this;
switch (_that) {
case _TwoFASecretItemEntity() when $default != null:
return $default(_that.secret,_that.qr);case _:
return null;
}
}
}
/// @nodoc
class _TwoFASecretItemEntity implements TwoFASecretItemEntity {
const _TwoFASecretItemEntity({required this.secret, required this.qr});
@override final String secret;
@override final String qr;
/// Create a copy of TwoFASecretItemEntity
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$TwoFASecretItemEntityCopyWith<_TwoFASecretItemEntity> get copyWith => __$TwoFASecretItemEntityCopyWithImpl<_TwoFASecretItemEntity>(this, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _TwoFASecretItemEntity&&(identical(other.secret, secret) || other.secret == secret)&&(identical(other.qr, qr) || other.qr == qr));
}
@override
int get hashCode => Object.hash(runtimeType,secret,qr);
@override
String toString() {
return 'TwoFASecretItemEntity(secret: $secret, qr: $qr)';
}
}
/// @nodoc
abstract mixin class _$TwoFASecretItemEntityCopyWith<$Res> implements $TwoFASecretItemEntityCopyWith<$Res> {
factory _$TwoFASecretItemEntityCopyWith(_TwoFASecretItemEntity value, $Res Function(_TwoFASecretItemEntity) _then) = __$TwoFASecretItemEntityCopyWithImpl;
@override @useResult
$Res call({
String secret, String qr
});
}
/// @nodoc
class __$TwoFASecretItemEntityCopyWithImpl<$Res>
implements _$TwoFASecretItemEntityCopyWith<$Res> {
__$TwoFASecretItemEntityCopyWithImpl(this._self, this._then);
final _TwoFASecretItemEntity _self;
final $Res Function(_TwoFASecretItemEntity) _then;
/// Create a copy of TwoFASecretItemEntity
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? secret = null,Object? qr = null,}) {
return _then(_TwoFASecretItemEntity(
secret: null == secret ? _self.secret : secret // ignore: cast_nullable_to_non_nullable
as String,qr: null == qr ? _self.qr : qr // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
// dart format on

View File

@@ -0,0 +1,5 @@
import 'package:auth/src/features/sign_up/domain/entities/two_fa_secret_entity.dart';
abstract class GenerateTwoFASignUpUseCase {
Future<TwoFASecretEntity> generateTwoFASignUp({required String token});
}

View File

@@ -0,0 +1,13 @@
import 'package:auth/src/core/domain/repositories/auth_repository.dart';
import 'package:auth/src/features/sign_up/domain/entities/two_fa_secret_entity.dart';
import 'package:auth/src/features/sign_up/domain/generate_two_fa_sign_up_use_case.dart';
class GenerateTwoFASignUpUseCaseImpl implements GenerateTwoFASignUpUseCase {
GenerateTwoFASignUpUseCaseImpl(this._repository);
final AuthRepository _repository;
@override
Future<TwoFASecretEntity> generateTwoFASignUp({required String token}) {
return _repository.generateTwoFASignUp(token: token);
}
}

View File

@@ -0,0 +1,5 @@
import 'package:auth/src/features/sign_up/domain/entities/sign_up_request_entity.dart';
abstract class SignUpUseCase {
Future<String> signUp({required SignUpRequestEntity request});
}

View File

@@ -0,0 +1,14 @@
import 'package:auth/src/core/domain/repositories/auth_repository.dart';
import 'package:auth/src/features/sign_up/domain/entities/sign_up_request_entity.dart';
import 'package:auth/src/features/sign_up/domain/sign_up_use_case.dart';
class SignUpUseCaseImpl implements SignUpUseCase {
SignUpUseCaseImpl(this._repository);
final AuthRepository _repository;
@override
Future<String> signUp({required SignUpRequestEntity request}) {
return _repository.signUp(request: request);
}
}

View File

@@ -0,0 +1,6 @@
abstract class VerifyTwoFACodeSignUpUseCase {
Future<void> verifyTwoFACodeSignUp({
required String token,
required String code,
});
}

View File

@@ -0,0 +1,15 @@
import 'package:auth/src/core/domain/repositories/auth_repository.dart';
import 'package:auth/src/features/sign_up/domain/verify_two_fa_code_sign_up_use_case.dart';
class VerifyTwoFaCodeSignUpUseCaseImpl implements VerifyTwoFACodeSignUpUseCase {
VerifyTwoFaCodeSignUpUseCaseImpl(this._repository);
final AuthRepository _repository;
@override
Future<void> verifyTwoFACodeSignUp({
required String token,
required String code,
}) {
return _repository.verifyTwoFACodeSignUp(token: token, code: code);
}
}

View File

@@ -0,0 +1,19 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
typedef SignUpBodyBuilder =
Widget Function(BuildContext context, WidgetRef ref);
class SignUpStepConfig {
final String supertitle;
final String title;
final String? subtitle;
final SignUpBodyBuilder bodyBuilder;
const SignUpStepConfig({
required this.supertitle,
required this.title,
this.subtitle,
required this.bodyBuilder,
});
}

View File

@@ -0,0 +1,92 @@
import 'package:auth/src/features/sign_up/presentation/state/sign_up_view_model.dart';
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:navigation/navigation.dart';
class AccountCreatedScreen extends ConsumerWidget {
final NavigationContract navigationContract;
const AccountCreatedScreen({super.key, required this.navigationContract});
@override
Widget build(BuildContext context, WidgetRef ref) {
final theme = ref.watch(themePortProvider);
final state = ref.watch(signUpViewModelProvider);
final String email = state.email;
final String fullName = '${state.firstName} ${state.lastName}'.trim();
return PopScope(
canPop: false,
child: Scaffold(
backgroundColor: theme.getColorFor(ThemeCode.backgroundPrimary),
body: Container(
margin: const EdgeInsets.all(30),
child: Center(
child: Column(
children: [
const Spacer(flex: 10),
Icon(
Icons.check,
color: theme.getColorFor(ThemeCode.buttonPrimary),
size: 50,
),
const SizedBox(height: 20),
const Text(
"Cuenta creada",
style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
),
const SizedBox(height: 20),
Text.rich(
textAlign: TextAlign.center,
TextSpan(
text: "Has creado la cuenta para:\n",
children: [
TextSpan(
text: fullName,
style: const TextStyle(fontWeight: FontWeight.bold),
),
],
),
),
const SizedBox(height: 16),
Text.rich(
textAlign: TextAlign.center,
TextSpan(
text: "Hemos enviado un email de verificación a:\n",
children: [
TextSpan(
text: email,
style: const TextStyle(fontWeight: FontWeight.bold),
),
],
),
),
const SizedBox(height: 20),
const Text(
"Crea la cuenta de tu peque e ingresa su \nprimera paga para utilizarla con su reloj",
textAlign: TextAlign.center,
),
const SizedBox(height: 20),
PrimaryButton(
onPressed: () {
navigationContract.goTo(AppRoutes.login);
},
text: "Continuar",
color: theme.getColorFor(ThemeCode.buttonPrimary),
),
const Spacer(flex: 8),
],
),
),
),
),
);
}
}

View File

@@ -0,0 +1,23 @@
import 'package:auth/src/features/sign_up/domain/entities/address_entity.dart';
import 'package:auth/src/features/sign_up/presentation/state/address_view_state.dart';
extension AddressViewStateMapper on AddressViewState {
bool get isValid =>
street.trim().isNotEmpty &&
city.trim().isNotEmpty &&
province.trim().isNotEmpty &&
state.trim().isNotEmpty &&
country.trim().isNotEmpty &&
(postCode != null);
AddressEntity toEntity() {
return AddressEntity(
street: street.trim(),
city: city.trim(),
province: province.trim(),
state: state.trim(),
country: country.trim(),
postCode: postCode ?? 0,
);
}
}

View File

@@ -0,0 +1,46 @@
import 'package:auth/src/features/sign_up/domain/entities/address_entity.dart';
import 'package:auth/src/features/sign_up/domain/entities/sign_up_request_entity.dart';
import 'package:auth/src/features/sign_up/presentation/mappers/address_view_state_mapper.dart';
import 'package:auth/src/features/sign_up/presentation/state/sign_up_view_state.dart';
extension SignUpViewStateMapper on SignUpViewState {
bool get canSubmit =>
documentNumber.trim().isNotEmpty &&
documentType.trim().isNotEmpty &&
relationship.trim().isNotEmpty &&
firstName.trim().isNotEmpty &&
lastName.trim().isNotEmpty &&
email.trim().isNotEmpty &&
phone.trim().isNotEmpty &&
password.isNotEmpty &&
bornAt != null &&
userId.trim().isNotEmpty &&
placeOfBirth.trim().isNotEmpty &&
birthCountry.trim().isNotEmpty &&
address.isValid;
SignUpRequestEntity toRequestEntity() {
final birth = bornAt;
if (birth == null) {
throw Exception('bornAt is required');
}
return SignUpRequestEntity(
documentNumber: documentNumber.trim(),
documentType: documentType.trim(),
relationship: relationship.trim(),
firstName: firstName.trim(),
lastName: lastName.trim(),
email: email.trim(),
phone: phone.trim(),
language: language.trim(),
password: password,
bornAt: birth.millisecondsSinceEpoch,
userId: userId.trim(),
placeOfBirth: placeOfBirth.trim(),
birthCountry: birthCountry.trim(),
addresses: <AddressEntity>[address.toEntity()],
taxResidences: <AddressEntity>[address.toEntity()],
);
}
}

View File

@@ -0,0 +1,10 @@
import 'package:auth/src/core/providers/auth_repository_provider.dart';
import 'package:auth/src/features/sign_up/domain/generate_two_fa_sign_up_use_case.dart';
import 'package:auth/src/features/sign_up/domain/generate_two_fa_sign_up_use_case_impl.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final generateTwoFASignUpUseCaseProvider =
Provider.autoDispose<GenerateTwoFASignUpUseCase>((ref) {
final authRepository = ref.read(authRepositoryProvider);
return GenerateTwoFASignUpUseCaseImpl(authRepository);
});

View File

@@ -0,0 +1,9 @@
import 'package:auth/src/core/providers/auth_repository_provider.dart';
import 'package:auth/src/features/sign_up/domain/sign_up_use_case.dart';
import 'package:auth/src/features/sign_up/domain/sign_up_use_case_impl.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final signUpUseCaseProvider = Provider.autoDispose<SignUpUseCase>((ref) {
final authRepository = ref.read(authRepositoryProvider);
return SignUpUseCaseImpl(authRepository);
});

View File

@@ -0,0 +1,10 @@
import 'package:auth/src/core/providers/auth_repository_provider.dart';
import 'package:auth/src/features/sign_up/domain/verify_two_fa_code_sign_up_use_case.dart';
import 'package:auth/src/features/sign_up/domain/verify_two_fa_code_sign_up_use_case_impl.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final verifyTwoFACodeSignUpUseCaseProvider =
Provider.autoDispose<VerifyTwoFACodeSignUpUseCase>((ref) {
final authRepository = ref.read(authRepositoryProvider);
return VerifyTwoFaCodeSignUpUseCaseImpl(authRepository);
});

View File

@@ -0,0 +1,197 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
class SignupAddressScreen extends StatelessWidget {
const SignupAddressScreen({
super.key,
required this.bornAtController,
required this.relationshipSelected,
required this.onRelationshipChanged,
required this.relationshipOptions,
required this.relationshipHint,
required this.relationshipLabel,
required this.placeOfBirthController,
required this.birthCountryController,
required this.streetController,
required this.cityController,
required this.provinceController,
required this.stateController,
required this.addressCountrySelected,
required this.onAddressCountryChanged,
required this.addressCountryOptions,
required this.addressCountryHint,
required this.addressCountryLabel,
required this.postCodeController,
required this.birthDateLabel,
required this.birthDateHint,
required this.placeOfBirthLabel,
required this.placeOfBirthHint,
required this.birthCountryLabel,
required this.birthCountryHint,
required this.streetLabel,
required this.streetHint,
required this.cityLabel,
required this.cityHint,
required this.provinceLabel,
required this.provinceHint,
required this.stateLabel,
required this.stateHint,
required this.postCodeLabel,
required this.postCodeHint,
});
final TextEditingController bornAtController;
final String? relationshipSelected;
final ValueChanged<String?> onRelationshipChanged;
final List<String> relationshipOptions;
final String relationshipHint;
final String relationshipLabel;
final TextEditingController placeOfBirthController;
final TextEditingController birthCountryController;
final TextEditingController streetController;
final TextEditingController cityController;
final TextEditingController provinceController;
final TextEditingController stateController;
final String? addressCountrySelected;
final ValueChanged<String?> onAddressCountryChanged;
final List<String> addressCountryOptions;
final String addressCountryHint;
final String addressCountryLabel;
final TextEditingController postCodeController;
final String birthDateLabel;
final String birthDateHint;
final String placeOfBirthLabel;
final String placeOfBirthHint;
final String birthCountryLabel;
final String birthCountryHint;
final String streetLabel;
final String streetHint;
final String cityLabel;
final String cityHint;
final String provinceLabel;
final String provinceHint;
final String stateLabel;
final String stateHint;
final String postCodeLabel;
final String postCodeHint;
@override
Widget build(BuildContext context) {
return Column(
children: [
CustomTextField(
label: birthDateLabel,
hint: birthDateHint,
keyboardType: TextInputType.number,
controller: bornAtController,
),
const SizedBox(height: 8),
Align(
alignment: Alignment.bottomLeft,
child: Text(relationshipLabel, style: const TextStyle(fontSize: 14)),
),
CustomDropdown(
items: relationshipOptions.map(Text.new).toList(growable: false),
values: relationshipOptions,
value: relationshipSelected,
hint: relationshipHint,
onChanged: (v) => onRelationshipChanged(v as String?),
),
const SizedBox(height: 8),
CustomTextField(
label: placeOfBirthLabel,
hint: placeOfBirthHint,
controller: placeOfBirthController,
),
const SizedBox(height: 8),
CustomTextField(
label: birthCountryLabel,
hint: birthCountryHint,
controller: birthCountryController,
),
const SizedBox(height: 8),
CustomTextField(
label: streetLabel,
hint: streetHint,
controller: streetController,
),
const SizedBox(height: 8),
CustomTextField(
label: cityLabel,
hint: cityHint,
controller: cityController,
),
const SizedBox(height: 8),
CustomTextField(
label: provinceLabel,
hint: provinceHint,
controller: provinceController,
),
const SizedBox(height: 8),
CustomTextField(
label: stateLabel,
hint: stateHint,
controller: stateController,
),
const SizedBox(height: 8),
Align(
alignment: Alignment.bottomLeft,
child: Text(
addressCountryLabel,
style: const TextStyle(fontSize: 14, letterSpacing: 0),
),
),
CustomDropdown(
items: addressCountryOptions.map(Text.new).toList(growable: false),
values: addressCountryOptions,
value: addressCountrySelected,
hint: addressCountryHint,
onChanged: (v) => onAddressCountryChanged(v as String?),
),
const SizedBox(height: 8),
CustomTextField(
label: postCodeLabel,
hint: postCodeHint,
keyboardType: TextInputType.number,
controller: postCodeController,
),
],
);
}
}

View File

@@ -0,0 +1,35 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
class SignUpPasswordScreen extends StatelessWidget {
final bool isPasswordVisible;
final TextEditingController passwordTextFieldController;
final TextEditingController repeatPasswordTextFieldController;
const SignUpPasswordScreen({
super.key,
required this.isPasswordVisible,
required this.passwordTextFieldController,
required this.repeatPasswordTextFieldController,
});
@override
Widget build(BuildContext context) {
return Column(
spacing: 24,
children: [
CustomTextField(
showPassword: isPasswordVisible,
label: "Contraseña",
hint: "********",
controller: passwordTextFieldController,
),
CustomTextField(
showPassword: isPasswordVisible,
label: "Repetir contraseña",
hint: "*******",
controller: repeatPasswordTextFieldController,
),
],
);
}
}

View File

@@ -0,0 +1,135 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
class SignupPersonalScreen extends StatelessWidget {
final TextEditingController firstNameTextFieldController;
final TextEditingController lastNameTextFieldController;
final TextEditingController documentNumberTextFieldController;
final TextEditingController phoneTextFieldController;
final TextEditingController emailTextFieldController;
final String? documentTypeSelected;
final ValueChanged<String?> onDocumentTypeChanged;
final String firstNameLabel;
final String firstNameHint;
final String lastNameLabel;
final String lastNameHint;
final List<String> documentTypeOptions;
final String documentTypeHint;
final String documentNumberLabel;
final String documentNumberHint;
final String phoneLabel;
final String phoneHint;
final String emailLabel;
final String emailHint;
final bool acceptTerms;
final ValueChanged<bool?>? onAcceptTermsPressed;
final String termsText;
final ThemePort theme;
const SignupPersonalScreen({
super.key,
required this.firstNameTextFieldController,
required this.lastNameTextFieldController,
required this.documentNumberTextFieldController,
required this.phoneTextFieldController,
required this.emailTextFieldController,
required this.documentTypeSelected,
required this.onDocumentTypeChanged,
required this.firstNameLabel,
required this.firstNameHint,
required this.lastNameLabel,
required this.lastNameHint,
required this.documentTypeOptions,
required this.documentTypeHint,
required this.documentNumberLabel,
required this.documentNumberHint,
required this.phoneLabel,
required this.phoneHint,
required this.emailLabel,
required this.emailHint,
required this.acceptTerms,
required this.onAcceptTermsPressed,
required this.termsText,
required this.theme,
});
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
children: [
CustomTextField(
label: firstNameLabel,
hint: firstNameHint,
controller: firstNameTextFieldController,
),
const SizedBox(height: 8),
CustomTextField(
label: lastNameLabel,
hint: lastNameHint,
controller: lastNameTextFieldController,
),
const SizedBox(height: 8),
Row(
children: [
Expanded(
child: CustomDropdown(
items: documentTypeOptions
.map(Text.new)
.toList(growable: false),
values: documentTypeOptions,
value: documentTypeSelected,
hint: documentTypeHint,
onChanged: (v) => onDocumentTypeChanged(v as String?),
),
),
const SizedBox(width: 8),
Expanded(
child: CustomTextField(
label: documentNumberLabel,
hint: documentNumberHint,
controller: documentNumberTextFieldController,
),
),
],
),
const SizedBox(height: 8),
CustomTextField(
label: phoneLabel,
hint: phoneHint,
keyboardType: TextInputType.number,
controller: phoneTextFieldController,
),
const SizedBox(height: 8),
CustomTextField(
label: emailLabel,
hint: emailHint,
keyboardType: TextInputType.emailAddress,
controller: emailTextFieldController,
),
CheckboxListTile(
value: acceptTerms,
onChanged: onAcceptTermsPressed,
title: Text(
termsText,
style: TextStyle(fontSize: 16, letterSpacing: 0),
),
checkboxScaleFactor: 1.5,
contentPadding: EdgeInsets.zero,
activeColor: theme.getColorFor(ThemeCode.buttonPrimary),
controlAffinity: ListTileControlAffinity.leading,
),
],
),
);
}
}

View File

@@ -0,0 +1,134 @@
import 'package:auth/src/features/login/presentation/widgets/two_factor_bottom_sheet.dart';
import 'package:auth/src/features/sign_up/presentation/account_created_screen.dart';
import 'package:auth/src/features/sign_up/presentation/sign_up_steps.dart';
import 'package:auth/src/features/sign_up/presentation/state/sign_up_view_model.dart';
import 'package:auth/src/widgets/layouts/sign_up_layout.dart';
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:navigation/navigation.dart';
import 'package:sf_localizations/sf_localizations.dart';
class SignupScreen extends ConsumerWidget {
final NavigationContract navigationContract;
const SignupScreen({super.key, required this.navigationContract});
Future<void> _onNextPressed(BuildContext context, WidgetRef ref) async {
FocusManager.instance.primaryFocus?.unfocus();
final vm = ref.read(signUpViewModelProvider.notifier);
final state = ref.read(signUpViewModelProvider);
final steps = signUpSteps();
final isLastStep = state.currentIndex >= steps.length - 1;
if (!isLastStep) {
vm.next();
return;
}
final isSignUp = await vm.signUp();
if (!context.mounted) return;
if (!isSignUp) return;
final verified = await _openTwoFactorSignUpBottomSheet(context, ref);
if (!context.mounted) return;
if (verified == true) {
vm.showAccountCreated();
}
}
Future<bool?> _openTwoFactorSignUpBottomSheet(
BuildContext context,
WidgetRef ref,
) async {
final token = ref.read(signUpViewModelProvider).token;
if (token.trim().isEmpty) return false;
return showModalBottomSheet<bool>(
context: context,
isScrollControlled: true,
useSafeArea: true,
isDismissible: false,
enableDrag: false,
backgroundColor: Colors.transparent,
builder: (context) {
return Consumer(
builder: (context, ref, _) {
final theme = ref.watch(themePortProvider);
final vm = ref.read(signUpViewModelProvider.notifier);
final otpErrorKey = ref.watch(
signUpViewModelProvider.select((s) => s.otpError),
);
final isOtpLoading = ref.watch(
signUpViewModelProvider.select((s) => s.isOtpLoading),
);
final otpCode = ref.watch(
signUpViewModelProvider.select((s) => s.otpCode),
);
final otpErrorText = otpErrorKey.isEmpty
? ''
: context.translate(otpErrorKey);
Future<void> onVerify() async {
FocusManager.instance.primaryFocus?.unfocus();
final ok = await vm.verifyTwoFACodeSignUp(token: token);
if (!context.mounted) return;
if (ok) Navigator.of(context).pop(true);
}
return TwoFactorBottomSheetView(
theme: theme,
title: context.translate(I18n.twoFactorTitle),
subtitle: context.translate(I18n.twoFactorSubtitle),
verifyText: context.translate(I18n.twoFactorVerify),
closeText: context.translate(I18n.close),
isOtpLoading: isOtpLoading,
otpCode: otpCode,
otpErrorText: otpErrorText,
onChanged: vm.setOtpCode,
onVerify: onVerify,
onClose: () => Navigator.of(context).pop(false),
);
},
);
},
);
}
@override
Widget build(BuildContext context, WidgetRef ref) {
final theme = ref.watch(themePortProvider);
final vm = ref.read(signUpViewModelProvider.notifier);
final state = ref.watch(signUpViewModelProvider);
final steps = signUpSteps();
final index = state.currentIndex.clamp(0, steps.length - 1);
final step = steps[index];
if (state.showAccountCreated) {
return AccountCreatedScreen(navigationContract: navigationContract);
}
return SignUpLayout(
theme: theme,
supertitle: step.supertitle,
title: step.title,
subtitle: step.subtitle ?? '',
currentStep: index + 1,
numSteps: steps.length,
body: step.bodyBuilder(context, ref),
errorMessage: state.errorMessage,
onBackPressed: state.currentIndex == 0
? navigationContract.goBack
: vm.back,
onNextPressed: () => _onNextPressed(context, ref),
);
}
}

View File

@@ -0,0 +1,128 @@
import 'package:auth/src/features/sign_up/models/sign_up_step_config.dart';
import 'package:auth/src/features/sign_up/presentation/sign_up_address_screen.dart';
import 'package:auth/src/features/sign_up/presentation/sign_up_password_screen.dart';
import 'package:auth/src/features/sign_up/presentation/sign_up_personal_screen.dart';
import 'package:auth/src/features/sign_up/presentation/state/sign_up_view_model.dart';
import 'package:design_system/design_system.dart';
List<SignUpStepConfig> signUpSteps() => [
SignUpStepConfig(
supertitle: 'Usuario y contacto',
title: 'Crea tu usuario',
subtitle: 'Con tu email y tu número podremos mantenerte siempre informado',
bodyBuilder: (context, ref) {
final theme = ref.watch(themePortProvider);
final vm = ref.read(signUpViewModelProvider.notifier);
final state = ref.watch(signUpViewModelProvider);
return SignupPersonalScreen(
firstNameTextFieldController: vm.firstNameController,
lastNameTextFieldController: vm.lastNameController,
documentNumberTextFieldController: vm.documentNumberController,
phoneTextFieldController: vm.phoneController,
emailTextFieldController: vm.emailController,
documentTypeSelected: state.documentType.trim().isEmpty
? null
: state.documentType,
onDocumentTypeChanged: vm.setDocumentType,
acceptTerms: state.acceptTerms,
onAcceptTermsPressed: (v) => vm.setAcceptTerms(v ?? false),
termsText: 'Acepto los términos y condiciones',
theme: theme,
firstNameLabel: 'Nombre',
firstNameHint: 'Nombre',
lastNameLabel: 'Apellido',
lastNameHint: 'Apellido',
documentTypeOptions: const ['DNI', 'NIE', 'Pasaporte'],
documentTypeHint: 'Documento',
documentNumberLabel: '',
documentNumberHint: 'DNI/NIE/Pasaporte',
phoneLabel: 'Teléfono móvil',
phoneHint: 'Teléfono móvil',
emailLabel: 'Correo electrónico',
emailHint: 'Correo electrónico',
);
},
),
SignUpStepConfig(
supertitle: 'Datos personales',
title: 'Identifícate',
subtitle:
'Nos aseguraremos de que la cuenta esté a nombre del adulto responsable',
bodyBuilder: (context, ref) {
final vm = ref.read(signUpViewModelProvider.notifier);
final state = ref.watch(signUpViewModelProvider);
return SignupAddressScreen(
bornAtController: vm.bornAtController,
relationshipSelected: state.relationship.trim().isEmpty
? null
: state.relationship,
onRelationshipChanged: vm.setRelationship,
relationshipOptions: const ['father', 'mother', 'tutor'],
relationshipHint: 'Selecciona una opción',
relationshipLabel: '¿Qué familiar eres?',
placeOfBirthController: vm.placeOfBirthController,
birthCountryController: vm.birthCountryController,
streetController: vm.addressStreetController,
cityController: vm.addressCityController,
provinceController: vm.addressProvinceController,
stateController: vm.addressStateController,
addressCountrySelected: state.address.country.trim().isEmpty
? null
: state.address.country,
onAddressCountryChanged: vm.setAddressCountry,
addressCountryOptions: const ['Spain', 'France', 'Portugal'],
addressCountryHint: 'País',
addressCountryLabel: 'País (dirección)',
postCodeController: vm.addressPostCodeController,
birthDateLabel: 'Fecha de nacimiento',
birthDateHint: 'DD/MM/AAAA',
placeOfBirthLabel: 'Lugar de nacimiento',
placeOfBirthHint: 'Ciudad de nacimiento',
birthCountryLabel: 'País de nacimiento',
birthCountryHint: 'País de nacimiento',
streetLabel: 'Calle / Dirección',
streetHint: 'Calle Gran Vía 30 6º',
cityLabel: 'Ciudad',
cityHint: 'Ciudad',
provinceLabel: 'Provincia',
provinceHint: 'Provincia',
stateLabel: 'Comunidad / Estado',
stateHint: 'Comunidad / Estado',
postCodeLabel: 'Código postal',
postCodeHint: '28013',
);
},
),
SignUpStepConfig(
supertitle: 'Domicilio',
title: 'Tu dirección',
subtitle:
'Contraseña mínima de 8 caracteres, con una mayúscula, un número y un carácter especial',
bodyBuilder: (context, ref) {
final vm = ref.read(signUpViewModelProvider.notifier);
final state = ref.watch(signUpViewModelProvider);
return SignUpPasswordScreen(
isPasswordVisible: state.isShowPassword,
passwordTextFieldController: vm.passwordController,
repeatPasswordTextFieldController: vm.repeatPasswordController,
);
},
),
];

View File

@@ -0,0 +1,15 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'address_view_state.freezed.dart';
@freezed
abstract class AddressViewState with _$AddressViewState {
const factory AddressViewState({
@Default('') String street,
@Default('') String city,
@Default('') String province,
@Default('') String state,
@Default('') String country,
int? postCode,
}) = _AddressViewState;
}

View File

@@ -0,0 +1,286 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'address_view_state.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$AddressViewState {
String get street; String get city; String get province; String get state; String get country; int? get postCode;
/// Create a copy of AddressViewState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$AddressViewStateCopyWith<AddressViewState> get copyWith => _$AddressViewStateCopyWithImpl<AddressViewState>(this as AddressViewState, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is AddressViewState&&(identical(other.street, street) || other.street == street)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.state, state) || other.state == state)&&(identical(other.country, country) || other.country == country)&&(identical(other.postCode, postCode) || other.postCode == postCode));
}
@override
int get hashCode => Object.hash(runtimeType,street,city,province,state,country,postCode);
@override
String toString() {
return 'AddressViewState(street: $street, city: $city, province: $province, state: $state, country: $country, postCode: $postCode)';
}
}
/// @nodoc
abstract mixin class $AddressViewStateCopyWith<$Res> {
factory $AddressViewStateCopyWith(AddressViewState value, $Res Function(AddressViewState) _then) = _$AddressViewStateCopyWithImpl;
@useResult
$Res call({
String street, String city, String province, String state, String country, int? postCode
});
}
/// @nodoc
class _$AddressViewStateCopyWithImpl<$Res>
implements $AddressViewStateCopyWith<$Res> {
_$AddressViewStateCopyWithImpl(this._self, this._then);
final AddressViewState _self;
final $Res Function(AddressViewState) _then;
/// Create a copy of AddressViewState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? street = null,Object? city = null,Object? province = null,Object? state = null,Object? country = null,Object? postCode = freezed,}) {
return _then(_self.copyWith(
street: null == street ? _self.street : street // ignore: cast_nullable_to_non_nullable
as String,city: null == city ? _self.city : city // ignore: cast_nullable_to_non_nullable
as String,province: null == province ? _self.province : province // ignore: cast_nullable_to_non_nullable
as String,state: null == state ? _self.state : state // ignore: cast_nullable_to_non_nullable
as String,country: null == country ? _self.country : country // ignore: cast_nullable_to_non_nullable
as String,postCode: freezed == postCode ? _self.postCode : postCode // ignore: cast_nullable_to_non_nullable
as int?,
));
}
}
/// Adds pattern-matching-related methods to [AddressViewState].
extension AddressViewStatePatterns on AddressViewState {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _AddressViewState value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _AddressViewState() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _AddressViewState value) $default,){
final _that = this;
switch (_that) {
case _AddressViewState():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _AddressViewState value)? $default,){
final _that = this;
switch (_that) {
case _AddressViewState() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( String street, String city, String province, String state, String country, int? postCode)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _AddressViewState() when $default != null:
return $default(_that.street,_that.city,_that.province,_that.state,_that.country,_that.postCode);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( String street, String city, String province, String state, String country, int? postCode) $default,) {final _that = this;
switch (_that) {
case _AddressViewState():
return $default(_that.street,_that.city,_that.province,_that.state,_that.country,_that.postCode);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( String street, String city, String province, String state, String country, int? postCode)? $default,) {final _that = this;
switch (_that) {
case _AddressViewState() when $default != null:
return $default(_that.street,_that.city,_that.province,_that.state,_that.country,_that.postCode);case _:
return null;
}
}
}
/// @nodoc
class _AddressViewState implements AddressViewState {
const _AddressViewState({this.street = '', this.city = '', this.province = '', this.state = '', this.country = '', this.postCode});
@override@JsonKey() final String street;
@override@JsonKey() final String city;
@override@JsonKey() final String province;
@override@JsonKey() final String state;
@override@JsonKey() final String country;
@override final int? postCode;
/// Create a copy of AddressViewState
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$AddressViewStateCopyWith<_AddressViewState> get copyWith => __$AddressViewStateCopyWithImpl<_AddressViewState>(this, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _AddressViewState&&(identical(other.street, street) || other.street == street)&&(identical(other.city, city) || other.city == city)&&(identical(other.province, province) || other.province == province)&&(identical(other.state, state) || other.state == state)&&(identical(other.country, country) || other.country == country)&&(identical(other.postCode, postCode) || other.postCode == postCode));
}
@override
int get hashCode => Object.hash(runtimeType,street,city,province,state,country,postCode);
@override
String toString() {
return 'AddressViewState(street: $street, city: $city, province: $province, state: $state, country: $country, postCode: $postCode)';
}
}
/// @nodoc
abstract mixin class _$AddressViewStateCopyWith<$Res> implements $AddressViewStateCopyWith<$Res> {
factory _$AddressViewStateCopyWith(_AddressViewState value, $Res Function(_AddressViewState) _then) = __$AddressViewStateCopyWithImpl;
@override @useResult
$Res call({
String street, String city, String province, String state, String country, int? postCode
});
}
/// @nodoc
class __$AddressViewStateCopyWithImpl<$Res>
implements _$AddressViewStateCopyWith<$Res> {
__$AddressViewStateCopyWithImpl(this._self, this._then);
final _AddressViewState _self;
final $Res Function(_AddressViewState) _then;
/// Create a copy of AddressViewState
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? street = null,Object? city = null,Object? province = null,Object? state = null,Object? country = null,Object? postCode = freezed,}) {
return _then(_AddressViewState(
street: null == street ? _self.street : street // ignore: cast_nullable_to_non_nullable
as String,city: null == city ? _self.city : city // ignore: cast_nullable_to_non_nullable
as String,province: null == province ? _self.province : province // ignore: cast_nullable_to_non_nullable
as String,state: null == state ? _self.state : state // ignore: cast_nullable_to_non_nullable
as String,country: null == country ? _self.country : country // ignore: cast_nullable_to_non_nullable
as String,postCode: freezed == postCode ? _self.postCode : postCode // ignore: cast_nullable_to_non_nullable
as int?,
));
}
}
// dart format on

View File

@@ -0,0 +1,740 @@
import 'dart:async';
import 'package:auth/src/features/sign_up/domain/entities/address_entity.dart';
import 'package:auth/src/features/sign_up/domain/entities/sign_up_request_entity.dart';
import 'package:auth/src/features/sign_up/domain/entities/two_fa_secret_entity.dart';
import 'package:auth/src/features/sign_up/domain/generate_two_fa_sign_up_use_case.dart';
import 'package:auth/src/features/sign_up/domain/sign_up_use_case.dart';
import 'package:auth/src/features/sign_up/domain/verify_two_fa_code_sign_up_use_case.dart';
import 'package:auth/src/features/sign_up/presentation/providers/generate_two_fa_sign_up_provider.dart';
import 'package:auth/src/features/sign_up/presentation/providers/sign_up_provider.dart';
import 'package:auth/src/features/sign_up/presentation/providers/verify_two_fa_code_sign_up_provider.dart';
import 'package:auth/src/features/sign_up/presentation/state/address_view_state.dart';
import 'package:auth/src/features/sign_up/presentation/state/sign_up_view_state.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:sf_localizations/sf_localizations.dart';
import 'package:uuid/uuid.dart';
final signUpViewModelProvider =
NotifierProvider.autoDispose<SignUpViewModel, SignUpViewState>(
SignUpViewModel.new,
);
class SignUpViewModel extends Notifier<SignUpViewState> {
late final SignUpUseCase _signUpUseCase;
late final GenerateTwoFASignUpUseCase _generateTwoFASignUpUseCase;
late final VerifyTwoFACodeSignUpUseCase _verifyTwoFACodeSignUpUseCase;
late final TextEditingController firstNameController;
late final TextEditingController lastNameController;
late final TextEditingController documentNumberController;
late final TextEditingController documentTypeController;
late final TextEditingController phoneController;
late final TextEditingController emailController;
late final TextEditingController relationshipController;
late final TextEditingController bornAtController;
late final TextEditingController placeOfBirthController;
late final TextEditingController birthCountryController;
late final TextEditingController addressStreetController;
late final TextEditingController addressCityController;
late final TextEditingController addressProvinceController;
late final TextEditingController addressStateController;
late final TextEditingController addressCountryController;
late final TextEditingController addressPostCodeController;
late final TextEditingController passwordController;
late final TextEditingController repeatPasswordController;
static const int _lastIndex = 2;
static final RegExp _emailRegex = RegExp(
r'^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$',
caseSensitive: false,
);
static final RegExp _phoneRegex = RegExp(r'^\+?\d{6,15}$');
@override
SignUpViewState build() {
_signUpUseCase = ref.read(signUpUseCaseProvider);
_generateTwoFASignUpUseCase = ref.read(generateTwoFASignUpUseCaseProvider);
_verifyTwoFACodeSignUpUseCase = ref.read(
verifyTwoFACodeSignUpUseCaseProvider,
);
final initial = SignUpViewState(userId: const Uuid().v4());
_initControllers(initial);
_addListeners();
ref.onDispose(disposeControllers);
return initial;
}
void _initControllers(SignUpViewState s) {
firstNameController = TextEditingController(text: s.firstName);
lastNameController = TextEditingController(text: s.lastName);
documentNumberController = TextEditingController(text: s.documentNumber);
documentTypeController = TextEditingController(text: s.documentType);
phoneController = TextEditingController(text: s.phone);
emailController = TextEditingController(text: s.email);
relationshipController = TextEditingController(text: s.relationship);
bornAtController = TextEditingController(
text: s.bornAt == null ? '' : _formatDate(s.bornAt!),
);
placeOfBirthController = TextEditingController(text: s.placeOfBirth);
birthCountryController = TextEditingController(text: s.birthCountry);
addressStreetController = TextEditingController(text: s.address.street);
addressCityController = TextEditingController(text: s.address.city);
addressProvinceController = TextEditingController(text: s.address.province);
addressStateController = TextEditingController(text: s.address.state);
addressCountryController = TextEditingController(text: s.address.country);
addressPostCodeController = TextEditingController(
text: s.address.postCode?.toString() ?? '',
);
passwordController = TextEditingController(text: s.password);
repeatPasswordController = TextEditingController(text: s.repeatPassword);
}
void _addListeners() {
firstNameController.addListener(_onFirstNameChanged);
lastNameController.addListener(_onLastNameChanged);
documentNumberController.addListener(_onDocumentNumberChanged);
documentTypeController.addListener(_onDocumentTypeChanged);
phoneController.addListener(_onPhoneChanged);
emailController.addListener(_onEmailChanged);
relationshipController.addListener(_onRelationshipChanged);
bornAtController.addListener(_onBornAtTextChanged);
placeOfBirthController.addListener(_onPlaceOfBirthChanged);
birthCountryController.addListener(_onBirthCountryChanged);
addressStreetController.addListener(_onAddressStreetChanged);
addressCityController.addListener(_onAddressCityChanged);
addressProvinceController.addListener(_onAddressProvinceChanged);
addressStateController.addListener(_onAddressStateChanged);
addressCountryController.addListener(_onAddressCountryChanged);
addressPostCodeController.addListener(_onAddressPostCodeChanged);
passwordController.addListener(_onPasswordChanged);
repeatPasswordController.addListener(_onRepeatPasswordChanged);
}
void next() {
if (state.isLoading) return;
final ok = switch (state.currentIndex) {
0 => _validateStep0(),
1 => _validateStep1(),
2 => _validateStep2(),
_ => true,
};
if (!ok) return;
if (state.currentIndex >= _lastIndex) {
unawaited(signUp());
return;
}
state = state.copyWith(
currentIndex: (state.currentIndex + 1).clamp(0, _lastIndex),
);
}
void back() {
if (state.isLoading) return;
if (state.currentIndex <= 0) return;
state = state.copyWith(
currentIndex: (state.currentIndex - 1).clamp(0, _lastIndex),
);
}
void setDocumentType(String? value) {
final v = value ?? '';
if (documentTypeController.text == v) return;
documentTypeController.text = v;
}
void setRelationship(String? value) {
final v = value ?? '';
if (relationshipController.text == v) return;
relationshipController.text = v;
}
void setAddressCountry(String? value) {
final v = value ?? '';
if (addressCountryController.text == v) return;
addressCountryController.text = v;
}
void setAcceptTerms(bool value) {
if (value == state.acceptTerms) return;
state = state.copyWith(acceptTerms: value, errorMessage: '');
}
void toggleShowPassword() {
state = state.copyWith(isShowPassword: !state.isShowPassword);
}
void _onFirstNameChanged() {
final text = firstNameController.text;
if (text == state.firstName) return;
state = state.copyWith(firstName: text, errorMessage: '');
}
void _onLastNameChanged() {
final text = lastNameController.text;
if (text == state.lastName) return;
state = state.copyWith(lastName: text, errorMessage: '');
}
void _onDocumentNumberChanged() {
final text = documentNumberController.text;
if (text == state.documentNumber) return;
state = state.copyWith(documentNumber: text, errorMessage: '');
}
void _onDocumentTypeChanged() {
final text = documentTypeController.text;
if (text == state.documentType) return;
state = state.copyWith(documentType: text, errorMessage: '');
}
void _onRelationshipChanged() {
final text = relationshipController.text;
if (text == state.relationship) return;
state = state.copyWith(relationship: text, errorMessage: '');
}
void _onPhoneChanged() {
final text = phoneController.text;
if (text == state.phone) return;
state = state.copyWith(phone: text, errorMessage: '');
if (state.showErrors) {
state = state.copyWith(phoneError: _phoneErrorFor(text));
}
}
void _onEmailChanged() {
final text = emailController.text;
if (text == state.email) return;
state = state.copyWith(email: text, errorMessage: '');
if (state.showErrors) {
state = state.copyWith(emailError: _emailErrorFor(text));
}
}
void _onPasswordChanged() {
final text = passwordController.text;
if (text == state.password) return;
state = state.copyWith(password: text, errorMessage: '');
if (state.showErrors) {
state = state.copyWith(
passwordError: _passwordErrorFor(
password: state.password,
repeatPassword: state.repeatPassword,
),
);
}
}
void _onRepeatPasswordChanged() {
final text = repeatPasswordController.text;
if (text == state.repeatPassword) return;
state = state.copyWith(repeatPassword: text, errorMessage: '');
if (state.showErrors) {
state = state.copyWith(
passwordError: _passwordErrorFor(
password: state.password,
repeatPassword: state.repeatPassword,
),
);
}
}
void _onBornAtTextChanged() {
final text = bornAtController.text;
final parsed = _tryParseDate(text);
if (text.trim().isEmpty) {
if (state.bornAt != null) {
state = state.copyWith(bornAt: null, errorMessage: '');
}
return;
}
if (parsed != null && parsed != state.bornAt) {
state = state.copyWith(bornAt: parsed, errorMessage: '');
}
}
void _onPlaceOfBirthChanged() {
final text = placeOfBirthController.text;
if (text == state.placeOfBirth) return;
state = state.copyWith(placeOfBirth: text, errorMessage: '');
}
void _onBirthCountryChanged() {
final text = birthCountryController.text;
if (text == state.birthCountry) return;
state = state.copyWith(birthCountry: text, errorMessage: '');
}
void _onAddressStreetChanged() {
final text = addressStreetController.text;
if (text == state.address.street) return;
state = state.copyWith(
address: state.address.copyWith(street: text),
errorMessage: '',
);
}
void _onAddressCityChanged() {
final text = addressCityController.text;
if (text == state.address.city) return;
state = state.copyWith(
address: state.address.copyWith(city: text),
errorMessage: '',
);
}
void _onAddressProvinceChanged() {
final text = addressProvinceController.text;
if (text == state.address.province) return;
state = state.copyWith(
address: state.address.copyWith(province: text),
errorMessage: '',
);
}
void _onAddressStateChanged() {
final text = addressStateController.text;
if (text == state.address.state) return;
state = state.copyWith(
address: state.address.copyWith(state: text),
errorMessage: '',
);
}
void _onAddressCountryChanged() {
final text = addressCountryController.text;
if (text == state.address.country) return;
state = state.copyWith(
address: state.address.copyWith(country: text),
errorMessage: '',
);
}
void _onAddressPostCodeChanged() {
final text = addressPostCodeController.text.trim();
final parsed = int.tryParse(text);
if (text.isEmpty) {
if (state.address.postCode != null) {
state = state.copyWith(
address: state.address.copyWith(postCode: null),
errorMessage: '',
);
}
return;
}
if (parsed != null && parsed != state.address.postCode) {
state = state.copyWith(
address: state.address.copyWith(postCode: parsed),
errorMessage: '',
);
}
}
void setOtpCode(String code) {
state = state.copyWith(otpCode: code, otpError: '');
}
bool _validateStep0() {
final emailError = _emailErrorFor(state.email);
final phoneError = _phoneErrorFor(state.phone);
state = state.copyWith(
showErrors: true,
emailError: emailError,
phoneError: phoneError,
errorMessage: '',
);
if (state.firstName.trim().isEmpty) {
state = state.copyWith(errorMessage: 'El nombre es obligatorio');
return false;
}
if (state.lastName.trim().isEmpty) {
state = state.copyWith(errorMessage: 'El apellido es obligatorio');
return false;
}
if (state.documentType.trim().isEmpty) {
state = state.copyWith(
errorMessage: 'El tipo de documento es obligatorio',
);
return false;
}
if (state.documentNumber.trim().isEmpty) {
state = state.copyWith(
errorMessage: 'El número de documento es obligatorio',
);
return false;
}
if (phoneError.isNotEmpty) {
state = state.copyWith(errorMessage: phoneError);
return false;
}
if (emailError.isNotEmpty) {
state = state.copyWith(errorMessage: emailError);
return false;
}
if (!state.acceptTerms) {
state = state.copyWith(
errorMessage: 'Debes aceptar los términos y condiciones',
);
return false;
}
return true;
}
bool _validateStep1() {
if (!state.showErrors) {
state = state.copyWith(showErrors: true, errorMessage: '');
} else {
state = state.copyWith(errorMessage: '');
}
if (state.relationship.trim().isEmpty) {
state = state.copyWith(errorMessage: 'La relación es obligatoria');
return false;
}
if (state.bornAt == null) {
state = state.copyWith(
errorMessage: 'Selecciona una fecha de nacimiento válida (DD/MM/AAAA)',
);
return false;
}
if (state.placeOfBirth.trim().isEmpty) {
state = state.copyWith(errorMessage: 'Falta el lugar de nacimiento');
return false;
}
if (state.birthCountry.trim().isEmpty) {
state = state.copyWith(errorMessage: 'Falta el país de nacimiento');
return false;
}
if (!_isAddressValid(state.address)) {
state = state.copyWith(errorMessage: 'Completa la dirección');
return false;
}
return true;
}
bool _validateStep2() {
final passwordError = _passwordErrorFor(
password: state.password,
repeatPassword: state.repeatPassword,
);
state = state.copyWith(
showErrors: true,
passwordError: passwordError,
errorMessage: '',
);
if (passwordError.isNotEmpty) return false;
return true;
}
bool _validateForm() {
return _validateStep0() && _validateStep1() && _validateStep2();
}
bool _isValidEmail(String email) => _emailRegex.hasMatch(email);
String _emailErrorFor(String value) {
final email = value.trim();
if (email.isEmpty) return I18n.errorEmailRequired;
if (!_isValidEmail(email)) return I18n.errorEmailInvalid;
return '';
}
String _passwordErrorFor({
required String password,
required String repeatPassword,
}) {
final p = password.trim();
final rp = repeatPassword.trim();
if (p.isEmpty) return I18n.errorPasswordRequired;
if (p.length < 6) return I18n.errorPasswordMinLength;
if (rp.isEmpty) return 'Repite la contraseña';
if (p != rp) return 'Las contraseñas no coinciden';
return '';
}
String _phoneErrorFor(String value) {
final phone = value.trim();
if (phone.isEmpty) return 'El teléfono es obligatorio';
if (!_phoneRegex.hasMatch(phone)) {
return 'El teléfono no tiene un formato válido';
}
return '';
}
bool _isAddressValid(AddressViewState a) {
return a.street.trim().isNotEmpty &&
a.city.trim().isNotEmpty &&
a.province.trim().isNotEmpty &&
a.state.trim().isNotEmpty &&
a.country.trim().isNotEmpty &&
a.postCode != null;
}
AddressEntity _toAddressEntity(AddressViewState a) {
return AddressEntity(
street: a.street.trim(),
city: a.city.trim(),
province: a.province.trim(),
state: a.state.trim(),
country: a.country.trim(),
postCode: a.postCode ?? 0,
);
}
SignUpRequestEntity _toRequest() {
final bornAt = state.bornAt;
if (bornAt == null) throw Exception('bornAt is required');
return SignUpRequestEntity(
documentType: state.documentType.trim(),
documentNumber: state.documentNumber.trim(),
relationship: state.relationship.trim(),
firstName: state.firstName.trim(),
lastName: state.lastName.trim(),
email: state.email.trim(),
phone: state.phone.trim(),
language: state.language.trim().isEmpty ? 'es' : state.language.trim(),
password: state.password,
bornAt: bornAt.millisecondsSinceEpoch,
userId: state.userId.trim(),
placeOfBirth: state.placeOfBirth.trim(),
birthCountry: state.birthCountry.trim(),
addresses: <AddressEntity>[_toAddressEntity(state.address)],
taxResidences: <AddressEntity>[_toAddressEntity(state.address)],
);
}
Future<bool> signUp() async {
if (state.isLoading) return false;
if (!_validateForm()) return false;
_startLoadingForSignUp();
try {
final request = _toRequest();
final token = await _signUp(request);
if (!ref.mounted) return false;
final secretEntity = await _generateTwoFA(token);
if (!ref.mounted) return false;
final validationError = _twoFAResponseError(secretEntity);
if (validationError != null) {
_finishWithError(token: token, message: validationError);
return false;
}
_finishWithSuccess(token: token, twoFASecret: secretEntity);
return true;
} catch (e) {
if (!ref.mounted) return false;
_finishWithError(message: e.toString());
return false;
}
}
void _startLoadingForSignUp() {
state = state.copyWith(
isLoading: true,
errorMessage: '',
twoFASecret: null,
);
}
Future<String> _signUp(SignUpRequestEntity request) async {
return _signUpUseCase.signUp(request: request);
}
Future<TwoFASecretEntity> _generateTwoFA(String token) async {
return _generateTwoFASignUpUseCase.generateTwoFASignUp(token: token);
}
Future<bool> verifyTwoFACodeSignUp({required String token}) async {
if (state.isOtpLoading) return false;
final code = state.otpCode.trim();
if (code.length != 6) {
state = state.copyWith(otpError: 'error otp');
return false;
}
state = state.copyWith(isOtpLoading: true, otpError: '');
try {
await _verifyTwoFACodeSignUpUseCase.verifyTwoFACodeSignUp(
token: token,
code: code,
);
if (!ref.mounted) return false;
state = state.copyWith(isOtpLoading: false);
return true;
} catch (e) {
if (!ref.mounted) return false;
state = state.copyWith(isOtpLoading: false, otpError: e.toString());
return false;
}
}
String? _twoFAResponseError(TwoFASecretEntity entity) {
if (!entity.isCreated) {
return 'No se pudo generar el 2FA (isCreated=false)';
}
final secret = entity.item.secret.trim();
final qr = entity.item.qr.trim();
if (secret.isEmpty || qr.isEmpty) {
return 'Respuesta inválida del 2FA (secret/qr vacío)';
}
return null;
}
void _finishWithSuccess({
required String token,
required TwoFASecretEntity twoFASecret,
}) {
state = state.copyWith(
isLoading: false,
token: token,
twoFASecret: twoFASecret,
errorMessage: '',
);
}
void _finishWithError({String? token, required String message}) {
state = state.copyWith(
isLoading: false,
token: token ?? state.token,
errorMessage: message,
);
}
void showAccountCreated() {
state = state.copyWith(showAccountCreated: true, errorMessage: '');
}
DateTime? _tryParseDate(String value) {
final v = value.trim();
if (v.isEmpty) return null;
final parts = v.split('/');
if (parts.length != 3) return null;
final d = int.tryParse(parts[0]);
final m = int.tryParse(parts[1]);
final y = int.tryParse(parts[2]);
if (d == null || m == null || y == null) return null;
final date = DateTime(y, m, d);
if (date.year != y || date.month != m || date.day != d) return null;
return date;
}
String _formatDate(DateTime d) {
final dd = d.day.toString().padLeft(2, '0');
final mm = d.month.toString().padLeft(2, '0');
final yyyy = d.year.toString();
return '$dd/$mm/$yyyy';
}
void setBornAt(DateTime date) {
bornAtController.text = _formatDate(date);
state = state.copyWith(bornAt: date, errorMessage: '');
}
void disposeControllers() {
firstNameController.removeListener(_onFirstNameChanged);
lastNameController.removeListener(_onLastNameChanged);
documentNumberController.removeListener(_onDocumentNumberChanged);
documentTypeController.removeListener(_onDocumentTypeChanged);
phoneController.removeListener(_onPhoneChanged);
emailController.removeListener(_onEmailChanged);
relationshipController.removeListener(_onRelationshipChanged);
bornAtController.removeListener(_onBornAtTextChanged);
placeOfBirthController.removeListener(_onPlaceOfBirthChanged);
birthCountryController.removeListener(_onBirthCountryChanged);
addressStreetController.removeListener(_onAddressStreetChanged);
addressCityController.removeListener(_onAddressCityChanged);
addressProvinceController.removeListener(_onAddressProvinceChanged);
addressStateController.removeListener(_onAddressStateChanged);
addressCountryController.removeListener(_onAddressCountryChanged);
addressPostCodeController.removeListener(_onAddressPostCodeChanged);
passwordController.removeListener(_onPasswordChanged);
repeatPasswordController.removeListener(_onRepeatPasswordChanged);
firstNameController.dispose();
lastNameController.dispose();
documentNumberController.dispose();
documentTypeController.dispose();
phoneController.dispose();
emailController.dispose();
relationshipController.dispose();
bornAtController.dispose();
placeOfBirthController.dispose();
birthCountryController.dispose();
addressStreetController.dispose();
addressCityController.dispose();
addressProvinceController.dispose();
addressStateController.dispose();
addressCountryController.dispose();
addressPostCodeController.dispose();
passwordController.dispose();
repeatPasswordController.dispose();
}
}

View File

@@ -0,0 +1,45 @@
import 'package:auth/src/features/sign_up/domain/entities/two_fa_secret_entity.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'address_view_state.dart';
part 'sign_up_view_state.freezed.dart';
@freezed
abstract class SignUpViewState with _$SignUpViewState {
const factory SignUpViewState({
@Default(0) int currentIndex,
@Default('') String documentNumber,
@Default('') String documentType,
@Default(false) bool acceptTerms,
@Default('') String relationship,
@Default('') String firstName,
@Default('') String lastName,
@Default('') String email,
@Default('') String phone,
@Default('') String language,
DateTime? bornAt,
@Default('') String password,
@Default('') String repeatPassword,
@Default(false) bool isShowPassword,
@Default('') String userId,
@Default('') String placeOfBirth,
@Default('') String birthCountry,
@Default(AddressViewState()) AddressViewState address,
@Default('') String emailError,
@Default('') String passwordError,
@Default('') String phoneError,
@Default('') String errorMessage,
@Default(false) bool isLoading,
@Default(false) bool showErrors,
@Default('') String token,
TwoFASecretEntity? twoFASecret,
@Default('') String otpCode,
@Default('') String otpError,
@Default(false) bool isOtpLoading,
@Default(false) bool showAccountCreated,
}) = _SignUpViewState;
}

View File

@@ -0,0 +1,400 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// coverage:ignore-file
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'sign_up_view_state.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$SignUpViewState {
int get currentIndex; String get documentNumber; String get documentType; bool get acceptTerms; String get relationship; String get firstName; String get lastName; String get email; String get phone; String get language; DateTime? get bornAt; String get password; String get repeatPassword; bool get isShowPassword; String get userId; String get placeOfBirth; String get birthCountry; AddressViewState get address; String get emailError; String get passwordError; String get phoneError; String get errorMessage; bool get isLoading; bool get showErrors; String get token; TwoFASecretEntity? get twoFASecret; String get otpCode; String get otpError; bool get isOtpLoading; bool get showAccountCreated;
/// Create a copy of SignUpViewState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
$SignUpViewStateCopyWith<SignUpViewState> get copyWith => _$SignUpViewStateCopyWithImpl<SignUpViewState>(this as SignUpViewState, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is SignUpViewState&&(identical(other.currentIndex, currentIndex) || other.currentIndex == currentIndex)&&(identical(other.documentNumber, documentNumber) || other.documentNumber == documentNumber)&&(identical(other.documentType, documentType) || other.documentType == documentType)&&(identical(other.acceptTerms, acceptTerms) || other.acceptTerms == acceptTerms)&&(identical(other.relationship, relationship) || other.relationship == relationship)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.email, email) || other.email == email)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.language, language) || other.language == language)&&(identical(other.bornAt, bornAt) || other.bornAt == bornAt)&&(identical(other.password, password) || other.password == password)&&(identical(other.repeatPassword, repeatPassword) || other.repeatPassword == repeatPassword)&&(identical(other.isShowPassword, isShowPassword) || other.isShowPassword == isShowPassword)&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.placeOfBirth, placeOfBirth) || other.placeOfBirth == placeOfBirth)&&(identical(other.birthCountry, birthCountry) || other.birthCountry == birthCountry)&&(identical(other.address, address) || other.address == address)&&(identical(other.emailError, emailError) || other.emailError == emailError)&&(identical(other.passwordError, passwordError) || other.passwordError == passwordError)&&(identical(other.phoneError, phoneError) || other.phoneError == phoneError)&&(identical(other.errorMessage, errorMessage) || other.errorMessage == errorMessage)&&(identical(other.isLoading, isLoading) || other.isLoading == isLoading)&&(identical(other.showErrors, showErrors) || other.showErrors == showErrors)&&(identical(other.token, token) || other.token == token)&&(identical(other.twoFASecret, twoFASecret) || other.twoFASecret == twoFASecret)&&(identical(other.otpCode, otpCode) || other.otpCode == otpCode)&&(identical(other.otpError, otpError) || other.otpError == otpError)&&(identical(other.isOtpLoading, isOtpLoading) || other.isOtpLoading == isOtpLoading)&&(identical(other.showAccountCreated, showAccountCreated) || other.showAccountCreated == showAccountCreated));
}
@override
int get hashCode => Object.hashAll([runtimeType,currentIndex,documentNumber,documentType,acceptTerms,relationship,firstName,lastName,email,phone,language,bornAt,password,repeatPassword,isShowPassword,userId,placeOfBirth,birthCountry,address,emailError,passwordError,phoneError,errorMessage,isLoading,showErrors,token,twoFASecret,otpCode,otpError,isOtpLoading,showAccountCreated]);
@override
String toString() {
return 'SignUpViewState(currentIndex: $currentIndex, documentNumber: $documentNumber, documentType: $documentType, acceptTerms: $acceptTerms, relationship: $relationship, firstName: $firstName, lastName: $lastName, email: $email, phone: $phone, language: $language, bornAt: $bornAt, password: $password, repeatPassword: $repeatPassword, isShowPassword: $isShowPassword, userId: $userId, placeOfBirth: $placeOfBirth, birthCountry: $birthCountry, address: $address, emailError: $emailError, passwordError: $passwordError, phoneError: $phoneError, errorMessage: $errorMessage, isLoading: $isLoading, showErrors: $showErrors, token: $token, twoFASecret: $twoFASecret, otpCode: $otpCode, otpError: $otpError, isOtpLoading: $isOtpLoading, showAccountCreated: $showAccountCreated)';
}
}
/// @nodoc
abstract mixin class $SignUpViewStateCopyWith<$Res> {
factory $SignUpViewStateCopyWith(SignUpViewState value, $Res Function(SignUpViewState) _then) = _$SignUpViewStateCopyWithImpl;
@useResult
$Res call({
int currentIndex, String documentNumber, String documentType, bool acceptTerms, String relationship, String firstName, String lastName, String email, String phone, String language, DateTime? bornAt, String password, String repeatPassword, bool isShowPassword, String userId, String placeOfBirth, String birthCountry, AddressViewState address, String emailError, String passwordError, String phoneError, String errorMessage, bool isLoading, bool showErrors, String token, TwoFASecretEntity? twoFASecret, String otpCode, String otpError, bool isOtpLoading, bool showAccountCreated
});
$AddressViewStateCopyWith<$Res> get address;$TwoFASecretEntityCopyWith<$Res>? get twoFASecret;
}
/// @nodoc
class _$SignUpViewStateCopyWithImpl<$Res>
implements $SignUpViewStateCopyWith<$Res> {
_$SignUpViewStateCopyWithImpl(this._self, this._then);
final SignUpViewState _self;
final $Res Function(SignUpViewState) _then;
/// Create a copy of SignUpViewState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? currentIndex = null,Object? documentNumber = null,Object? documentType = null,Object? acceptTerms = null,Object? relationship = null,Object? firstName = null,Object? lastName = null,Object? email = null,Object? phone = null,Object? language = null,Object? bornAt = freezed,Object? password = null,Object? repeatPassword = null,Object? isShowPassword = null,Object? userId = null,Object? placeOfBirth = null,Object? birthCountry = null,Object? address = null,Object? emailError = null,Object? passwordError = null,Object? phoneError = null,Object? errorMessage = null,Object? isLoading = null,Object? showErrors = null,Object? token = null,Object? twoFASecret = freezed,Object? otpCode = null,Object? otpError = null,Object? isOtpLoading = null,Object? showAccountCreated = null,}) {
return _then(_self.copyWith(
currentIndex: null == currentIndex ? _self.currentIndex : currentIndex // ignore: cast_nullable_to_non_nullable
as int,documentNumber: null == documentNumber ? _self.documentNumber : documentNumber // ignore: cast_nullable_to_non_nullable
as String,documentType: null == documentType ? _self.documentType : documentType // ignore: cast_nullable_to_non_nullable
as String,acceptTerms: null == acceptTerms ? _self.acceptTerms : acceptTerms // ignore: cast_nullable_to_non_nullable
as bool,relationship: null == relationship ? _self.relationship : relationship // ignore: cast_nullable_to_non_nullable
as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
as String,lastName: null == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable
as String,email: null == email ? _self.email : email // ignore: cast_nullable_to_non_nullable
as String,phone: null == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable
as String,language: null == language ? _self.language : language // ignore: cast_nullable_to_non_nullable
as String,bornAt: freezed == bornAt ? _self.bornAt : bornAt // ignore: cast_nullable_to_non_nullable
as DateTime?,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable
as String,repeatPassword: null == repeatPassword ? _self.repeatPassword : repeatPassword // ignore: cast_nullable_to_non_nullable
as String,isShowPassword: null == isShowPassword ? _self.isShowPassword : isShowPassword // ignore: cast_nullable_to_non_nullable
as bool,userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable
as String,placeOfBirth: null == placeOfBirth ? _self.placeOfBirth : placeOfBirth // ignore: cast_nullable_to_non_nullable
as String,birthCountry: null == birthCountry ? _self.birthCountry : birthCountry // ignore: cast_nullable_to_non_nullable
as String,address: null == address ? _self.address : address // ignore: cast_nullable_to_non_nullable
as AddressViewState,emailError: null == emailError ? _self.emailError : emailError // ignore: cast_nullable_to_non_nullable
as String,passwordError: null == passwordError ? _self.passwordError : passwordError // ignore: cast_nullable_to_non_nullable
as String,phoneError: null == phoneError ? _self.phoneError : phoneError // ignore: cast_nullable_to_non_nullable
as String,errorMessage: null == errorMessage ? _self.errorMessage : errorMessage // ignore: cast_nullable_to_non_nullable
as String,isLoading: null == isLoading ? _self.isLoading : isLoading // ignore: cast_nullable_to_non_nullable
as bool,showErrors: null == showErrors ? _self.showErrors : showErrors // ignore: cast_nullable_to_non_nullable
as bool,token: null == token ? _self.token : token // ignore: cast_nullable_to_non_nullable
as String,twoFASecret: freezed == twoFASecret ? _self.twoFASecret : twoFASecret // ignore: cast_nullable_to_non_nullable
as TwoFASecretEntity?,otpCode: null == otpCode ? _self.otpCode : otpCode // ignore: cast_nullable_to_non_nullable
as String,otpError: null == otpError ? _self.otpError : otpError // ignore: cast_nullable_to_non_nullable
as String,isOtpLoading: null == isOtpLoading ? _self.isOtpLoading : isOtpLoading // ignore: cast_nullable_to_non_nullable
as bool,showAccountCreated: null == showAccountCreated ? _self.showAccountCreated : showAccountCreated // ignore: cast_nullable_to_non_nullable
as bool,
));
}
/// Create a copy of SignUpViewState
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$AddressViewStateCopyWith<$Res> get address {
return $AddressViewStateCopyWith<$Res>(_self.address, (value) {
return _then(_self.copyWith(address: value));
});
}/// Create a copy of SignUpViewState
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TwoFASecretEntityCopyWith<$Res>? get twoFASecret {
if (_self.twoFASecret == null) {
return null;
}
return $TwoFASecretEntityCopyWith<$Res>(_self.twoFASecret!, (value) {
return _then(_self.copyWith(twoFASecret: value));
});
}
}
/// Adds pattern-matching-related methods to [SignUpViewState].
extension SignUpViewStatePatterns on SignUpViewState {
/// A variant of `map` that fallback to returning `orElse`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeMap<TResult extends Object?>(TResult Function( _SignUpViewState value)? $default,{required TResult orElse(),}){
final _that = this;
switch (_that) {
case _SignUpViewState() when $default != null:
return $default(_that);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// Callbacks receives the raw object, upcasted.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case final Subclass2 value:
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult map<TResult extends Object?>(TResult Function( _SignUpViewState value) $default,){
final _that = this;
switch (_that) {
case _SignUpViewState():
return $default(_that);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `map` that fallback to returning `null`.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case final Subclass value:
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? mapOrNull<TResult extends Object?>(TResult? Function( _SignUpViewState value)? $default,){
final _that = this;
switch (_that) {
case _SignUpViewState() when $default != null:
return $default(_that);case _:
return null;
}
}
/// A variant of `when` that fallback to an `orElse` callback.
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return orElse();
/// }
/// ```
@optionalTypeArgs TResult maybeWhen<TResult extends Object?>(TResult Function( int currentIndex, String documentNumber, String documentType, bool acceptTerms, String relationship, String firstName, String lastName, String email, String phone, String language, DateTime? bornAt, String password, String repeatPassword, bool isShowPassword, String userId, String placeOfBirth, String birthCountry, AddressViewState address, String emailError, String passwordError, String phoneError, String errorMessage, bool isLoading, bool showErrors, String token, TwoFASecretEntity? twoFASecret, String otpCode, String otpError, bool isOtpLoading, bool showAccountCreated)? $default,{required TResult orElse(),}) {final _that = this;
switch (_that) {
case _SignUpViewState() when $default != null:
return $default(_that.currentIndex,_that.documentNumber,_that.documentType,_that.acceptTerms,_that.relationship,_that.firstName,_that.lastName,_that.email,_that.phone,_that.language,_that.bornAt,_that.password,_that.repeatPassword,_that.isShowPassword,_that.userId,_that.placeOfBirth,_that.birthCountry,_that.address,_that.emailError,_that.passwordError,_that.phoneError,_that.errorMessage,_that.isLoading,_that.showErrors,_that.token,_that.twoFASecret,_that.otpCode,_that.otpError,_that.isOtpLoading,_that.showAccountCreated);case _:
return orElse();
}
}
/// A `switch`-like method, using callbacks.
///
/// As opposed to `map`, this offers destructuring.
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case Subclass2(:final field2):
/// return ...;
/// }
/// ```
@optionalTypeArgs TResult when<TResult extends Object?>(TResult Function( int currentIndex, String documentNumber, String documentType, bool acceptTerms, String relationship, String firstName, String lastName, String email, String phone, String language, DateTime? bornAt, String password, String repeatPassword, bool isShowPassword, String userId, String placeOfBirth, String birthCountry, AddressViewState address, String emailError, String passwordError, String phoneError, String errorMessage, bool isLoading, bool showErrors, String token, TwoFASecretEntity? twoFASecret, String otpCode, String otpError, bool isOtpLoading, bool showAccountCreated) $default,) {final _that = this;
switch (_that) {
case _SignUpViewState():
return $default(_that.currentIndex,_that.documentNumber,_that.documentType,_that.acceptTerms,_that.relationship,_that.firstName,_that.lastName,_that.email,_that.phone,_that.language,_that.bornAt,_that.password,_that.repeatPassword,_that.isShowPassword,_that.userId,_that.placeOfBirth,_that.birthCountry,_that.address,_that.emailError,_that.passwordError,_that.phoneError,_that.errorMessage,_that.isLoading,_that.showErrors,_that.token,_that.twoFASecret,_that.otpCode,_that.otpError,_that.isOtpLoading,_that.showAccountCreated);case _:
throw StateError('Unexpected subclass');
}
}
/// A variant of `when` that fallback to returning `null`
///
/// It is equivalent to doing:
/// ```dart
/// switch (sealedClass) {
/// case Subclass(:final field):
/// return ...;
/// case _:
/// return null;
/// }
/// ```
@optionalTypeArgs TResult? whenOrNull<TResult extends Object?>(TResult? Function( int currentIndex, String documentNumber, String documentType, bool acceptTerms, String relationship, String firstName, String lastName, String email, String phone, String language, DateTime? bornAt, String password, String repeatPassword, bool isShowPassword, String userId, String placeOfBirth, String birthCountry, AddressViewState address, String emailError, String passwordError, String phoneError, String errorMessage, bool isLoading, bool showErrors, String token, TwoFASecretEntity? twoFASecret, String otpCode, String otpError, bool isOtpLoading, bool showAccountCreated)? $default,) {final _that = this;
switch (_that) {
case _SignUpViewState() when $default != null:
return $default(_that.currentIndex,_that.documentNumber,_that.documentType,_that.acceptTerms,_that.relationship,_that.firstName,_that.lastName,_that.email,_that.phone,_that.language,_that.bornAt,_that.password,_that.repeatPassword,_that.isShowPassword,_that.userId,_that.placeOfBirth,_that.birthCountry,_that.address,_that.emailError,_that.passwordError,_that.phoneError,_that.errorMessage,_that.isLoading,_that.showErrors,_that.token,_that.twoFASecret,_that.otpCode,_that.otpError,_that.isOtpLoading,_that.showAccountCreated);case _:
return null;
}
}
}
/// @nodoc
class _SignUpViewState implements SignUpViewState {
const _SignUpViewState({this.currentIndex = 0, this.documentNumber = '', this.documentType = '', this.acceptTerms = false, this.relationship = '', this.firstName = '', this.lastName = '', this.email = '', this.phone = '', this.language = '', this.bornAt, this.password = '', this.repeatPassword = '', this.isShowPassword = false, this.userId = '', this.placeOfBirth = '', this.birthCountry = '', this.address = const AddressViewState(), this.emailError = '', this.passwordError = '', this.phoneError = '', this.errorMessage = '', this.isLoading = false, this.showErrors = false, this.token = '', this.twoFASecret, this.otpCode = '', this.otpError = '', this.isOtpLoading = false, this.showAccountCreated = false});
@override@JsonKey() final int currentIndex;
@override@JsonKey() final String documentNumber;
@override@JsonKey() final String documentType;
@override@JsonKey() final bool acceptTerms;
@override@JsonKey() final String relationship;
@override@JsonKey() final String firstName;
@override@JsonKey() final String lastName;
@override@JsonKey() final String email;
@override@JsonKey() final String phone;
@override@JsonKey() final String language;
@override final DateTime? bornAt;
@override@JsonKey() final String password;
@override@JsonKey() final String repeatPassword;
@override@JsonKey() final bool isShowPassword;
@override@JsonKey() final String userId;
@override@JsonKey() final String placeOfBirth;
@override@JsonKey() final String birthCountry;
@override@JsonKey() final AddressViewState address;
@override@JsonKey() final String emailError;
@override@JsonKey() final String passwordError;
@override@JsonKey() final String phoneError;
@override@JsonKey() final String errorMessage;
@override@JsonKey() final bool isLoading;
@override@JsonKey() final bool showErrors;
@override@JsonKey() final String token;
@override final TwoFASecretEntity? twoFASecret;
@override@JsonKey() final String otpCode;
@override@JsonKey() final String otpError;
@override@JsonKey() final bool isOtpLoading;
@override@JsonKey() final bool showAccountCreated;
/// Create a copy of SignUpViewState
/// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline')
_$SignUpViewStateCopyWith<_SignUpViewState> get copyWith => __$SignUpViewStateCopyWithImpl<_SignUpViewState>(this, _$identity);
@override
bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _SignUpViewState&&(identical(other.currentIndex, currentIndex) || other.currentIndex == currentIndex)&&(identical(other.documentNumber, documentNumber) || other.documentNumber == documentNumber)&&(identical(other.documentType, documentType) || other.documentType == documentType)&&(identical(other.acceptTerms, acceptTerms) || other.acceptTerms == acceptTerms)&&(identical(other.relationship, relationship) || other.relationship == relationship)&&(identical(other.firstName, firstName) || other.firstName == firstName)&&(identical(other.lastName, lastName) || other.lastName == lastName)&&(identical(other.email, email) || other.email == email)&&(identical(other.phone, phone) || other.phone == phone)&&(identical(other.language, language) || other.language == language)&&(identical(other.bornAt, bornAt) || other.bornAt == bornAt)&&(identical(other.password, password) || other.password == password)&&(identical(other.repeatPassword, repeatPassword) || other.repeatPassword == repeatPassword)&&(identical(other.isShowPassword, isShowPassword) || other.isShowPassword == isShowPassword)&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.placeOfBirth, placeOfBirth) || other.placeOfBirth == placeOfBirth)&&(identical(other.birthCountry, birthCountry) || other.birthCountry == birthCountry)&&(identical(other.address, address) || other.address == address)&&(identical(other.emailError, emailError) || other.emailError == emailError)&&(identical(other.passwordError, passwordError) || other.passwordError == passwordError)&&(identical(other.phoneError, phoneError) || other.phoneError == phoneError)&&(identical(other.errorMessage, errorMessage) || other.errorMessage == errorMessage)&&(identical(other.isLoading, isLoading) || other.isLoading == isLoading)&&(identical(other.showErrors, showErrors) || other.showErrors == showErrors)&&(identical(other.token, token) || other.token == token)&&(identical(other.twoFASecret, twoFASecret) || other.twoFASecret == twoFASecret)&&(identical(other.otpCode, otpCode) || other.otpCode == otpCode)&&(identical(other.otpError, otpError) || other.otpError == otpError)&&(identical(other.isOtpLoading, isOtpLoading) || other.isOtpLoading == isOtpLoading)&&(identical(other.showAccountCreated, showAccountCreated) || other.showAccountCreated == showAccountCreated));
}
@override
int get hashCode => Object.hashAll([runtimeType,currentIndex,documentNumber,documentType,acceptTerms,relationship,firstName,lastName,email,phone,language,bornAt,password,repeatPassword,isShowPassword,userId,placeOfBirth,birthCountry,address,emailError,passwordError,phoneError,errorMessage,isLoading,showErrors,token,twoFASecret,otpCode,otpError,isOtpLoading,showAccountCreated]);
@override
String toString() {
return 'SignUpViewState(currentIndex: $currentIndex, documentNumber: $documentNumber, documentType: $documentType, acceptTerms: $acceptTerms, relationship: $relationship, firstName: $firstName, lastName: $lastName, email: $email, phone: $phone, language: $language, bornAt: $bornAt, password: $password, repeatPassword: $repeatPassword, isShowPassword: $isShowPassword, userId: $userId, placeOfBirth: $placeOfBirth, birthCountry: $birthCountry, address: $address, emailError: $emailError, passwordError: $passwordError, phoneError: $phoneError, errorMessage: $errorMessage, isLoading: $isLoading, showErrors: $showErrors, token: $token, twoFASecret: $twoFASecret, otpCode: $otpCode, otpError: $otpError, isOtpLoading: $isOtpLoading, showAccountCreated: $showAccountCreated)';
}
}
/// @nodoc
abstract mixin class _$SignUpViewStateCopyWith<$Res> implements $SignUpViewStateCopyWith<$Res> {
factory _$SignUpViewStateCopyWith(_SignUpViewState value, $Res Function(_SignUpViewState) _then) = __$SignUpViewStateCopyWithImpl;
@override @useResult
$Res call({
int currentIndex, String documentNumber, String documentType, bool acceptTerms, String relationship, String firstName, String lastName, String email, String phone, String language, DateTime? bornAt, String password, String repeatPassword, bool isShowPassword, String userId, String placeOfBirth, String birthCountry, AddressViewState address, String emailError, String passwordError, String phoneError, String errorMessage, bool isLoading, bool showErrors, String token, TwoFASecretEntity? twoFASecret, String otpCode, String otpError, bool isOtpLoading, bool showAccountCreated
});
@override $AddressViewStateCopyWith<$Res> get address;@override $TwoFASecretEntityCopyWith<$Res>? get twoFASecret;
}
/// @nodoc
class __$SignUpViewStateCopyWithImpl<$Res>
implements _$SignUpViewStateCopyWith<$Res> {
__$SignUpViewStateCopyWithImpl(this._self, this._then);
final _SignUpViewState _self;
final $Res Function(_SignUpViewState) _then;
/// Create a copy of SignUpViewState
/// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? currentIndex = null,Object? documentNumber = null,Object? documentType = null,Object? acceptTerms = null,Object? relationship = null,Object? firstName = null,Object? lastName = null,Object? email = null,Object? phone = null,Object? language = null,Object? bornAt = freezed,Object? password = null,Object? repeatPassword = null,Object? isShowPassword = null,Object? userId = null,Object? placeOfBirth = null,Object? birthCountry = null,Object? address = null,Object? emailError = null,Object? passwordError = null,Object? phoneError = null,Object? errorMessage = null,Object? isLoading = null,Object? showErrors = null,Object? token = null,Object? twoFASecret = freezed,Object? otpCode = null,Object? otpError = null,Object? isOtpLoading = null,Object? showAccountCreated = null,}) {
return _then(_SignUpViewState(
currentIndex: null == currentIndex ? _self.currentIndex : currentIndex // ignore: cast_nullable_to_non_nullable
as int,documentNumber: null == documentNumber ? _self.documentNumber : documentNumber // ignore: cast_nullable_to_non_nullable
as String,documentType: null == documentType ? _self.documentType : documentType // ignore: cast_nullable_to_non_nullable
as String,acceptTerms: null == acceptTerms ? _self.acceptTerms : acceptTerms // ignore: cast_nullable_to_non_nullable
as bool,relationship: null == relationship ? _self.relationship : relationship // ignore: cast_nullable_to_non_nullable
as String,firstName: null == firstName ? _self.firstName : firstName // ignore: cast_nullable_to_non_nullable
as String,lastName: null == lastName ? _self.lastName : lastName // ignore: cast_nullable_to_non_nullable
as String,email: null == email ? _self.email : email // ignore: cast_nullable_to_non_nullable
as String,phone: null == phone ? _self.phone : phone // ignore: cast_nullable_to_non_nullable
as String,language: null == language ? _self.language : language // ignore: cast_nullable_to_non_nullable
as String,bornAt: freezed == bornAt ? _self.bornAt : bornAt // ignore: cast_nullable_to_non_nullable
as DateTime?,password: null == password ? _self.password : password // ignore: cast_nullable_to_non_nullable
as String,repeatPassword: null == repeatPassword ? _self.repeatPassword : repeatPassword // ignore: cast_nullable_to_non_nullable
as String,isShowPassword: null == isShowPassword ? _self.isShowPassword : isShowPassword // ignore: cast_nullable_to_non_nullable
as bool,userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable
as String,placeOfBirth: null == placeOfBirth ? _self.placeOfBirth : placeOfBirth // ignore: cast_nullable_to_non_nullable
as String,birthCountry: null == birthCountry ? _self.birthCountry : birthCountry // ignore: cast_nullable_to_non_nullable
as String,address: null == address ? _self.address : address // ignore: cast_nullable_to_non_nullable
as AddressViewState,emailError: null == emailError ? _self.emailError : emailError // ignore: cast_nullable_to_non_nullable
as String,passwordError: null == passwordError ? _self.passwordError : passwordError // ignore: cast_nullable_to_non_nullable
as String,phoneError: null == phoneError ? _self.phoneError : phoneError // ignore: cast_nullable_to_non_nullable
as String,errorMessage: null == errorMessage ? _self.errorMessage : errorMessage // ignore: cast_nullable_to_non_nullable
as String,isLoading: null == isLoading ? _self.isLoading : isLoading // ignore: cast_nullable_to_non_nullable
as bool,showErrors: null == showErrors ? _self.showErrors : showErrors // ignore: cast_nullable_to_non_nullable
as bool,token: null == token ? _self.token : token // ignore: cast_nullable_to_non_nullable
as String,twoFASecret: freezed == twoFASecret ? _self.twoFASecret : twoFASecret // ignore: cast_nullable_to_non_nullable
as TwoFASecretEntity?,otpCode: null == otpCode ? _self.otpCode : otpCode // ignore: cast_nullable_to_non_nullable
as String,otpError: null == otpError ? _self.otpError : otpError // ignore: cast_nullable_to_non_nullable
as String,isOtpLoading: null == isOtpLoading ? _self.isOtpLoading : isOtpLoading // ignore: cast_nullable_to_non_nullable
as bool,showAccountCreated: null == showAccountCreated ? _self.showAccountCreated : showAccountCreated // ignore: cast_nullable_to_non_nullable
as bool,
));
}
/// Create a copy of SignUpViewState
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$AddressViewStateCopyWith<$Res> get address {
return $AddressViewStateCopyWith<$Res>(_self.address, (value) {
return _then(_self.copyWith(address: value));
});
}/// Create a copy of SignUpViewState
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$TwoFASecretEntityCopyWith<$Res>? get twoFASecret {
if (_self.twoFASecret == null) {
return null;
}
return $TwoFASecretEntityCopyWith<$Res>(_self.twoFASecret!, (value) {
return _then(_self.copyWith(twoFASecret: value));
});
}
}
// dart format on

View File

@@ -1,4 +1,4 @@
import 'package:auth/src/features/sign_up/signup_screen.dart';
import 'package:auth/src/features/sign_up/presentation/sign_up_screen.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:get_it/get_it.dart';

View File

@@ -1,114 +0,0 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class SignupAddressScreen extends ConsumerStatefulWidget {
const SignupAddressScreen({super.key});
@override
ConsumerState<SignupAddressScreen> createState() =>
SignupAddressScreenState();
}
class SignupAddressScreenState extends ConsumerState<SignupAddressScreen> {
late String country;
late int relation;
@override
void initState() {
relation = 0;
super.initState();
}
@override
Widget build(BuildContext context) {
return Column(
spacing: 24,
children: [
Column(
spacing: 8,
children: [
Align(
alignment: Alignment.bottomLeft,
child: Text(
"Fecha de nacimiento",
style: TextStyle(fontSize: 14, letterSpacing: 0),
),
),
Row(
spacing: 8,
children: [
Expanded(
child: CustomTextField(
//label: "Fecha de nacimiento",
hint: "DD",
length: 2,
keyboardType: TextInputType.number,
),
),
Expanded(
child: CustomTextField(
hint: "MM",
length: 2,
keyboardType: TextInputType.number,
),
),
Expanded(
child: CustomTextField(
hint: "AAAA",
length: 4,
keyboardType: TextInputType.number,
),
),
],
),
],
),
Column(
spacing: 8,
children: [
Align(
alignment: Alignment.bottomLeft,
child: Text(
"¿Qué familiar eres?",
style: TextStyle(fontSize: 14, letterSpacing: 0),
),
),
CustomDropdown(
items: [Text("Padre"), Text("Madre"), Text("Tutor")],
hint: "¿Qué familiar eres?",
onChanged: (value) => setState(() {
relation = value;
}),
),
],
),
CustomTextField(
label: "Dirección completa",
hint: "Calle Gran Vía 30 6º, 28013",
),
CustomTextField(label: "Ciudad", hint: "Ciudad"),
Column(
spacing: 8,
children: [
Align(
alignment: Alignment.bottomLeft,
child: Text(
"País",
style: TextStyle(fontSize: 14, letterSpacing: 0),
),
),
CustomDropdown(
items: [Text("España"), Text("Francia"), Text("Portugal")],
hint: "País",
onChanged: (value) => setState(() {
country = value;
}),
),
],
),
CustomTextField(label: "Nacionalidad", hint: "España"),
],
);
}
}

View File

@@ -1,40 +0,0 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
class SignupPersonalScreen extends StatelessWidget {
const SignupPersonalScreen({super.key});
@override
Widget build(BuildContext context) {
return Column(
spacing: 24,
children: [
CustomTextField(label: "Nombre", hint: "Nombre"),
CustomTextField(label: "Apellidos", hint: "Apellidos"),
CustomTextField(label: "DNI", hint: "DNI"),
Row(
spacing: 8,
children: [
/*CustomDropdown(
value: 0,
items: [Icon(Icons.outlined_flag), Icon(Icons.outlined_flag), Icon(Icons.outlined_flag)],
onChanged: (value)=> {},
width: 80,
),*/
Expanded(
child: CustomTextField(
label: "Teléfono móvil",
hint: "123456789",
keyboardType: TextInputType.number,
),
),
],
),
CustomTextField(
label: "Correo electrónico",
hint: "Correo electrónico",
),
],
);
}
}

View File

@@ -1,134 +0,0 @@
import 'package:auth/src/widgets/layouts/form_step_layout.dart';
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'package:auth/src/features/sign_up/signup_address_screen.dart';
import 'package:auth/src/features/sign_up/signup_personal_screen.dart';
import 'package:auth/src/features/sign_up/signup_user_screen.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:get_it/get_it.dart';
import 'package:navigation/navigation.dart';
import 'account_created_screen.dart';
class SignupScreen extends ConsumerStatefulWidget {
NavigationContract navigationContract;
SignupScreen({super.key, required this.navigationContract});
@override
ConsumerState<SignupScreen> createState() => _SignupScreenState();
}
class _SignupScreenState extends ConsumerState<SignupScreen> {
int currentStep = 0;
bool acceptTerms = false;
@override
Widget build(BuildContext context) {
return getSteps()[currentStep];
}
List<Widget> getSteps() {
final theme = ref.watch(themePortProvider);
return [
FormStepLayout(
title: "Crea tu usuario",
subtitle:
"Con tu email y tu número podremos mantenerte siempre informado",
supertitle: "Usuario y contacto",
currentStep: 1,
numSteps: 3,
body: [SignupPersonalScreen()],
footer: [
Row(
spacing: 16,
children: [
Expanded(
child: SecondaryButton(
onPressed: () => {},
text: "Atrás",
size: 16,
),
),
Expanded(
child: PrimaryButton(
onPressed: () => {
setState(() {
currentStep++;
}),
},
text: "Siguiente",
size: 16,
color: theme.getColorFor(ThemeCode.buttonSecondary),
),
),
],
),
CheckboxListTile(
value: acceptTerms,
onChanged: (_) => setState(() {
acceptTerms = !acceptTerms;
}),
title: Text(
"Acepto los términos y condiciones",
style: TextStyle(fontSize: 16, letterSpacing: 0),
),
checkboxScaleFactor: 1.5,
contentPadding: EdgeInsets.zero,
activeColor: theme.getColorFor(ThemeCode.buttonPrimary),
controlAffinity: ListTileControlAffinity.leading,
),
],
nextStep: () => {
setState(() {
currentStep++;
}),
},
previousStep: () => {},
),
FormStepLayout(
title: "Tu dirección",
subtitle:
"Tu dirección nos ayudará a verificar y mantener la seguridad de tu cuenta",
supertitle: "Domicilio",
currentStep: 2,
numSteps: 3,
body: [SignupAddressScreen()],
nextStep: () => {
setState(() {
currentStep++;
}),
},
previousStep: () => {
setState(() {
currentStep--;
}),
},
),
FormStepLayout(
title: "Identifícate",
subtitle:
"Contraseña mínima de 8 caracteres, con una mayúscula, un número y un carácter especial",
supertitle: "Usuario y contacto",
currentStep: 3,
numSteps: 3,
body: [SignupUserScreen()],
nextStep: () => {
setState(() {
currentStep++;
}),
},
previousStep: () => {
setState(() {
currentStep--;
}),
},
),
AccountCreatedScreen(
navigationContract: widget.navigationContract,
kidAccount: false,
),
];
}
}

View File

@@ -1,33 +0,0 @@
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
class SignupUserScreen extends StatefulWidget{
const SignupUserScreen({super.key});
@override
State<SignupUserScreen> createState() => SignupUserScreenState();
}
class SignupUserScreenState extends State<SignupUserScreen>{
bool passwordVisible=false;
@override
Widget build(BuildContext context) {
return Column(
spacing: 24,
children: [
CustomTextField(
showPassword: passwordVisible,
label: "Contraseña",
hint: "********"
),
CustomTextField(
showPassword: passwordVisible,
label: "Repetir contraseña",
hint: "*******"
),
],
);
}
}

View File

@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
class FormErrorBanner extends StatelessWidget {
final String message;
const FormErrorBanner({super.key, required this.message});
@override
Widget build(BuildContext context) {
if (message.trim().isEmpty) return const SizedBox.shrink();
return Container(
width: double.infinity,
margin: const EdgeInsets.only(bottom: 12),
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.red.withValues(alpha: 0.08),
borderRadius: BorderRadius.circular(12),
border: Border.all(color: Colors.red.withValues(alpha: 0.35)),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Icon(Icons.error_outline, size: 18, color: Colors.red),
const SizedBox(width: 8),
Expanded(
child: Text(
message,
style: const TextStyle(fontSize: 14, height: 1.2),
),
),
],
),
);
}
}

View File

@@ -2,7 +2,7 @@ import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class FormStepLayout extends ConsumerWidget{
class FormStepLayout extends ConsumerWidget {
final int currentStep;
final int numSteps;
final String? supertitle;
@@ -23,7 +23,7 @@ class FormStepLayout extends ConsumerWidget{
required this.body,
this.footer,
required this.nextStep,
required this.previousStep
required this.previousStep,
});
@override
@@ -32,63 +32,101 @@ class FormStepLayout extends ConsumerWidget{
return Scaffold(
backgroundColor: theme.getColorFor(ThemeCode.backgroundPrimary),
body: SafeArea(child: SingleChildScrollView(child: Container(
color: theme.getColorFor(ThemeCode.backgroundPrimary),
padding: EdgeInsets.only(top: 40, left: 24, right: 24),
child: Column(
spacing: 32,
children: [
Column(
spacing: 24,
body: SafeArea(
child: SingleChildScrollView(
child: Container(
color: theme.getColorFor(ThemeCode.backgroundPrimary),
padding: EdgeInsets.only(left: 24, right: 24),
child: Column(
children: [
StepIndicator(
total: numSteps,
current: currentStep,
color: theme.getColorFor(ThemeCode.buttonPrimary)
Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 16),
child: StepIndicator(
total: numSteps,
current: currentStep,
color: theme.getColorFor(ThemeCode.buttonPrimary),
),
),
SizedBox(height: 16),
if (supertitle != null)
Text(
supertitle!,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18),
),
SizedBox(height: 10),
Text(
title,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 16),
if (subtitle != null)
Text(
subtitle!,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18),
),
],
),
if (supertitle!=null) Text(supertitle!, textAlign: TextAlign.center, style: TextStyle(fontSize: 18)),
Text(title, textAlign: TextAlign.center, style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold)),
if (subtitle!=null) Text(subtitle!, textAlign: TextAlign.center, style: TextStyle(fontSize: 18)),
]
),
Column(
spacing: 40,
children: [
...body,
if (footer==null) navigationButtons(currentStep, numSteps, nextStep, previousStep, theme),
...(footer?? [])
]
)
]
)
)))
SizedBox(height: 16),
if (footer == null)
navigationButtons(
currentStep,
numSteps,
nextStep,
previousStep,
theme,
),
...(footer ?? []),
],
),
),
),
),
);
}
Widget navigationButtons(int currentStep, int numSteps, VoidCallback nextStep, VoidCallback previousStep, ThemePort theme) {
if (currentStep == numSteps){
Widget navigationButtons(
int currentStep,
int numSteps,
VoidCallback nextStep,
VoidCallback previousStep,
ThemePort theme,
) {
if (currentStep == numSteps) {
return PrimaryButton(
onPressed: nextStep,
text: "Continuar",
color: theme.getColorFor(ThemeCode.buttonPrimary)
color: theme.getColorFor(ThemeCode.buttonPrimary),
);
} else {
return Row(
spacing: 16,
children: [
Expanded(child: SecondaryButton(
onPressed: previousStep,
text: "Atrás",
size: 16,
)),
Expanded(child: PrimaryButton(
onPressed: nextStep,
text: "Siguiente",
size: 16,
color: theme.getColorFor(ThemeCode.buttonSecondary)
))
]
Expanded(
child: SecondaryButton(
onPressed: previousStep,
text: "Atrás",
size: 16,
),
),
Expanded(
child: PrimaryButton(
onPressed: nextStep,
text: "Siguiente",
size: 16,
color: theme.getColorFor(ThemeCode.buttonSecondary),
),
),
],
);
}
}
}
}

View File

@@ -0,0 +1,114 @@
import 'package:auth/src/widgets/form_error_banner.dart';
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
class SignUpLayout extends StatelessWidget {
final ThemePort theme;
final String title;
final String subtitle;
final String supertitle;
final int currentStep;
final int numSteps;
final Widget body;
final VoidCallback onBackPressed;
final VoidCallback onNextPressed;
final String errorMessage;
const SignUpLayout({
super.key,
required this.theme,
required this.title,
required this.subtitle,
required this.supertitle,
required this.currentStep,
required this.numSteps,
required this.body,
required this.onBackPressed,
required this.onNextPressed,
this.errorMessage = '',
});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: theme.getColorFor(ThemeCode.backgroundPrimary),
body: SafeArea(
child: Container(
color: theme.getColorFor(ThemeCode.backgroundPrimary),
padding: const EdgeInsets.only(left: 24, right: 24),
child: Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 16),
child: StepIndicator(
total: numSteps,
current: currentStep,
color: theme.getColorFor(ThemeCode.buttonPrimary),
),
),
const SizedBox(height: 8),
Text(
supertitle,
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 18),
),
const SizedBox(height: 10),
Text(
title,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 30,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 16),
Text(
subtitle,
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 18),
),
const SizedBox(height: 16),
Expanded(
child: SingleChildScrollView(
padding: const EdgeInsets.only(bottom: 16),
child: Column(
children: [
FormErrorBanner(message: errorMessage),
body,
],
),
),
),
Row(
spacing: 16,
children: [
Expanded(
child: SecondaryButton(
onPressed: onBackPressed,
text: "Atrás",
size: 16,
),
),
Expanded(
child: PrimaryButton(
onPressed: onNextPressed,
text: "Siguiente",
size: 16,
color: theme.getColorFor(ThemeCode.buttonSecondary),
),
),
],
),
const SizedBox(height: 12),
],
),
),
),
);
}
}

View File

@@ -0,0 +1 @@

View File

@@ -33,6 +33,9 @@ dependencies:
freezed: ^3.2.3
dio: ^5.9.0
country_code_picker: ^3.4.1
json_annotation: ^4.9.0
json_serializable: ^6.11.2
uuid: ^4.5.2
dev_dependencies:
flutter_test:

View File

@@ -3,7 +3,9 @@ import 'package:flutter/material.dart';
class CustomDropdown extends StatelessWidget {
final List<Widget> items;
final List<dynamic>? values;
final ValueChanged<dynamic> onChanged;
final dynamic value;
final String? hint;
final String? label;
@@ -28,10 +30,15 @@ class CustomDropdown extends StatelessWidget {
@override
Widget build(BuildContext context) {
final borderColor = color ?? const Color(0xFF4B4B4B);
OutlineInputBorder border(Color c) => OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(radius)),
borderSide: BorderSide(color: c),
);
return Column(
spacing: 8,
children: [
if (label != null)
if (label != null) ...[
Align(
alignment: Alignment.bottomLeft,
child: Text(
@@ -39,6 +46,8 @@ class CustomDropdown extends StatelessWidget {
style: const TextStyle(fontSize: 14, letterSpacing: 0),
),
),
const SizedBox(height: 8),
],
SizedBox(
width: width,
height: height,
@@ -46,15 +55,21 @@ class CustomDropdown extends StatelessWidget {
child: DropdownButtonFormField<dynamic>(
dropdownColor: Colors.white,
decoration: InputDecoration(
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(radius)),
borderSide: BorderSide(
color: color ?? const Color(0xFF4B4B4B),
),
enabledBorder: border(borderColor),
focusedBorder: border(borderColor),
disabledBorder: border(borderColor),
errorBorder: border(borderColor),
focusedErrorBorder: border(borderColor),
contentPadding: const EdgeInsets.symmetric(
horizontal: 12,
vertical: 16,
),
),
initialValue: value,
onChanged: onChanged,
hint: hint != null ? Text(hint!) : null,
items: List<DropdownMenuItem<dynamic>>.generate(items.length, (
int index,