import 'package:dartz/dartz.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:injectable/injectable.dart'; import '../../domain/auth/auth.dart'; part 'auth_event.dart'; part 'auth_state.dart'; part 'auth_bloc.freezed.dart'; @injectable class AuthBloc extends Bloc { final IAuthRepository _repository; AuthBloc(this._repository) : super(AuthState.initial()) { on(_onAuthEvent); } Future _onAuthEvent(AuthEvent event, Emitter emit) { return event.map( fetchCurrentUser: (e) async { emit(state.copyWith(failureOption: none())); final token = await _repository.hasToken(); final failureOrAuth = await _repository.currentUser(); failureOrAuth.fold( (f) => emit( state.copyWith( failureOption: optionOf(f), status: token ? AuthStatus.authenticated() : AuthStatus.unauthenticated(), ), ), (user) => emit( state.copyWith( user: user, status: token ? AuthStatus.authenticated() : AuthStatus.unauthenticated(), ), ), ); }, ); } }