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()