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.Idle); loginState: StateFlow = 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 { 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 || '登录失败' ); } } }