2024-07-23 06:37:42 +00:00
|
|
|
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<UserEvent, UserState> {
|
|
|
|
|
final GetCachedUserUseCase _getCachedUserUseCase;
|
2024-08-07 13:56:12 +00:00
|
|
|
final GetRemoteUserUsecase _getRemoteUserUseCase;
|
2024-07-23 06:37:42 +00:00
|
|
|
final SignInUseCase _signInUseCase;
|
|
|
|
|
final SignOutUseCase _signOutUseCase;
|
|
|
|
|
UserBloc(
|
|
|
|
|
this._signInUseCase,
|
|
|
|
|
this._getCachedUserUseCase,
|
2024-08-07 13:56:12 +00:00
|
|
|
this._getRemoteUserUseCase,
|
2024-07-23 06:37:42 +00:00
|
|
|
this._signOutUseCase,
|
|
|
|
|
) : super(UserInitial()) {
|
|
|
|
|
on<SignInUser>(_onSignIn);
|
|
|
|
|
on<CheckUser>(_onCheckUser);
|
2024-08-07 13:56:12 +00:00
|
|
|
on<GetRemoteUser>(_onGetRemoteUser);
|
2024-07-23 06:37:42 +00:00
|
|
|
on<SignOutUser>(_onSignOut);
|
2024-08-08 05:40:30 +00:00
|
|
|
on<GetUser>(_onGetUser);
|
2024-07-23 06:37:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _onSignIn(SignInUser event, Emitter<UserState> emit) async {
|
|
|
|
|
try {
|
|
|
|
|
emit(UserLoading());
|
|
|
|
|
final result = await _signInUseCase(event.params);
|
|
|
|
|
result.fold(
|
|
|
|
|
(failure) => emit(UserLoggedFail(failure)),
|
2024-08-07 13:56:12 +00:00
|
|
|
(token) => emit(UserLogged(token)),
|
2024-07-23 06:37:42 +00:00
|
|
|
);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
emit(UserLoggedFail(ExceptionFailure()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void _onCheckUser(CheckUser event, Emitter<UserState> emit) async {
|
|
|
|
|
try {
|
|
|
|
|
emit(UserLoading());
|
|
|
|
|
final result = await _getCachedUserUseCase(NoParams());
|
|
|
|
|
result.fold(
|
|
|
|
|
(failure) => emit(UserLoggedFail(failure)),
|
2024-08-07 13:56:12 +00:00
|
|
|
(user) => emit(UserFetched(user)),
|
2024-07-23 06:37:42 +00:00
|
|
|
);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
emit(UserLoggedFail(ExceptionFailure()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-07 13:56:12 +00:00
|
|
|
void _onSignOut(SignOutUser event, Emitter<UserState> emit) async {
|
2024-07-23 06:37:42 +00:00
|
|
|
try {
|
|
|
|
|
emit(UserLoading());
|
2024-08-07 13:56:12 +00:00
|
|
|
await _signOutUseCase(NoParams());
|
|
|
|
|
emit(UserLoggedOut());
|
2024-07-23 06:37:42 +00:00
|
|
|
} catch (e) {
|
|
|
|
|
emit(UserLoggedFail(ExceptionFailure()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-07 13:56:12 +00:00
|
|
|
FutureOr<void> _onGetRemoteUser(
|
|
|
|
|
GetRemoteUser event,
|
|
|
|
|
Emitter<UserState> emit,
|
|
|
|
|
) async {
|
2024-07-23 06:37:42 +00:00
|
|
|
try {
|
|
|
|
|
emit(UserLoading());
|
2024-08-07 13:56:12 +00:00
|
|
|
final result = await _getRemoteUserUseCase(NoParams());
|
|
|
|
|
result.fold(
|
|
|
|
|
(failure) => emit(_mapFailureToState(failure)),
|
|
|
|
|
(user) => emit(UserFetched(user)),
|
|
|
|
|
);
|
2024-07-23 06:37:42 +00:00
|
|
|
} catch (e) {
|
|
|
|
|
emit(UserLoggedFail(ExceptionFailure()));
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-08-07 13:56:12 +00:00
|
|
|
|
|
|
|
|
UserState _mapFailureToState(Failure failure) {
|
|
|
|
|
if (failure is ServerFailure) {
|
|
|
|
|
return UserLoggedFail(ServerFailure());
|
|
|
|
|
} else if (failure is CacheFailure) {
|
|
|
|
|
return UserLoggedFail(CacheFailure());
|
|
|
|
|
} else if (failure is NetworkFailure) {
|
|
|
|
|
return UserLoggedFail(NetworkFailure());
|
|
|
|
|
} else if (failure is CredentialFailure) {
|
|
|
|
|
return UserLoggedFail(CredentialFailure());
|
|
|
|
|
} else if (failure is AuthenticationFailure) {
|
|
|
|
|
return UserLoggedFail(AuthenticationFailure());
|
|
|
|
|
} else {
|
|
|
|
|
return UserLoggedFail(ExceptionFailure());
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-08-08 05:40:30 +00:00
|
|
|
|
|
|
|
|
/// get the user
|
|
|
|
|
FutureOr<void> _onGetUser(GetUser event, Emitter<UserState> emit) async {
|
|
|
|
|
try {
|
|
|
|
|
emit(UserLoading());
|
|
|
|
|
|
|
|
|
|
final user = await _getUserFromCacheOrRemote();
|
|
|
|
|
emit(UserFetched(user));
|
|
|
|
|
} catch (failure) {
|
|
|
|
|
emit(_mapFailureToState(failure as Failure));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<User> _getUserFromCacheOrRemote() async {
|
|
|
|
|
try {
|
|
|
|
|
final cacheResult = await _getCachedUserUseCase(NoParams());
|
|
|
|
|
return cacheResult.fold(
|
|
|
|
|
(failure) => throw failure,
|
|
|
|
|
(user) => user,
|
|
|
|
|
);
|
|
|
|
|
} catch (_) {
|
|
|
|
|
return await _getUserFromRemote();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<User> _getUserFromRemote() async {
|
|
|
|
|
final remoteResult = await _getRemoteUserUseCase(NoParams());
|
|
|
|
|
return remoteResult.fold(
|
|
|
|
|
(failure) => throw failure,
|
|
|
|
|
(user) => user,
|
|
|
|
|
);
|
|
|
|
|
}
|
2024-07-23 06:37:42 +00:00
|
|
|
}
|