102 lines
2.4 KiB
Dart

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<BaseStateBloc<LoginViewModel>> {
LoginBloc(this._userUseCases) : super(InitState<LoginViewModel>(LoginViewModel())) {
loadCaptcha();
}
final UserUseCases _userUseCases;
Future<void> loadCaptcha() async {
final currentModel = state.model;
final result = await _userUseCases.getCaptcha();
result.fold(
(error) {
showErrorMessage(error);
},
(captcha) {
emit(
LoadedState<LoginViewModel>(
currentModel.copyWith(
isLoading: false,
errorMessage: null,
captcha: captcha,
),
),
);
},
);
}
Future<void> login(LoginDto request) async {
final currentModel = state.model;
emit(
LoadingState<LoginViewModel>(
currentModel.copyWith(isLoading: true, errorMessage: null),
),
);
final result = await _userUseCases.loginAccount(request);
result.fold(
(error) {
showErrorMessage(error);
emit(
ErrorState<LoginViewModel>(
currentModel.copyWith(
isLoading: false,
errorMessage: error,
),
),
);
loadCaptcha();
},
(response) {
emit(
LoadedState<LoginViewModel>(
currentModel.copyWith(
isLoading: false,
errorMessage: null,
loginResponse: response,
),
),
);
},
);
}
}