Files
QSY-lvjuxcx/utils/login-helper.js
liangjian 1111ac148b feat: 重构核心租住流程页面与交互体验
统一注册、看房、申请与入住等核心页面的视觉和流程衔接,补齐支付、签约与状态流转闭环,提升移动端操作连贯性。
2026-07-29 09:05:38 +08:00

186 lines
4.6 KiB
JavaScript

import {
buildUserFromRegistrationApplication,
normalizeUser
} from './flow'
function getText(language, zhText, enText) {
return String(language || 'zh').trim().toLowerCase() === 'en' ? enText : zhText
}
function getResponseData(response = {}) {
if (response && response.data && typeof response.data === 'object') {
return response.data
}
return response || {}
}
export function matchRegisteredUser(user = {}, account = '') {
const source = user || {}
const currentAccount = String(account || '').trim()
const candidateAccounts = [
source.account,
source.username,
source.email
].map(value => String(value || '').trim()).filter(Boolean)
if (!currentAccount || !candidateAccounts.length) {
return null
}
if (!candidateAccounts.includes(currentAccount)) {
return null
}
return source
}
export function pickLatestRegistration(response = {}, options = {}) {
const source = options || {}
const account = String(source.account || '').trim()
const responseData = getResponseData(response)
const list = Array.isArray(responseData.data)
? responseData.data
: (Array.isArray(responseData) ? responseData : [])
const matchedList = list.filter(item => {
if (!item) {
return false
}
return item.account === account || item.email === account
})
const targetList = matchedList.length ? matchedList : list
return targetList[0] || null
}
export function extractLoginSession(response = {}, language = 'zh') {
const responseData = getResponseData(response)
const nestedData = responseData && responseData.data && typeof responseData.data === 'object'
? responseData.data
: {}
const token = responseData.accessToken
|| responseData.token
|| nestedData.accessToken
|| nestedData.token
|| response.accessToken
|| response.token
|| ''
const expires = responseData.expires
|| responseData.expireTime
|| nestedData.expires
|| nestedData.expireTime
|| response.expires
|| response.expireTime
|| ''
if (!token) {
throw new Error(getText(language, '登录成功但未返回 accessToken', 'Login succeeded but accessToken is missing'))
}
const userCode = responseData.userCode
|| responseData.code
|| nestedData.userCode
|| nestedData.code
|| response.userCode
|| response.code
|| ''
return {
token,
expires,
userCode
}
}
export function buildHandledLoginError(language = 'zh', options = {}) {
const source = options || {}
return {
title: source.title || '',
navigateToAuthResult: source.navigateToAuthResult === true
}
}
export function buildLoginSessionUser(options = {}) {
const source = options || {}
const latestRegistration = source.latestRegistration || null
const matchedLocalUser = source.matchedLocalUser || null
const account = source.account || ''
const password = source.password || ''
const language = source.language || 'zh'
const userCode = source.userCode || ''
if (latestRegistration) {
return buildUserFromRegistrationApplication(latestRegistration, {
password,
language,
userCode
})
}
if (matchedLocalUser) {
return matchedLocalUser
}
return normalizeUser({
account,
username: account,
password,
userCode
})
}
export function resolveLoginPreparation(options = {}) {
const source = options || {}
const language = source.language || 'zh'
const matchedLocalUser = source.matchedLocalUser || null
const latestRegistration = source.latestRegistration || null
const account = source.account || ''
const password = source.password || ''
const userCode = source.userCode || ''
if (!latestRegistration) {
return {
ok: true,
sessionUser: buildLoginSessionUser({
matchedLocalUser,
account,
password,
language,
userCode
})
}
}
if (latestRegistration.approvalStatus === 0) {
return {
ok: false,
handledError: buildHandledLoginError(language, {
title: getText(language, '注册申请审核中,暂不能登录', 'Registration is under review'),
navigateToAuthResult: true
})
}
}
if (latestRegistration.approvalStatus === -1) {
return {
ok: false,
handledError: buildHandledLoginError(language, {
title: latestRegistration.approveReason || getText(language, '注册申请已驳回', 'Rejected'),
navigateToAuthResult: true
})
}
}
return {
ok: true,
sessionUser: buildLoginSessionUser({
latestRegistration,
matchedLocalUser,
account,
password,
language,
userCode
})
}
}