diff --git a/lib/blocs/auth_bloc/auth_bloc.dart b/lib/blocs/auth_bloc/auth_bloc.dart index eb3a831..e075453 100644 --- a/lib/blocs/auth_bloc/auth_bloc.dart +++ b/lib/blocs/auth_bloc/auth_bloc.dart @@ -52,7 +52,19 @@ class AuthBloc extends Bloc { AuthEventAddEmailAndPassword event, Emitter emit) async { emit(AuthStateProcess()); try { - await _userRepository.addEmailAndPassword(event.email, event.password); + final String? error = await _userRepository.addEmailAndPassword( + event.email, event.password); + if (error == null) { + emit(AuthStateSuccess()); + } else { + if (error == 'requires-recent-login') { + emit(AuthStateRequiresRecentLogin()); + } else if (error == 'email-already-in-use') { + emit(AuthStateEmailAlreadyInUse()); + } else { + emit(const AuthStateFailure()); + } + } } catch (e) { emit(const AuthStateFailure()); } diff --git a/lib/blocs/auth_bloc/auth_state.dart b/lib/blocs/auth_bloc/auth_state.dart index 249d30b..b610f3d 100644 --- a/lib/blocs/auth_bloc/auth_state.dart +++ b/lib/blocs/auth_bloc/auth_state.dart @@ -19,6 +19,10 @@ class AuthStateVerifyOAuth extends AuthState { class AuthStateSuccess extends AuthState {} +class AuthStateRequiresRecentLogin extends AuthState {} + +class AuthStateEmailAlreadyInUse extends AuthState {} + class AuthStateFailure extends AuthState { final String? message; diff --git a/lib/components/general_primary_button.dart b/lib/components/general_primary_button.dart index 4380287..1b664d4 100644 --- a/lib/components/general_primary_button.dart +++ b/lib/components/general_primary_button.dart @@ -18,10 +18,10 @@ class GeneralPrimaryButton extends StatelessWidget { onPressed: isEnabled ? onPressed : null, style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.primary, - elevation: 0, + elevation: 5, minimumSize: Size( MediaQuery.of(context).size.width * 0.5, - 50, + 55, ), shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(50)), @@ -32,7 +32,7 @@ class GeneralPrimaryButton extends StatelessWidget { style: TextStyle( color: isEnabled ? Colors.white : Colors.black, fontWeight: FontWeight.bold, - fontSize: 16, + fontSize: 18, ), ), ); diff --git a/lib/screens/authentication/otp_auth_screen.dart b/lib/screens/authentication/otp_auth_screen.dart index 2566569..b109ac0 100644 --- a/lib/screens/authentication/otp_auth_screen.dart +++ b/lib/screens/authentication/otp_auth_screen.dart @@ -1,10 +1,9 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_otp_text_field/flutter_otp_text_field.dart'; import 'package:injector/injector.dart'; import 'package:prosappco/blocs/auth_bloc/auth_bloc.dart'; +import 'package:prosappco/components/general_primary_button.dart'; class OtpAuthScreen extends StatefulWidget { final String phoneNumber; @@ -16,87 +15,67 @@ class OtpAuthScreen extends StatefulWidget { } class _OtpAuthScreenState extends State { - bool _isRequestSent = false; + late final AuthBloc authBloc; + + @override + void initState() { + super.initState(); + authBloc = Injector.appInstance.get(); + authBloc.add(AuthEventLoginOAuth(phone: widget.phoneNumber)); + } @override Widget build(BuildContext context) { - final authBloc = Injector.appInstance.get(); - - if (!_isRequestSent) { - authBloc.add(AuthEventLoginOAuth(phone: widget.phoneNumber)); - _isRequestSent = true; - } - return BlocProvider( create: (context) => authBloc, child: BlocConsumer( listener: (context, state) { if (state is AuthStateSuccess) { Navigator.of(context).pop(); - } - if (state is AuthStateVerifyOAuth) { - if (state.isWrongCode) { - ScaffoldMessenger.of(context).showSnackBar(const SnackBar( - content: Text('El Código es incorrecto'), - )); - } + } else if (state is AuthStateVerifyOAuth && state.isWrongCode) { + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('El Código es incorrecto'), + )); } }, builder: (context, state) { return Scaffold( - body: Column(children: [ - getContent(state, authBloc: authBloc), - ]), + appBar: AppBar( + title: const Text('Verificación de código'), + ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: MediaQuery.of(context).size.height * 0.1), + const Text('Te enviaremos un Código de verificación a'), + Text( + widget.phoneNumber, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 20), + OtpTextField( + numberOfFields: 6, + borderColor: const Color(0xFF512DA8), + showFieldAsBox: true, + onCodeChanged: (String code) {}, + onSubmit: (String verificationCode) { + authBloc.add(AuthEventVerifyOAuth(code: verificationCode)); + }, + ), + Expanded(child: Container()), + GeneralPrimaryButton( + onPressed: () {}, + label: 'Continuar', + ), + const SizedBox(height: 20), + ], + ), ); }, ), ); } - - Widget getContent(AuthState state, {required AuthBloc authBloc}) { - if (state is AuthStateInitial) { - return const Text('Inicio'); - } else if (state is AuthStateProcess) { - return Center( - child: Column( - children: [ - Text('${widget.phoneNumber} - $_isRequestSent'), - OtpTextField( - numberOfFields: 6, - borderColor: const Color(0xFF512DA8), - showFieldAsBox: true, - onCodeChanged: (String code) {}, - onSubmit: (String verificationCode) { - authBloc.add(AuthEventVerifyOAuth(code: verificationCode)); - }, // end onSubmit - ), - ], - ), - ); - } else if (state is AuthStateVerifyOAuth) { - return Center( - child: Column( - children: [ - Text('${widget.phoneNumber} - $_isRequestSent'), - state.isWrongCode ? const Text('❌') : const Text(''), - OtpTextField( - numberOfFields: 6, - borderColor: const Color(0xFF512DA8), - showFieldAsBox: true, - onCodeChanged: (String code) {}, - onSubmit: (String verificationCode) { - authBloc.add(AuthEventVerifyOAuth(code: verificationCode)); - }, // end onSubmit - ), - ], - ), - ); - } else if (state is AuthStateSuccess) { - return const CircularProgressIndicator(); - } else if (state is AuthStateFailure) { - return const Text('❌'); - } else { - return const CircularProgressIndicator(); - } - } } diff --git a/lib/screens/authentication/sign_up_screen.dart b/lib/screens/authentication/sign_up_screen.dart index 2004305..e9baaef 100644 --- a/lib/screens/authentication/sign_up_screen.dart +++ b/lib/screens/authentication/sign_up_screen.dart @@ -246,7 +246,7 @@ class _SignUpScreenState extends State { return 'Name too long'; } return null; - }), + },), ), SizedBox(height: MediaQuery.of(context).size.height * 0.02), !signUpRequired diff --git a/lib/screens/profile/components/profile_item.dart b/lib/screens/profile/components/profile_item.dart index dc4b3bb..8b8c0db 100644 --- a/lib/screens/profile/components/profile_item.dart +++ b/lib/screens/profile/components/profile_item.dart @@ -27,7 +27,7 @@ class ProfileItem extends StatelessWidget { title, style: const TextStyle(color: Colors.black), ), - subtitle: subtitle == null + subtitle: subtitle == null || subtitle!.isEmpty ? null : Text( subtitle ?? '', diff --git a/lib/screens/profile/profile_email_screen.dart b/lib/screens/profile/profile_email_screen.dart index ca09d06..e4ee89b 100644 --- a/lib/screens/profile/profile_email_screen.dart +++ b/lib/screens/profile/profile_email_screen.dart @@ -1,6 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:injector/injector.dart'; +import 'package:prosappco/blocs/auth_bloc/auth_bloc.dart'; import 'package:prosappco/blocs/my_user_bloc/my_user_bloc.dart'; +import 'package:prosappco/components/general_primary_button.dart'; +import 'package:prosappco/screens/authentication/sign_in_screen.dart'; class ProfileEmailScreen extends StatefulWidget { const ProfileEmailScreen({super.key}); @@ -13,6 +17,14 @@ class _ProfileEmailScreenState extends State { final TextEditingController _emailController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); + late final AuthBloc authBloc; + + @override + void initState() { + super.initState(); + authBloc = Injector.appInstance.get(); + } + @override void dispose() { _emailController.dispose(); @@ -20,118 +32,153 @@ class _ProfileEmailScreenState extends State { super.dispose(); } - @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (state.status == MyUserStatus.success) { - _emailController.text = state.user!.email ?? ''; - - return Scaffold( - appBar: AppBar( - title: Text( - _emailController.text.isEmpty - ? 'Agregar correo' - : 'Actualizar correo', - ), + void _showLoginModal(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Requiere inicio de sesión reciente'), + content: const Text('Por favor, inicie sesión nuevamente para continuar.'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('OK'), ), - body: Center( - // Centro del contenido - child: SingleChildScrollView( - child: Padding( - padding: - const EdgeInsets.symmetric(horizontal: 40, vertical: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - TextFormField( - controller: _emailController, - decoration: const InputDecoration( - labelText: 'Email', - prefixIcon: Icon(Icons.email_rounded), - hintText: 'Email', - border: OutlineInputBorder( - borderRadius: BorderRadius.all( - Radius.circular(10.0), - )), - errorBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.red), - ), - focusedErrorBorder: OutlineInputBorder( - borderSide: - BorderSide(color: Colors.red, width: 2.0), - ), - ), - validator: (value) { - if (value == null || value.isEmpty) { - return 'Por favor, ingrese su contraseña'; - } - return null; - }, - ), - const SizedBox(height: 20), - TextFormField( - controller: _passwordController, - obscureText: true, - decoration: const InputDecoration( - labelText: 'Contraseña', - prefixIcon: Icon(Icons.lock_rounded), - hintText: 'Contraseña', - border: OutlineInputBorder( - borderRadius: BorderRadius.all( - Radius.circular(10.0), - )), - errorBorder: OutlineInputBorder( - borderSide: BorderSide(color: Colors.red), - ), - focusedErrorBorder: OutlineInputBorder( - borderSide: - BorderSide(color: Colors.red, width: 2.0), - ), - ), - validator: (value) { - if (value == null || value.isEmpty) { - return 'Por favor, ingrese su contraseña'; - } - return null; - }, - ), - const SizedBox(height: 30), - ElevatedButton( - onPressed: () {}, - style: ElevatedButton.styleFrom( - backgroundColor: Colors.blue, - padding: const EdgeInsets.symmetric(vertical: 5), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), - ), - shadowColor: Colors.grey, - elevation: 5, - ), - child: Container( - constraints: const BoxConstraints( - maxWidth: 300.0, minHeight: 50.0), - alignment: Alignment.center, - child: const Text( - 'Actualizar', - style: TextStyle( - color: Colors.white, - fontSize: 18, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ], - ), - ), - ), - ), - ); - } else { - return const Center(child: CircularProgressIndicator()); - } + ], + ); }, ); } + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => authBloc, + child: BlocListener( + listener: (context, state) { + if (state is AuthStateSuccess) { + Navigator.of(context).pop(); + } + + if (state is AuthStateEmailAlreadyInUse) { + ScaffoldMessenger.of(context).showSnackBar(const SnackBar( + content: Text('El correo ya existe'), + )); + } + if (state is AuthStateRequiresRecentLogin) { + _showLoginModal(context); + } + }, + child: BlocBuilder( + builder: (context, state) { + if (state.status == MyUserStatus.success) { + _emailController.text = state.user!.email ?? ''; + + return Scaffold( + appBar: AppBar( + title: Text( + _emailController.text.isEmpty + ? 'Agregar correo' + : 'Actualizar correo', + ), + ), + body: Center( + // Centro del contenido + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 40, vertical: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + TextFormField( + controller: _emailController, + decoration: const InputDecoration( + labelText: 'Email', + prefixIcon: Icon(Icons.email_rounded), + hintText: 'Email', + border: OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(10.0), + )), + errorBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.red), + ), + focusedErrorBorder: OutlineInputBorder( + borderSide: + BorderSide(color: Colors.red, width: 2.0), + ), + ), + validator: (value) { + if (value == null || value.isEmpty) { + return 'Por favor, ingrese su contraseña'; + } + return null; + }, + ), + const SizedBox(height: 20), + TextFormField( + controller: _passwordController, + obscureText: true, + decoration: const InputDecoration( + labelText: 'Contraseña', + prefixIcon: Icon(Icons.lock_rounded), + hintText: 'Contraseña', + border: OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(10.0), + )), + errorBorder: OutlineInputBorder( + borderSide: BorderSide(color: Colors.red), + ), + focusedErrorBorder: OutlineInputBorder( + borderSide: + BorderSide(color: Colors.red, width: 2.0), + ), + ), + validator: (value) { + if (value == null || value.isEmpty) { + return 'Por favor, ingrese su contraseña'; + } + return null; + }, + ), + const SizedBox(height: 30), + GeneralPrimaryButton( + onPressed: () { + if (_emailController.text.isEmpty) { + return; + } + + if (_passwordController.text.isEmpty) { + return; + } + + context.read().add( + AuthEventAddEmailAndPassword( + email: _emailController.text, + password: _passwordController.text, + ), + ); + }, + label: _emailController.text.isEmpty + ? 'Registrar' + : 'Actualizar', + ), + ], + ), + ), + ), + ), + ); + } else { + return const Center(child: CircularProgressIndicator()); + } + }, + ), + ), + ); + } } diff --git a/lib/screens/profile/profile_screen.dart b/lib/screens/profile/profile_screen.dart index 7494692..a07fb82 100644 --- a/lib/screens/profile/profile_screen.dart +++ b/lib/screens/profile/profile_screen.dart @@ -33,9 +33,13 @@ class _ProfileScreenState extends State { XFile? _imageFile; bool isLoading = false; - bool enableLoginWithEmail = false; - bool obscurePassword = true; - IconData iconPassword = CupertinoIcons.eye_fill; + late final AuthBloc authBloc; + + @override + void initState() { + super.initState(); + authBloc = Injector.appInstance.get(); + } @override void dispose() { @@ -52,8 +56,6 @@ class _ProfileScreenState extends State { @override Widget build(BuildContext context) { - final authBloc = Injector.appInstance.get(); - return BlocProvider( create: (context) => authBloc, child: BlocListener( @@ -125,12 +127,42 @@ class _ProfileScreenState extends State { return null; }, ), + _birthdayController.text.isEmpty && + _genderController.text.isEmpty + ? Column( + children: [ + const SizedBox(height: 20.0), + BirthdayPicker( + onDateSelected: (birthDay) { + _birthdayController.text = + DateFormat('dd/MM/yyyy') + .format(birthDay); + }, + controller: _birthdayController, + ), + const SizedBox(height: 20.0), + GenderDropdown( + controller: _genderController, + ), + ], + ) + : const SizedBox(), const SizedBox(height: 20), ProfileItem( title: 'Iniciar sesión con correo', subtitle: _emailController.text, leading: Icons.email_rounded, onTap: () { + if (state.user!.name == null || + state.user!.name == '') { + ScaffoldMessenger.of(context) + .showSnackBar(const SnackBar( + content: Text('Por favor, ingrese su nombre'), + )); + + return; + } + Navigator.push( context, CupertinoPageRoute( @@ -155,234 +187,6 @@ class _ProfileScreenState extends State { ); }, ), - - // Column( - // children: [ - // const SizedBox(height: 20.0), - // TextFormField( - // readOnly: true, - // controller: _emailController, - // decoration: const InputDecoration( - // labelText: 'Email', - // prefixIcon: Icon(Icons.email_rounded), - // hintText: 'Email', - // border: OutlineInputBorder( - // borderRadius: BorderRadius.all( - // Radius.circular(10.0), - // )), - // errorBorder: OutlineInputBorder( - // borderSide: BorderSide(color: Colors.red), - // ), - // focusedErrorBorder: OutlineInputBorder( - // borderSide: BorderSide( - // color: Colors.red, width: 2.0), - // ), - // ), - // ), - // ], - // ), - // const SizedBox(height: 20.0), - // TextFormField( - // readOnly: true, - // controller: _phoneController, - // decoration: const InputDecoration( - // labelText: 'Número de Teléfono', - // prefixIcon: Icon(Icons.phone_android_rounded), - // hintText: '+57', - // border: OutlineInputBorder( - // borderRadius: BorderRadius.all( - // Radius.circular(10.0), - // )), - // errorBorder: OutlineInputBorder( - // borderSide: BorderSide(color: Colors.red), - // ), - // focusedErrorBorder: OutlineInputBorder( - // borderSide: - // BorderSide(color: Colors.red, width: 2.0), - // ), - // ), - // ), - // _emailController.text.isEmpty - // ? Column( - // children: [ - // const SizedBox(height: 20.0), - // GeneralCheckbox( - // text: - // 'Habilitar inicio de sesión con correo (Opcional)', - // initialValue: enableLoginWithEmail, - // onChanged: (value) { - // setState(() { - // enableLoginWithEmail = value; - // }); - // }, - // ), - // enableLoginWithEmail - // ? Container( - // decoration: BoxDecoration( - // border: Border.all( - // color: Colors.blue, - // width: 0.5, - // ), - // borderRadius: - // BorderRadius.circular(10), - // ), - // padding: const EdgeInsets.all(10), - // child: Column( - // children: [ - // TextFormField( - // controller: - // _newEmailController, - // validator: (String? value) { - // if (enableLoginWithEmail) { - // if (value == null || - // value.isEmpty) { - // return 'Por favor ingrese un email'; - // } - // final RegExp - // emailRegExp = - // RegExp( - // r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); - // if (!emailRegExp - // .hasMatch(value)) { - // return 'Por favor ingrese un email válido'; - // } - // return null; - // } else { - // return null; - // } - // }, - // decoration: - // const InputDecoration( - // prefixIcon: Icon( - // Icons.email_rounded), - // hintText: 'Email', - // ), - // ), - // const SizedBox(height: 20.0), - // TextFormField( - // controller: - // _passwordController, - // obscureText: - // obscurePassword, - // validator: (value) { - // if (enableLoginWithEmail) { - // if (value == null || - // value.isEmpty) { - // return 'Por favor ingrese una contraseña.'; - // } - // if (value.length < 5) { - // return 'Debe tener al menos 5 caracteres.'; - // } - // return null; - // } else { - // return null; - // } - // }, - // decoration: InputDecoration( - // prefixIcon: const Icon( - // Icons.lock_rounded), - // suffixIcon: IconButton( - // onPressed: () { - // setState(() { - // obscurePassword = - // !obscurePassword; - // if (obscurePassword) { - // iconPassword = - // CupertinoIcons - // .eye_fill; - // } else { - // iconPassword = - // CupertinoIcons - // .eye_slash_fill; - // } - // }); - // }, - // icon: Icon(iconPassword, - // color: Colors - // .grey[600]), - // ), - // hintText: 'Contraseña', - // ), - // ), - // const SizedBox(height: 20), - // Container( - // margin: - // const EdgeInsets.only( - // left: 5, - // right: 5, - // top: 5, - // bottom: 5, - // ), - // padding: const EdgeInsets - // .symmetric( - // horizontal: 10, - // vertical: 8, - // ), - // decoration: BoxDecoration( - // color: const Color( - // 0xFFD6F4FF), - // borderRadius: - // BorderRadius.circular( - // 20), - // boxShadow: [ - // BoxShadow( - // color: Colors.grey - // .withOpacity(0.5), - // spreadRadius: 1, - // blurRadius: 5, - // offset: const Offset( - // 1, 3), - // ), - // ], - // ), - // child: const Row( - // children: [ - // Icon( - // Icons.error_outline, - // size: 20, - // color: Colors.black54, - // ), - // SizedBox(width: 10), - // Expanded( - // child: Text( - // 'Al habilitar el inicio de sesión con correo, se cerrara la sesión actual.', - // style: TextStyle( - // color: Colors - // .black54, - // fontSize: 13, - // ), - // ), - // ), - // ], - // ), - // ) - // ], - // ), - // ) - // : const SizedBox(), - // ], - // ) - // : const SizedBox(), - _birthdayController.text.isEmpty && - _genderController.text.isEmpty - ? Column( - children: [ - const SizedBox(height: 20.0), - BirthdayPicker( - onDateSelected: (birthDay) { - _birthdayController.text = - DateFormat('dd/MM/yyyy') - .format(birthDay); - }, - controller: _birthdayController, - ), - const SizedBox(height: 20.0), - GenderDropdown( - controller: _genderController, - ), - ], - ) - : const SizedBox(), const SizedBox(height: 60.0), saveButton(state, context), ], @@ -406,24 +210,24 @@ class _ProfileScreenState extends State { return; } - if (enableLoginWithEmail) { - if (_newEmailController.text.isEmpty) { - return; - } + // if (enableLoginWithEmail) { + // if (_newEmailController.text.isEmpty) { + // return; + // } - if (_passwordController.text.isEmpty) { - return; - } + // if (_passwordController.text.isEmpty) { + // return; + // } - context.read().add( - AuthEventAddEmailAndPassword( - email: _newEmailController.text, - password: _passwordController.text, - ), - ); + // context.read().add( + // AuthEventAddEmailAndPassword( + // email: _newEmailController.text, + // password: _passwordController.text, + // ), + // ); - _emailController.text = _newEmailController.text; - } + // _emailController.text = _newEmailController.text; + // } final myUser = state.user!.copyWith( name: _nameController.text, @@ -447,10 +251,10 @@ class _ProfileScreenState extends State { backgroundColor: Colors.blue, padding: const EdgeInsets.symmetric(vertical: 5), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(20), + borderRadius: BorderRadius.circular(50), ), shadowColor: Colors.grey, - elevation: 5, + // elevation: 0, ), child: Container( constraints: const BoxConstraints(maxWidth: 300.0, minHeight: 50.0), @@ -463,7 +267,7 @@ class _ProfileScreenState extends State { 'Actualizar', style: TextStyle( color: Colors.white, - fontSize: 18, + fontSize: 16, fontWeight: FontWeight.bold, ), ), diff --git a/packages/user_repository/lib/src/repositories/firebase_user_repository.dart b/packages/user_repository/lib/src/repositories/firebase_user_repository.dart index 2b3e792..9ff29e2 100644 --- a/packages/user_repository/lib/src/repositories/firebase_user_repository.dart +++ b/packages/user_repository/lib/src/repositories/firebase_user_repository.dart @@ -76,7 +76,6 @@ class FirebaseUserRepository implements UserRepository { return _firebaseAuth.userChanges().map((event) => null != event); } - // Sign up @override Future signUp(MyUser myUser, String password) async { try { @@ -95,7 +94,6 @@ class FirebaseUserRepository implements UserRepository { } } - // Sign in with phone number @override Future signInWithPhoneNumber(String phoneNumber) async { try { @@ -150,7 +148,6 @@ class FirebaseUserRepository implements UserRepository { } } - // Sign in @override Future signIn(String email, String password) async { try { @@ -164,22 +161,23 @@ class FirebaseUserRepository implements UserRepository { } } - // Add email and password to user authenticate with phone @override - Future addEmailAndPassword(String email, String password) async { + Future addEmailAndPassword(String email, String password) async { try { await _firebaseAuth.currentUser!.updateEmail(email); await _firebaseAuth.currentUser!.updatePassword(password); - return true; + return null; } catch (e) { - log('xd -- Error add email and password ${e.toString()}'); + if (e is FirebaseAuthException && e.code == 'requires-recent-login') { + return 'requires-recent-login'; + } - if (e is FirebaseAuthException && e.code == 'requires-recent-login') {} + if (e is FirebaseAuthException && e.code == 'email-already-in-use') { + return 'email-already-in-use'; + } - if (e is FirebaseAuthException && e.code == 'email-already-in-use') {} - - return false; + return 'unknown-error'; } } @@ -194,7 +192,6 @@ class FirebaseUserRepository implements UserRepository { } } - // Reset password @override Future resetPassword(String email) async { try { @@ -205,7 +202,6 @@ class FirebaseUserRepository implements UserRepository { } } - // Set user data @override Future setUserData(MyUser user) async { try { @@ -216,7 +212,6 @@ class FirebaseUserRepository implements UserRepository { } } - // Get user data @override Future getMyUser(String myUserId) async { try { diff --git a/packages/user_repository/lib/src/repositories/user_repo.dart b/packages/user_repository/lib/src/repositories/user_repo.dart index 5788a7b..e994e87 100644 --- a/packages/user_repository/lib/src/repositories/user_repo.dart +++ b/packages/user_repository/lib/src/repositories/user_repo.dart @@ -1,17 +1,15 @@ import '../../user_repository.dart'; abstract class UserRepository { - // Stream get user; Stream streamUser(); Stream isAuthenticated(); Future signIn(String email, String password); - Future addEmailAndPassword(String email, String password); + Future addEmailAndPassword(String email, String password); Future logOut(); - // Future signUp(String name, String email, String password); Future signUp(MyUser myUser, String password); Future signInWithPhoneNumber(String phoneNumber);