diff --git a/lib/app.dart b/lib/app.dart index b493553..5b3e67d 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -3,9 +3,9 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:injector/injector.dart'; import 'package:prosappco/blocs/authentication_bloc/authentication_bloc.dart'; import 'package:prosappco/blocs/my_user_bloc/my_user_bloc.dart'; +import 'package:prosappco/blocs/profile_bloc/profile_bloc.dart'; import 'package:prosappco/blocs/sign_up_bloc/sign_up_bloc.dart'; import 'package:prosappco/blocs/sing_in_bloc/sign_in_bloc.dart'; -import 'package:prosappco/blocs/update_user_info_bloc/update_user_info_bloc.dart'; import 'app_view.dart'; @@ -22,15 +22,9 @@ class MainApp extends StatelessWidget { BlocProvider( create: (context) => Injector.appInstance.get(), ), - BlocProvider( - create: (context) => Injector.appInstance.get(), + BlocProvider( + create: (context) => Injector.appInstance.get(), ), - // BlocProvider( - // create: (context) => Injector.appInstance.get(), - // ), - // BlocProvider( - // create: (context) => Injector.appInstance.get(), - // ), ], child: BlocBuilder( builder: (context, state) { diff --git a/lib/blocs/update_user_info_bloc/update_user_info_bloc.dart b/lib/blocs/profile_bloc/profile_bloc.dart similarity index 69% rename from lib/blocs/update_user_info_bloc/update_user_info_bloc.dart rename to lib/blocs/profile_bloc/profile_bloc.dart index aad3e15..b9262c6 100644 --- a/lib/blocs/update_user_info_bloc/update_user_info_bloc.dart +++ b/lib/blocs/profile_bloc/profile_bloc.dart @@ -2,22 +2,20 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:user_repository/user_repository.dart'; -part 'update_user_info_event.dart'; -part 'update_user_info_state.dart'; +part 'profile_event.dart'; +part 'profile_state.dart'; -class UpdateUserInfoBloc - extends Bloc { +class ProfileBloc extends Bloc { final UserRepository _userRepository; - UpdateUserInfoBloc({required UserRepository userRepository}) + ProfileBloc({required UserRepository userRepository}) : _userRepository = userRepository, super(UpdateUserInfoInitial()) { on(_onUploadPicture); on(_onUpdateUserInfo); } - void _onUploadPicture( - UploadPicture event, Emitter emit) async { + void _onUploadPicture(UploadPicture event, Emitter emit) async { emit(UploadPictureLoading()); try { String userImage = @@ -29,7 +27,7 @@ class UpdateUserInfoBloc } void _onUpdateUserInfo( - UpdateUserInfo event, Emitter emit) async { + UpdateUserInfo event, Emitter emit) async { emit(UpdateUserInfoLoading()); try { await _userRepository.updateUserInfo(event.userId, { diff --git a/lib/blocs/update_user_info_bloc/update_user_info_event.dart b/lib/blocs/profile_bloc/profile_event.dart similarity index 61% rename from lib/blocs/update_user_info_bloc/update_user_info_event.dart rename to lib/blocs/profile_bloc/profile_event.dart index 1ceff1c..0579ff5 100644 --- a/lib/blocs/update_user_info_bloc/update_user_info_event.dart +++ b/lib/blocs/profile_bloc/profile_event.dart @@ -1,13 +1,13 @@ -part of 'update_user_info_bloc.dart'; +part of 'profile_bloc.dart'; -abstract class UpdateUserInfoEvent extends Equatable { - const UpdateUserInfoEvent(); +abstract class ProfileEvent extends Equatable { + const ProfileEvent(); @override List get props => []; } -class UploadPicture extends UpdateUserInfoEvent { +class UploadPicture extends ProfileEvent { final String file; final String userId; @@ -17,7 +17,7 @@ class UploadPicture extends UpdateUserInfoEvent { List get props => [file, userId]; } -class UpdateUserInfo extends UpdateUserInfoEvent { +class UpdateUserInfo extends ProfileEvent { final String userId; final String name; diff --git a/lib/blocs/profile_bloc/profile_state.dart b/lib/blocs/profile_bloc/profile_state.dart new file mode 100644 index 0000000..edc0c1d --- /dev/null +++ b/lib/blocs/profile_bloc/profile_state.dart @@ -0,0 +1,34 @@ +part of 'profile_bloc.dart'; + +abstract class ProfileState extends Equatable { + const ProfileState(); + + @override + List get props => []; +} + +class UpdateUserInfoInitial extends ProfileState {} + +class UploadPictureFailure extends ProfileState {} + +class UploadPictureLoading extends ProfileState {} + +class UploadPictureSuccess extends ProfileState { + final String userImage; + + const UploadPictureSuccess(this.userImage); + + @override + List get props => [userImage]; +} + +class UpdateUserInfoFailure extends ProfileState {} + +class UpdateUserInfoLoading extends ProfileState {} + +class UpdateUserInfoSuccess extends ProfileState { + const UpdateUserInfoSuccess(); + + @override + List get props => []; +} diff --git a/lib/blocs/setting_bloc/setting_bloc.dart b/lib/blocs/setting_bloc/setting_bloc.dart new file mode 100644 index 0000000..d7caa08 --- /dev/null +++ b/lib/blocs/setting_bloc/setting_bloc.dart @@ -0,0 +1,41 @@ +import 'dart:async'; +import 'dart:developer'; + +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:user_repository/user_repository.dart'; + +part 'setting_event.dart'; +part 'setting_state.dart'; + +class SettingBloc extends Bloc { + final UserRepository _userRepository; + late final StreamSubscription _authSubscription; + + SettingBloc({required UserRepository userRepository}) + : _userRepository = userRepository, + super(SettingInitial()) { + _authSubscription = + _userRepository.isAuthenticated().listen((isAuthenticated) { + if (!isAuthenticated) { + try { + emit(SettingLogoutSuccess()); + } catch (e) { + log('xd Error en el settings bloc ${e.toString()}'); + } + } + }); + on(_onSettingLogoutRequest); + } + + void _onSettingLogoutRequest( + SettingLogoutRequest event, Emitter emit) async { + await _userRepository.logOut(); + } + + @override + Future close() { + _authSubscription.cancel(); + return super.close(); + } +} diff --git a/lib/blocs/setting_bloc/setting_event.dart b/lib/blocs/setting_bloc/setting_event.dart new file mode 100644 index 0000000..8310766 --- /dev/null +++ b/lib/blocs/setting_bloc/setting_event.dart @@ -0,0 +1,10 @@ +part of 'setting_bloc.dart'; + +abstract class SettingEvent extends Equatable { + const SettingEvent(); + + @override + List get props => []; +} + +class SettingLogoutRequest extends SettingEvent {} diff --git a/lib/blocs/setting_bloc/setting_state.dart b/lib/blocs/setting_bloc/setting_state.dart new file mode 100644 index 0000000..bf650f8 --- /dev/null +++ b/lib/blocs/setting_bloc/setting_state.dart @@ -0,0 +1,12 @@ +part of 'setting_bloc.dart'; + +abstract class SettingState extends Equatable { + const SettingState(); + + @override + List get props => []; +} + +class SettingInitial extends SettingState {} + +class SettingLogoutSuccess extends SettingState {} diff --git a/lib/blocs/update_user_info_bloc/update_user_info_state.dart b/lib/blocs/update_user_info_bloc/update_user_info_state.dart deleted file mode 100644 index 128f4a4..0000000 --- a/lib/blocs/update_user_info_bloc/update_user_info_state.dart +++ /dev/null @@ -1,34 +0,0 @@ -part of 'update_user_info_bloc.dart'; - -abstract class UpdateUserInfoState extends Equatable { - const UpdateUserInfoState(); - - @override - List get props => []; -} - -class UpdateUserInfoInitial extends UpdateUserInfoState {} - -class UploadPictureFailure extends UpdateUserInfoState {} - -class UploadPictureLoading extends UpdateUserInfoState {} - -class UploadPictureSuccess extends UpdateUserInfoState { - final String userImage; - - const UploadPictureSuccess(this.userImage); - - @override - List get props => [userImage]; -} - -class UpdateUserInfoFailure extends UpdateUserInfoState {} - -class UpdateUserInfoLoading extends UpdateUserInfoState {} - -class UpdateUserInfoSuccess extends UpdateUserInfoState { - const UpdateUserInfoSuccess(); - - @override - List get props => []; -} diff --git a/lib/dependency_user/user_di.dart b/lib/dependency_user/user_di.dart index e1d2cef..22feab2 100644 --- a/lib/dependency_user/user_di.dart +++ b/lib/dependency_user/user_di.dart @@ -2,9 +2,10 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:injector/injector.dart'; import 'package:prosappco/blocs/authentication_bloc/authentication_bloc.dart'; import 'package:prosappco/blocs/my_user_bloc/my_user_bloc.dart'; +import 'package:prosappco/blocs/profile_bloc/profile_bloc.dart'; +import 'package:prosappco/blocs/setting_bloc/setting_bloc.dart'; import 'package:prosappco/blocs/sign_up_bloc/sign_up_bloc.dart'; import 'package:prosappco/blocs/sing_in_bloc/sign_in_bloc.dart'; -import 'package:prosappco/blocs/update_user_info_bloc/update_user_info_bloc.dart'; import 'package:user_repository/user_repository.dart'; class UserDI { @@ -20,13 +21,16 @@ class UserDI { injector.registerSingleton( (() => MyUserBloc(myUserRepository: injector.get()))); - injector.registerSingleton((() => - UpdateUserInfoBloc(userRepository: injector.get()))); + injector.registerSingleton( + (() => ProfileBloc(userRepository: injector.get()))); injector.registerDependency( (() => SignInBloc(userRepository: injector.get()))); injector.registerDependency( (() => SignUpBloc(userRepository: injector.get()))); + + injector.registerDependency( + (() => SettingBloc(userRepository: injector.get()))); } } diff --git a/lib/screens/authentication/sign_screen.dart b/lib/screens/authentication/sign_screen.dart index 74c3dfa..79a6f9c 100644 --- a/lib/screens/authentication/sign_screen.dart +++ b/lib/screens/authentication/sign_screen.dart @@ -10,7 +10,7 @@ import 'package:prosappco/screens/authentication/sign_up_screen.dart'; class SignScreen extends StatefulWidget { final int initialIndex; - SignScreen({super.key, required this.initialIndex}); + const SignScreen({super.key, required this.initialIndex}); @override State createState() => _SignScreenState(); @@ -48,19 +48,22 @@ class _SignScreenState extends State with TickerProviderStateMixin { color: Theme.of(context).colorScheme.tertiary, child: Column( children: [ - Center( - child: Image( - width: width * 0.7, - image: AssetImage('images/logo_prosapp.png'), + Container( + color: Theme.of(context).colorScheme.tertiary, + padding: const EdgeInsets.only(bottom: 20.0), + child: Center( + child: Image( + width: width * 0.7, + image: const AssetImage('images/logo_prosapp.png'), + ), ), ), - SizedBox(height: 20), TabBar( controller: tabController, unselectedLabelColor: Theme.of(context).colorScheme.onBackground, labelColor: Theme.of(context).colorScheme.onBackground, - tabs: [ + tabs: const [ Padding( padding: EdgeInsets.all(12.0), child: Text( @@ -102,20 +105,6 @@ class _SignScreenState extends State with TickerProviderStateMixin { Injector.appInstance.get(), child: SignUpScreen(), ), - // BlocProvider( - // create: (context) => SignInBloc( - // userRepository: context - // .read() - // .userRepository), - // child: SignInScreen(), - // ), - // BlocProvider( - // create: (context) => SignUpBloc( - // userRepository: context - // .read() - // .userRepository), - // child: SignUpScreen(), - // ), ]), ) ], diff --git a/lib/screens/authentication/welcome_screen.dart b/lib/screens/authentication/welcome_screen.dart index e664995..f54ce95 100644 --- a/lib/screens/authentication/welcome_screen.dart +++ b/lib/screens/authentication/welcome_screen.dart @@ -6,124 +6,312 @@ import 'package:intl_phone_field/intl_phone_field.dart'; import 'package:prosappco/screens/authentication/sign_screen.dart'; class WelcomeScreen extends StatelessWidget { - const WelcomeScreen({super.key}); + const WelcomeScreen({Key? key}); @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; return Scaffold( - backgroundColor: Theme.of(context).colorScheme.surface, + backgroundColor: Theme.of(context).colorScheme.tertiary, body: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - color: Theme.of(context).colorScheme.tertiary, - child: Column( - children: [ - const SizedBox(height: 20), - Center( - child: Image( - width: width * 0.7, - image: const AssetImage('images/logo_prosapp.png'), - ), - ), - const SizedBox(height: 20), - ], - ), - ), - SizedBox( - width: double.infinity, - child: Text( - 'Iniciar sesión', - style: TextStyle( - // fontSize: 30, - fontSize: width * 0.08, - fontWeight: FontWeight.bold, + Padding( + padding: const EdgeInsets.symmetric(vertical: 20), + child: Center( + child: Image( + width: width * 0.7, + image: const AssetImage('images/logo_prosapp.png'), ), ), ), Expanded( - child: SingleChildScrollView( - child: Column( - children: [ - const SizedBox(height: 10), - SizedBox( - width: double.infinity, - child: Text( - 'Numero de celular', - style: TextStyle( - fontSize: width * 0.045, - color: Theme.of(context).colorScheme.onBackground, - ), - ), - ), - Form( - child: IntlPhoneField( - initialCountryCode: 'CO', - keyboardType: TextInputType.number, - inputFormatters: [FilteringTextInputFormatter.digitsOnly], - ), - ), - Text( - 'Un código será enviado a este numero de celular.', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 13.0, - color: Theme.of(context).colorScheme.onBackground, - ), - ), - TextButton( - onPressed: () { - Navigator.push( - context, - CupertinoPageRoute( - builder: (context) => SignScreen(initialIndex: 0), + child: Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(60), + topRight: Radius.circular(60), + ), + ), + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 30, vertical: 15), + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox( + width: double.infinity, + child: Text( + 'Iniciar sesión', + style: TextStyle( + // fontSize: 30, + fontSize: width * 0.08, + fontWeight: FontWeight.bold, + ), ), - ); - }, - child: Text( - 'Inicia sesión con tu correo electrónico', - style: TextStyle( - fontSize: width * 0.04, ), - ), - ), - RichText( - text: TextSpan( - style: const TextStyle( - fontSize: 16.0, - color: Color(0xFF65676B), - fontFamily: 'Poppins', + const SizedBox(height: 10), + SizedBox( + width: double.infinity, + child: Text( + 'Numero de celular', + style: TextStyle( + fontSize: width * 0.045, + color: Theme.of(context).colorScheme.onBackground, + ), + ), ), - children: [ - const TextSpan(text: '¿No estás registrado? '), - TextSpan( - text: 'Regístrate', + Form( + child: IntlPhoneField( + initialCountryCode: 'CO', + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly + ], + ), + ), + Text( + 'Un código será enviado a este numero de celular.', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 13.0, + color: Theme.of(context).colorScheme.onBackground, + ), + ), + ElevatedButton( + onPressed: () { + Navigator.push( + context, + CupertinoPageRoute( + builder: (context) => + const SignScreen(initialIndex: 1), + ), + ); + }, + child: const Text('Iniciar Sesión'), + ), + TextButton( + onPressed: () { + Navigator.push( + context, + CupertinoPageRoute( + builder: (context) => + const SignScreen(initialIndex: 0), + ), + ); + }, + child: Text( + 'Inicia sesión con tu correo electrónico', style: TextStyle( fontSize: width * 0.04, - color: Colors.blue, - fontWeight: FontWeight.w600, ), - recognizer: TapGestureRecognizer() - ..onTap = () { - Navigator.push( - context, - CupertinoPageRoute( - builder: (context) => - SignScreen(initialIndex: 1), - ), - ); - }, ), - ], - ), + ), + RichText( + text: TextSpan( + style: const TextStyle( + fontSize: 16.0, + color: Color(0xFF65676B), + fontFamily: 'Poppins', + ), + children: [ + const TextSpan(text: '¿No estás registrado? '), + TextSpan( + text: 'Regístrate', + style: TextStyle( + fontSize: width * 0.04, + color: Colors.blue, + fontWeight: FontWeight.w600, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + Navigator.push( + context, + CupertinoPageRoute( + builder: (context) => + SignScreen(initialIndex: 1), + ), + ); + }, + ), + ], + ), + ), + ], ), - ], + ), ), ), - ), + ) ], ), ); + + // Scaffold( + // backgroundColor: Theme.of(context).colorScheme.surface, + // body: Column( + // children: [ + // Container( + // color: Theme.of(context).colorScheme.tertiary, + // child: Column( + // children: [ + // const SizedBox(height: 20), + // Center( + // child: Image( + // width: width * 0.7, + // image: const AssetImage('images/logo_prosapp.png'), + // ), + // ), + // const SizedBox(height: 20), + // ], + // ), + // ), + // SizedBox( + // width: double.infinity, + // child: Text( + // 'Iniciar sesión', + // style: TextStyle( + // // fontSize: 30, + // fontSize: width * 0.08, + // fontWeight: FontWeight.bold, + // ), + // ), + // ), + // Expanded( + // child: SingleChildScrollView( + // child: Column( + // children: [ + // const SizedBox(height: 10), + // SizedBox( + // width: double.infinity, + // child: Text( + // 'Numero de celular', + // style: TextStyle( + // fontSize: width * 0.045, + // color: Theme.of(context).colorScheme.onBackground, + // ), + // ), + // ), + // Form( + // child: IntlPhoneField( + // initialCountryCode: 'CO', + // keyboardType: TextInputType.number, + // inputFormatters: [FilteringTextInputFormatter.digitsOnly], + // ), + // ), + // Text( + // 'Un código será enviado a este numero de celular.', + // textAlign: TextAlign.center, + // style: TextStyle( + // fontSize: 13.0, + // color: Theme.of(context).colorScheme.onBackground, + // ), + // ), + // TextButton( + // onPressed: () { + // Navigator.push( + // context, + // CupertinoPageRoute( + // builder: (context) => SignScreen(initialIndex: 0), + // ), + // ); + // }, + // child: Text( + // 'Inicia sesión con tu correo electrónico', + // style: TextStyle( + // fontSize: width * 0.04, + // ), + // ), + // ), + // RichText( + // text: TextSpan( + // style: const TextStyle( + // fontSize: 16.0, + // color: Color(0xFF65676B), + // fontFamily: 'Poppins', + // ), + // children: [ + // const TextSpan(text: '¿No estás registrado? '), + // TextSpan( + // text: 'Regístrate', + // style: TextStyle( + // fontSize: width * 0.04, + // color: Colors.blue, + // fontWeight: FontWeight.w600, + // ), + // recognizer: TapGestureRecognizer() + // ..onTap = () { + // Navigator.push( + // context, + // CupertinoPageRoute( + // builder: (context) => + // SignScreen(initialIndex: 1), + // ), + // ); + // }, + // ), + // ], + // ), + // ), + // ], + // ), + // ), + // ), + // ], + // ), + // ); + + // Scaffold( + // backgroundColor: Theme.of(context).colorScheme.surface, + // body: ListView( + // children: [ + // Container( + // color: Theme.of(context).colorScheme.tertiary, + // padding: const EdgeInsets.symmetric(vertical: 20.0), + // child: Center( + // child: Image( + // width: width * 0.7, + // image: const AssetImage('images/logo_prosapp.png'), + // ), + // ), + // ), + // Container( + // decoration: const BoxDecoration( + // color: Colors.white, + // borderRadius: BorderRadius.only( + // topLeft: Radius.circular(60), + // topRight: Radius.circular(60), + // ), + // ), + // child: Padding( + // padding: const EdgeInsets.all(20.0), + // child: Column( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // const TextField( + // decoration: InputDecoration( + // labelText: 'Usuario', + // border: OutlineInputBorder(), + // ), + // ), + // const SizedBox(height: 20.0), + // const TextField( + // decoration: InputDecoration( + // labelText: 'Contraseña', + // border: OutlineInputBorder(), + // ), + // obscureText: true, + // ), + // const SizedBox(height: 20.0), + // + // ], + // ), + // ), + // ), + // ], + // ), + // ); } } diff --git a/lib/screens/configuration/configuration_screen.dart b/lib/screens/configuration/configuration_screen.dart index f416f00..044ab2c 100644 --- a/lib/screens/configuration/configuration_screen.dart +++ b/lib/screens/configuration/configuration_screen.dart @@ -125,9 +125,12 @@ // } // } +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:prosappco/blocs/authentication_bloc/authentication_bloc.dart'; +import 'package:injector/injector.dart'; +import 'package:prosappco/blocs/setting_bloc/setting_bloc.dart'; import 'package:prosappco/components/general_drawer_item.dart'; class ConfigurationScreen extends StatelessWidget { @@ -135,36 +138,45 @@ class ConfigurationScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return BlocListener( - listener: (context, state) { - if (state.status == AuthenticationStatus.unauthenticated) { - Navigator.pop(context); - } - }, - child: Scaffold( - appBar: AppBar( - title: const Text('Configuración'), + final settingBloc = Injector.appInstance.get(); + + return BlocProvider( + create: (context) => settingBloc, + child: BlocListener( + listener: (context, state) { + if (state is SettingLogoutSuccess) { + Navigator.pop(context); + } + }, + child: Scaffold( + appBar: AppBar( + title: const Text('Configuración'), + ), + body: ListView( + children: [ + GeneralDrawerItem( + label: 'Acerca de la aplicación', + onTap: () {}, + trailing: true, + ), + GeneralDrawerItem( + label: 'Cerrar sesión', + onTap: () { + try { + settingBloc.add(SettingLogoutRequest()); + } catch (e) { + log('xd conigura ${e.toString()}'); + } + }, + ), + GeneralDrawerItem( + label: 'Eliminar cuenta', + onTap: () {}, + color: Theme.of(context).colorScheme.error, + ) + ], + ), ), - body: ListView(children: [ - GeneralDrawerItem( - label: 'Acerca de la aplicación', - onTap: () {}, - trailing: true, - ), - GeneralDrawerItem( - label: 'Cerrar sesión', - onTap: () { - context - .read() - .add(AuthenticationLogoutRequested()); - }, - ), - GeneralDrawerItem( - label: 'Eliminar cuenta', - onTap: () {}, - color: Theme.of(context).colorScheme.error, - ) - ]), ), ); } diff --git a/lib/screens/profile/profile_screen.dart b/lib/screens/profile/profile_screen.dart index dcc563a..a1a7006 100644 --- a/lib/screens/profile/profile_screen.dart +++ b/lib/screens/profile/profile_screen.dart @@ -3,7 +3,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:image_picker/image_picker.dart'; import 'package:prosappco/blocs/my_user_bloc/my_user_bloc.dart'; -import 'package:prosappco/blocs/update_user_info_bloc/update_user_info_bloc.dart'; +import 'package:prosappco/blocs/profile_bloc/profile_bloc.dart'; import 'package:prosappco/src/components/pop_appbar.dart'; class ProfileScreen extends StatefulWidget { @@ -24,7 +24,7 @@ class _ProfileScreenState extends State { @override Widget build(BuildContext context) { - return BlocListener( + return BlocListener( listener: (context, state) { if (state is UploadPictureSuccess) { setState(() {}); @@ -57,7 +57,7 @@ class _ProfileScreenState extends State { ); if (image != null) { - context.read().add( + context.read().add( UploadPicture(image.path, state.user!.id), ); } @@ -146,7 +146,7 @@ class _ProfileScreenState extends State { ), ElevatedButton( onPressed: () { - context.read().add( + context.read().add( UpdateUserInfo(state.user!.id, _nameController.text)); }, child: const Text('Guardar'), 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 518bf0f..35cb2cc 100644 --- a/packages/user_repository/lib/src/repositories/firebase_user_repository.dart +++ b/packages/user_repository/lib/src/repositories/firebase_user_repository.dart @@ -42,6 +42,11 @@ class FirebaseUserRepository implements UserRepository { return _userStreamController.stream; } + @override + Stream isAuthenticated() { + return _firebaseAuth.userChanges().map((event) => null != event); + } + // Sign up @override Future signUp(MyUser myUser, String password) async { diff --git a/packages/user_repository/lib/src/repositories/user_repo.dart b/packages/user_repository/lib/src/repositories/user_repo.dart index 953a157..b5a8ac7 100644 --- a/packages/user_repository/lib/src/repositories/user_repo.dart +++ b/packages/user_repository/lib/src/repositories/user_repo.dart @@ -3,6 +3,7 @@ import '../../user_repository.dart'; abstract class UserRepository { // Stream get user; Stream streamUser(); + Stream isAuthenticated(); Future signIn(String email, String password);