Files
cmr-mini/miniprogram/pages/login/login.ts

130 lines
3.7 KiB
TypeScript

import { clearBackendAuthTokens, saveBackendAuthTokens, saveBackendBaseUrl } from '../../utils/backendAuth'
import { loginWechatMini } from '../../utils/backendApi'
import { setGlobalMockDebugBridgeEnabled } from '../../utils/globalMockDebugBridge'
const DEFAULT_BACKEND_BASE_URL = 'https://api.gotomars.xyz'
const DEFAULT_DEVICE_KEY = 'mini-dev-device-001'
const DEFAULT_DEV_CODE = 'dev-workbench-user'
type LoginPageData = {
backendBaseUrl: string
deviceKey: string
loginCode: string
statusText: string
}
function setAppBackendState(baseUrl: string, accessToken: string, refreshToken: string) {
const app = getApp<IAppOption>()
if (app.globalData) {
app.globalData.backendBaseUrl = baseUrl
app.globalData.backendAuthTokens = { accessToken, refreshToken }
}
}
Page({
data: {
backendBaseUrl: DEFAULT_BACKEND_BASE_URL,
deviceKey: DEFAULT_DEVICE_KEY,
loginCode: DEFAULT_DEV_CODE,
statusText: '请先登录后端',
} as LoginPageData,
onLoad() {
const app = getApp<IAppOption>()
this.setData({
backendBaseUrl: app.globalData && app.globalData.backendBaseUrl
? app.globalData.backendBaseUrl
: DEFAULT_BACKEND_BASE_URL,
})
},
handleBaseUrlInput(event: WechatMiniprogram.Input) {
this.setData({ backendBaseUrl: event.detail.value })
},
handleDeviceKeyInput(event: WechatMiniprogram.Input) {
this.setData({ deviceKey: event.detail.value })
},
handleLoginCodeInput(event: WechatMiniprogram.Input) {
this.setData({ loginCode: event.detail.value })
},
persistBaseUrl(): string {
const normalized = saveBackendBaseUrl(this.data.backendBaseUrl)
const app = getApp<IAppOption>()
if (app.globalData) {
app.globalData.backendBaseUrl = normalized
}
if (normalized !== this.data.backendBaseUrl) {
this.setData({ backendBaseUrl: normalized })
}
return normalized
},
async loginWithCode(code: string, sourceLabel: string) {
const baseUrl = this.persistBaseUrl()
this.setData({
statusText: `正在用 ${sourceLabel} 登录后端`,
})
try {
const result = await loginWechatMini({
baseUrl,
code,
deviceKey: this.data.deviceKey || DEFAULT_DEVICE_KEY,
clientType: 'wechat',
})
const tokens = saveBackendAuthTokens(result.tokens)
setAppBackendState(baseUrl, tokens.accessToken, tokens.refreshToken)
this.setData({
statusText: '登录成功,准备进入首页',
})
wx.redirectTo({
url: '/pages/home/home',
})
} catch (error) {
const message = error && (error as { message?: string }).message ? (error as { message: string }).message : '未知错误'
this.setData({
statusText: `登录失败:${message}`,
})
}
},
handleLoginWithDevCode() {
this.loginWithCode((this.data.loginCode || DEFAULT_DEV_CODE).trim(), '开发码')
},
handleLoginWithWechat() {
this.setData({
statusText: '正在调用 wx.login',
})
wx.login({
success: (result) => {
const code = result && result.code ? result.code : ''
if (!code) {
this.setData({ statusText: 'wx.login 未返回 code' })
return
}
this.setData({ loginCode: code })
this.loginWithCode(code, 'wx.login code')
},
fail: (error) => {
this.setData({
statusText: `wx.login 失败:${error && error.errMsg ? error.errMsg : '未知错误'}`,
})
},
})
},
handleClearLoginState() {
clearBackendAuthTokens()
setGlobalMockDebugBridgeEnabled(false)
const app = getApp<IAppOption>()
if (app.globalData) {
app.globalData.backendAuthTokens = null
}
this.setData({
statusText: '已清空登录态',
})
},
})