THATMobile/lib/features/usecases/user/user_use_cases.dart
2026-02-27 10:14:14 +07:00

116 lines
3.7 KiB
Dart

import 'package:baseproject/core/common/index.dart';
import 'package:baseproject/core/constants/index.dart';
import 'package:baseproject/core/extension/string_extension.dart';
import 'package:baseproject/features/repositories/hra_repository.dart';
import 'package:dartz/dartz.dart';
import 'package:dio/dio.dart';
import 'package:injectable/injectable.dart';
@lazySingleton
class UserUseCases {
final HraRepository _hraRepository;
UserUseCases(this._hraRepository);
Future<Either<String, LoginResponseDto>> loginAccount(LoginDto request) async {
try {
final result = await _hraRepository.accountLoginMobile(request);
if (result.data == null || result.success == false) {
return Left<String, LoginResponseDto>(result.message ?? 'Login failed');
}
await saveToken(result.data?.token ?? '', refreshToken: result.data?.refreshToken ?? '');
await saveUserInfo(result.data?.userInfo);
return Right<String, LoginResponseDto>(result.data!);
} catch (ex) {
return Left<String, LoginResponseDto>(ex.toString());
}
}
Future<void> saveToken(String token, {String? refreshToken}) async {
await LocalStoreManager.setString(StorageKey.tokenUser, token);
if (refreshToken != null) {
await LocalStoreManager.setString(StorageKey.refreshToken, refreshToken);
}
}
Future<void> saveUserInfo(UserInfoDto? userInfo) async {
if (userInfo != null) {
await LocalStoreManager.setObject(StorageKey.userInfo, userInfo.toJson());
}
}
UserInfoDto? getUserInfo() {
final Map<String, dynamic>? temp = LocalStoreManager.getObject(StorageKey.userInfo);
if (temp != null) return UserInfoDto.fromJson(temp);
return null;
}
int getCurrentUserId() {
return getUserInfo()?.id?.toInt() ?? 0;
}
Future<void> clearData() async {
await LocalStoreManager.remove(StorageKey.refreshToken);
await LocalStoreManager.remove(StorageKey.tokenUser);
await LocalStoreManager.remove(StorageKey.userInfo);
}
Future<Either<String, DNTCaptchaApiResponse>> getCaptcha() async {
try {
final result = await _hraRepository.accountCaptcha();
return Right<String, DNTCaptchaApiResponse>(result);
} catch (ex) {
return Left<String, DNTCaptchaApiResponse>(ex.toString());
}
}
Future<Either<String, bool>> refreshToken() async {
final refreshToken = LocalStoreManager.getString(StorageKey.refreshToken);
if (refreshToken.isNullOrEmpty) {
return const Left<String, bool>('Refresh token not found');
}
try {
final result = await _hraRepository.accountRefreshToken(
RefreshTokenRequestDto(refreshToken: LocalStoreManager.getString(StorageKey.refreshToken)));
if (result.data != null) {
await saveToken(result.data?.token ?? '');
}
return Right<String, bool>(result.success ?? false);
} catch (ex) {
await clearData();
return Left<String, bool>(ex.toString());
}
}
Future<Either<String, UserInfoDto>> getUserInfoFromApi() async {
try {
final result = await _hraRepository.accountUserInfo();
await saveUserInfo(result);
return Right<String, UserInfoDto>(result);
} catch (ex) {
await clearData();
return Left<String, UserInfoDto>(ex.toString());
}
}
Future<bool> tryRefreshToken() async {
try {
RefreshTokenRequestDto requestModel =
RefreshTokenRequestDto(refreshToken: LocalStoreManager.getString(StorageKey.refreshToken));
final RefreshTokenResponseDtoApiResponse? token =
await HraRepository(Dio(), baseUrl: ApiPath.hra).accountRefreshToken(requestModel);
if (token != null) {
await saveToken(token.data?.token ?? '');
}
return token != null;
} catch (e) {
return false;
}
}
}