import 'dart:async'; import 'package:equatable/equatable.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../core/core.dart'; import '../../domain/domain.dart'; part 'user_event.dart'; part 'user_state.dart'; class UserBloc extends Bloc { final GetCachedUserUseCase _getCachedUserUseCase; final SignInUseCase _signInUseCase; final SignUpUseCase _signUpUseCase; final SignOutUseCase _signOutUseCase; UserBloc( this._signInUseCase, this._getCachedUserUseCase, this._signOutUseCase, this._signUpUseCase, ) : super(UserInitial()) { on(_onSignIn); on(_onSignUp); on(_onCheckUser); on(_onSignOut); } void _onSignIn(SignInUser event, Emitter emit) async { try { emit(UserLoading()); final result = await _signInUseCase(event.params); result.fold( (failure) => emit(UserLoggedFail(failure)), (user) => emit(UserLogged(user)), ); } catch (e) { emit(UserLoggedFail(ExceptionFailure())); } } void _onCheckUser(CheckUser event, Emitter emit) async { try { emit(UserLoading()); final result = await _getCachedUserUseCase(NoParams()); result.fold( (failure) => emit(UserLoggedFail(failure)), (user) => emit(UserLogged(user)), ); } catch (e) { emit(UserLoggedFail(ExceptionFailure())); } } FutureOr _onSignUp(SignUpUser event, Emitter emit) async { try { emit(UserLoading()); final result = await _signUpUseCase(event.params); result.fold( (failure) => emit(UserLoggedFail(failure)), (user) => emit(UserLogged(user)), ); } catch (e) { emit(UserLoggedFail(ExceptionFailure())); } } void _onSignOut(SignOutUser event, Emitter emit) async { try { emit(UserLoading()); await _signOutUseCase(NoParams()); emit(UserLoggedOut()); } catch (e) { emit(UserLoggedFail(ExceptionFailure())); } } }