import 'package:baseproject/core/common/bloc/bloc_index.dart'; import 'package:baseproject/core/common/index.dart'; import 'package:baseproject/features/repositories/hra_repository.dart'; import 'package:baseproject/features/usecases/user_use_cases.dart'; class LoginViewModel { LoginViewModel({ this.isLoading = false, this.errorMessage, this.loginResponse, this.captcha, }); final bool isLoading; final String? errorMessage; final LoginResponseDto? loginResponse; final DNTCaptchaApiResponse? captcha; LoginViewModel copyWith({ bool? isLoading, String? errorMessage, LoginResponseDto? loginResponse, DNTCaptchaApiResponse? captcha, }) { return LoginViewModel( isLoading: isLoading ?? this.isLoading, errorMessage: errorMessage, loginResponse: loginResponse ?? this.loginResponse, captcha: captcha ?? this.captcha, ); } } class LoginBloc extends BaseCubit> { LoginBloc(this._userUseCases) : super(InitState(LoginViewModel())) { loadCaptcha(); } final UserUseCases _userUseCases; Future loadCaptcha() async { final currentModel = state.model; final result = await _userUseCases.getCaptcha(); result.fold( (error) { showErrorMessage(error); }, (captcha) { emit( LoadedState( currentModel.copyWith( isLoading: false, errorMessage: null, captcha: captcha, ), ), ); }, ); } Future login(LoginDto request) async { final currentModel = state.model; emit( LoadingState( currentModel.copyWith(isLoading: true, errorMessage: null), ), ); final result = await _userUseCases.loginAccount(request); result.fold( (error) { showErrorMessage(error); emit( ErrorState( currentModel.copyWith( isLoading: false, errorMessage: error, ), ), ); loadCaptcha(); }, (response) { emit( LoadedState( currentModel.copyWith( isLoading: false, errorMessage: null, loginResponse: response, ), ), ); }, ); } }