82 lines
2.5 KiB
TypeScript
82 lines
2.5 KiB
TypeScript
import { createApp } from 'vue'
|
|
import uniWebView from '@dcloudio/uni-webview-js'
|
|
import App from './App.vue'
|
|
import router from './router'
|
|
import pinia from './store'
|
|
import { getLaunchParams, onNativeMessage, stripLaunchToken, UniEvents } from '@/utils/uniapp-bridge'
|
|
import { useAvatarStore } from '@/store/avatar'
|
|
import { useUserStore } from '@/store/user'
|
|
|
|
// Bundle the bridge locally so the H5 does not depend on an external CDN.
|
|
;(window as any).uni = (window as any).uni || uniWebView
|
|
|
|
const app = createApp(App)
|
|
app.use(pinia)
|
|
|
|
// —— 混合架构:在挂载前注入 uniapp 壳传入的认证与会会资料 ——
|
|
const params = getLaunchParams()
|
|
const avatarStore = useAvatarStore(pinia)
|
|
const userStore = useUserStore(pinia)
|
|
|
|
function syncAvatarProfile() {
|
|
if (!userStore.isLogin || !userStore.user) return
|
|
avatarStore.setNativeProfile({
|
|
userId: (userStore.user as any).huihuiUserId || '',
|
|
nickname: userStore.user.nickname || '',
|
|
avatarUrl: userStore.user.avatarUrl || ''
|
|
})
|
|
}
|
|
|
|
async function exchangeInjectedToken(token: string) {
|
|
stripLaunchToken()
|
|
userStore.clearSession()
|
|
await userStore.loginByToken(token)
|
|
syncAvatarProfile()
|
|
}
|
|
|
|
// 原生 → H5:注册消息处理(壳通过 web-view.evalJS 调用)
|
|
onNativeMessage((msg) => {
|
|
if (!msg || !msg.type) return
|
|
if (msg.type === 'tokenRefresh' && msg.token) {
|
|
void exchangeInjectedToken(msg.token).catch(() => {
|
|
sessionStorage.setItem('hh_sso_error', '会会登录凭证无效或已过期,请重新进入')
|
|
void router.replace('/login/sms')
|
|
})
|
|
}
|
|
if (msg.type === 'userUpdate' && msg.user) {
|
|
avatarStore.setNativeProfile(msg.user)
|
|
}
|
|
})
|
|
|
|
async function bootstrap() {
|
|
// A URL token represents the current production user and must override stale storage.
|
|
if (params.token) {
|
|
try {
|
|
await exchangeInjectedToken(params.token)
|
|
await router.replace(window.location.hash.slice(1) || '/avatar/manage')
|
|
} catch {
|
|
sessionStorage.setItem('hh_sso_error', '会会登录凭证无效或已过期,请重新进入')
|
|
await router.replace('/login/sms')
|
|
}
|
|
} else {
|
|
userStore.loadFromStorage()
|
|
syncAvatarProfile()
|
|
}
|
|
|
|
if (params.userId || params.nickname || params.avatar) {
|
|
avatarStore.setNativeProfile({
|
|
userId: params.userId || '',
|
|
nickname: params.nickname || '',
|
|
avatarUrl: params.avatar || ''
|
|
})
|
|
}
|
|
|
|
app.use(router)
|
|
app.mount('#app')
|
|
|
|
// 通知原生壳:H5 已就绪
|
|
UniEvents.ready()
|
|
}
|
|
|
|
void bootstrap()
|