| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- import { BaseViewModel } from '../../ui/BaseViewModel';
- import { StateFlow } from '../../ui/StateFlow';
- import { AuthRepository } from '../repository/AuthRepository';
- import { AuthRemoteDataSource } from '../datasource/remote/AuthRemoteDataSource';
- import { AuthLocalDataSourceImpl } from '../datasource/local/AuthLocalDataSourceImpl';
- import { LoginState } from './LoginState';
- /**
- * 登录ViewModel
- *
- * 与 Android 版本保持一致的 API 和结构
- */
- export class LoginViewModel extends BaseViewModel {
- private authRepository: AuthRepository;
-
- // 使用 StateFlow 管理状态(与 Android 版本一致)
- private _loginState = new StateFlow<LoginState>(LoginState.Idle);
- loginState: StateFlow<LoginState> = this._loginState;
-
- private static readonly MIN_PASSWORD_LENGTH = 6;
- private static readonly MAX_PASSWORD_LENGTH = 16;
-
- constructor() {
- super();
- // 初始化 Repository
- this.authRepository = new AuthRepository(
- new AuthRemoteDataSource(),
- new AuthLocalDataSourceImpl()
- );
- }
-
- /**
- * 登录
- *
- * @param mobile 手机号
- * @param password 密码
- */
- async login(mobile: string, password: string): Promise<void> {
- this._loginState.value = LoginState.Loading;
-
- // 输入验证
- if (!mobile || mobile.trim() === '') {
- this._loginState.value = LoginState.Error('手机号不能为空');
- return;
- }
-
- if (password.length < LoginViewModel.MIN_PASSWORD_LENGTH ||
- password.length > LoginViewModel.MAX_PASSWORD_LENGTH) {
- this._loginState.value = LoginState.Error(
- `密码长度应为${LoginViewModel.MIN_PASSWORD_LENGTH}-${LoginViewModel.MAX_PASSWORD_LENGTH}位`
- );
- return;
- }
-
- try {
- const result = await this.authRepository.login(mobile, password);
-
- if (result.isSuccess) {
- this._loginState.value = LoginState.Success('登录成功');
- } else {
- const error = result.exceptionOrNull();
- this._loginState.value = LoginState.Error(
- error?.message || '登录失败'
- );
- }
- } catch (error) {
- this._loginState.value = LoginState.Error(
- (error as Error).message || '登录失败'
- );
- }
- }
- }
|