LoginViewModel.ets 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { BaseViewModel } from '../../ui/BaseViewModel';
  2. import { StateFlow } from '../../ui/StateFlow';
  3. import { AuthRepository } from '../repository/AuthRepository';
  4. import { AuthRemoteDataSource } from '../datasource/remote/AuthRemoteDataSource';
  5. import { AuthLocalDataSourceImpl } from '../datasource/local/AuthLocalDataSourceImpl';
  6. import { LoginState } from './LoginState';
  7. /**
  8. * 登录ViewModel
  9. *
  10. * 与 Android 版本保持一致的 API 和结构
  11. */
  12. export class LoginViewModel extends BaseViewModel {
  13. private authRepository: AuthRepository;
  14. // 使用 StateFlow 管理状态(与 Android 版本一致)
  15. private _loginState = new StateFlow<LoginState>(LoginState.Idle);
  16. loginState: StateFlow<LoginState> = this._loginState;
  17. private static readonly MIN_PASSWORD_LENGTH = 6;
  18. private static readonly MAX_PASSWORD_LENGTH = 16;
  19. constructor() {
  20. super();
  21. // 初始化 Repository
  22. this.authRepository = new AuthRepository(
  23. new AuthRemoteDataSource(),
  24. new AuthLocalDataSourceImpl()
  25. );
  26. }
  27. /**
  28. * 登录
  29. *
  30. * @param mobile 手机号
  31. * @param password 密码
  32. */
  33. async login(mobile: string, password: string): Promise<void> {
  34. this._loginState.value = LoginState.Loading;
  35. // 输入验证
  36. if (!mobile || mobile.trim() === '') {
  37. this._loginState.value = LoginState.Error('手机号不能为空');
  38. return;
  39. }
  40. if (password.length < LoginViewModel.MIN_PASSWORD_LENGTH ||
  41. password.length > LoginViewModel.MAX_PASSWORD_LENGTH) {
  42. this._loginState.value = LoginState.Error(
  43. `密码长度应为${LoginViewModel.MIN_PASSWORD_LENGTH}-${LoginViewModel.MAX_PASSWORD_LENGTH}位`
  44. );
  45. return;
  46. }
  47. try {
  48. const result = await this.authRepository.login(mobile, password);
  49. if (result.isSuccess) {
  50. this._loginState.value = LoginState.Success('登录成功');
  51. } else {
  52. const error = result.exceptionOrNull();
  53. this._loginState.value = LoginState.Error(
  54. error?.message || '登录失败'
  55. );
  56. }
  57. } catch (error) {
  58. this._loginState.value = LoginState.Error(
  59. (error as Error).message || '登录失败'
  60. );
  61. }
  62. }
  63. }