/** * OmniCard AI (CRMmp) - 统一身份认证登录业务驱动层 * 第一版可用骨架:不接真实 Google / Apple SDK,不伪造成功登录 */ import { getCurrentLocale, getOmniText } from '../../common/locale.uts'; import { setAuthToken, setTenantId } from '../../common/request.uts'; export type LoginTab = 'phone' | 'email'; export type SocialProvider = 'google' | 'apple'; export type LoginCopyKey = | 'title' | 'desc' | 'tabPhone' | 'tabEmail' | 'countryCode' | 'phonePlaceholder' | 'sendCode' | 'smsCode' | 'login' | 'magicLink' | 'emailPlaceholder' | 'google' | 'apple' | 'comingSoon' | 'phoneRequired' | 'emailRequired' | 'codeRequired' | 'loginSuccess'; export type LoginState = { tab: LoginTab; countryCode: string; phone: string; smsCode: string; email: string; submitting: boolean; errorMessage: string; }; function isZhLocale(): boolean { return getCurrentLocale() === 'zh-CN'; } /** * 登录文案:能复用 locale.uts 的走词典,缺 key 时中英简单分支 */ export function resolveLoginText(key: LoginCopyKey): string { if (key === 'loginSuccess') { return getOmniText(getCurrentLocale(), 'common.success'); } const zh = isZhLocale(); if (key === 'title') { return zh ? '登录 OmniCard' : 'Sign in to OmniCard'; } if (key === 'tabPhone') { return zh ? '手机号' : 'Phone'; } if (key === 'tabEmail') { return zh ? '邮箱' : 'Email'; } if (key === 'desc') { return zh ? '使用国际手机号或邮箱继续' : 'Continue with your phone or email'; } if (key === 'countryCode') { return zh ? '区号' : 'Code'; } if (key === 'phonePlaceholder') { return zh ? '手机号' : 'Phone number'; } if (key === 'sendCode') { return zh ? '发送验证码' : 'Send code'; } if (key === 'smsCode') { return zh ? '验证码' : 'Verification code'; } if (key === 'login') { return zh ? '登录' : 'Sign in'; } if (key === 'magicLink') { return zh ? '发送登录链接' : 'Send sign-in link'; } if (key === 'emailPlaceholder') { return zh ? '工作邮箱' : 'Work email'; } if (key === 'google') { return zh ? '使用 Google 继续' : 'Continue with Google'; } if (key === 'apple') { return zh ? '使用 Apple 继续' : 'Continue with Apple'; } if (key === 'comingSoon') { return zh ? '即将开放' : 'Coming soon'; } if (key === 'phoneRequired') { return zh ? '请填写手机号' : 'Enter your phone number'; } if (key === 'emailRequired') { return zh ? '请填写邮箱' : 'Enter your email'; } if (key === 'codeRequired') { return zh ? '请填写验证码' : 'Enter the verification code'; } return ''; } function toastNone(title: string): void { uni.showToast({ title, icon: 'none', }); } function canNavigateBack(): boolean { try { const pages = getCurrentPages(); return pages != null && pages.length > 1; } catch (_e) { return false; } } function finishAfterLogin(): void { if (canNavigateBack()) { uni.navigateBack(); return; } toastNone(resolveLoginText('loginSuccess')); } export function createLoginState(): LoginState { return { tab: 'phone', countryCode: '+86', phone: '', smsCode: '', email: '', submitting: false, errorMessage: '', }; } export function switchLoginTab(state: LoginState, tab: LoginTab): void { state.tab = tab; state.errorMessage = ''; } /** * 登录成功路径:写入 token / 可选 tenantId,再返回上一页或 toast */ export function completeLogin(token: string, tenantId?: string): boolean { const safeToken = token != null ? token.trim() : ''; if (safeToken === '') { return false; } setAuthToken(safeToken); const safeTenant = tenantId != null ? tenantId.trim() : ''; if (safeTenant !== '') { setTenantId(safeTenant); } finishAfterLogin(); return true; } export function sendSmsCode(state: LoginState): boolean { const phone = state.phone != null ? state.phone.trim() : ''; if (phone === '') { state.errorMessage = resolveLoginText('phoneRequired'); toastNone(state.errorMessage); return false; } state.errorMessage = ''; toastNone(resolveLoginText('comingSoon')); return false; } /** * 国际手机号验证码登录。空手机号不提交;第一版不伪造成功登录 */ export function submitPhoneLogin(state: LoginState): boolean { const phone = state.phone != null ? state.phone.trim() : ''; if (phone === '') { state.errorMessage = resolveLoginText('phoneRequired'); toastNone(state.errorMessage); return false; } const smsCode = state.smsCode != null ? state.smsCode.trim() : ''; if (smsCode === '') { state.errorMessage = resolveLoginText('codeRequired'); toastNone(state.errorMessage); return false; } if (state.submitting) { return false; } state.errorMessage = ''; toastNone(resolveLoginText('comingSoon')); return false; } /** * 邮箱 Magic Link。空邮箱不提交;第一版不伪造成功登录 */ export function sendMagicLink(state: LoginState): boolean { const email = state.email != null ? state.email.trim() : ''; if (email === '') { state.errorMessage = resolveLoginText('emailRequired'); toastNone(state.errorMessage); return false; } if (state.submitting) { return false; } state.errorMessage = ''; toastNone(resolveLoginText('comingSoon')); return false; } /** * Google / Apple 仅展示即将开放,不写凭证 */ export function tapSocialLogin(_provider: SocialProvider): void { toastNone(resolveLoginText('comingSoon')); }