import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:user_repository/user_repository.dart'; part 'auth_event.dart'; part 'auth_state.dart'; class AuthBloc extends Bloc { final UserRepository _userRepository; AuthBloc({required UserRepository userRepository}) : _userRepository = userRepository, super(AuthStateInitial()) { on(_onAuthEventLoginOAuth); on(_onAuthEventVerifyOAuth); on(_onAuthEventAddEmailAndPassword); } void _onAuthEventLoginOAuth( AuthEventLoginOAuth event, Emitter emit) async { emit(AuthStateProcess()); try { await _userRepository.signInWithPhoneNumber(event.phone); emit(const AuthStateVerifyOAuth(false)); } catch (e) { emit(const AuthStateFailure()); } } void _onAuthEventVerifyOAuth( AuthEventVerifyOAuth event, Emitter emit) async { emit(AuthStateProcess()); try { final bool isVerified = await _userRepository.verifyOTP(event.code); if (isVerified) { emit(AuthStateSuccess()); } else { emit(const AuthStateVerifyOAuth(true)); } (isVerified) ? emit(AuthStateSuccess()) : emit(const AuthStateVerifyOAuth(true)); } catch (e) { emit(const AuthStateFailure()); } } void _onAuthEventAddEmailAndPassword( AuthEventAddEmailAndPassword event, Emitter emit) async { emit(AuthStateProcess()); try { 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()); } } }