import { defineStore } from 'pinia' import { getToken, getUserInfoData, setUserInfoData, removeUserInfoData, getSig, setSig, removeSig, getFontSize, setFontSize, removeFontSize } from '@/utils/storage' import { useTokenStore } from './token' import { getUserData, userLogout, updateUserData } from '@/api' import { ref } from 'vue' import { useUI } from '@/utils/use-ui' import { reLaunch } from '@/utils/router' import { getTencentUserSig } from '@/api' import { TUILogin } from '@tencentcloud/tui-core-lite' // #ifdef APP-PLUS import { useLoginState } from '@/uni_modules/tuikit-atomic-x/state/LoginState' // #endif export const useUserStore = defineStore('user', () => { const { clearToken } = useTokenStore() const { showDialog } = useUI() const userInfo = ref( getUserInfoData() ? JSON?.parse(getUserInfoData()) : {} ) /** 用户字体大小 */ const fontSizeData = ref(getFontSize()) /** 腾讯 IM 存储数据 */ const tencentUserSig = ref(getSig() ? JSON?.parse(getSig()) : {}) /** * 获取用户信息(可从缓存或接口) */ const fetchUserInfo = async () => { // 尝试从本地缓存读取 const cachedToken = getToken() const cachedUserInfo = getUserInfoData() const cachedSig = getSig() if (cachedToken && cachedUserInfo) { userInfo.value = JSON.parse(cachedUserInfo) tencentUserSig.value = JSON.parse(cachedSig) loginTencentIM() return } const res = await getUserData() await setUserInfo(res.data) loginTencentIM() return } /** * 设置用户信息 */ const setUserInfo = async data => { const res = await getTencentUserSig() tencentUserSig.value = res.data userInfo.value = data setUserInfoData(data) setSig(res.data) } /** * 登录腾讯 IM */ const loginTencentIM = async () => { await TUILogin.login({ SDKAppID: tencentUserSig.value.sdkappID, userID: tencentUserSig.value.userId, userSig: tencentUserSig.value.userSig, framework: `vue3` }) // #ifdef APP-PLUS await useLoginState().login({ sdkAppID: tencentUserSig.value.sdkappID, userID: tencentUserSig.value.userId, userSig: tencentUserSig.value.userSig }) // #endif } /** * 清除用户信息(退出登录) */ const clearUserInfo = async () => { const show = await showDialog('提示', '确定要退出登录吗?') if (show) { await userLogout() await logout() } } /** * 退出登录(不带提示) */ const logout = async () => { userInfo.value = null clearToken() removeUserInfoData() removeSig() removeFontSize() await TUILogin.logout().then(() => { reLaunch('/pages/login/login') }) // #ifdef APP-PLUS await useLoginState().logout() // #endif } /** 刷新用户信息(如用户信息被修改) */ const refreshUserInfo = async () => { const res = await getUserData() await setUserInfoData(res.data) userInfo.value = res.data } /** * 更新部分用户信息(例如昵称、头像) */ const updateUserInfo = async partialData => { if (!userInfo.value) return await updateUserData(partialData) await refreshUserInfo() } /** 更新字体大小 */ const updateFontSize = async fontSize => { fontSizeData.value = fontSize setFontSize(fontSize) } return { userInfo, tencentUserSig, fontSizeData, updateFontSize, logout, refreshUserInfo, fetchUserInfo, loginTencentIM, setUserInfo, clearUserInfo, updateUserInfo } })