import { ref, watch } from "vue"; import { defineStore } from "pinia"; import api from '@/utils/api'; import { toast } from '@/utils/widget'; import { initGlobalTIM, globalTimChatManager } from "@/utils/tim-chat.js"; import { globalUnreadListenerManager } from "@/utils/global-unread-listener.js"; const env = __VITE_ENV__; export default defineStore("accountStore", () => { const appid = env.MP_WX_APP_ID; const account = ref(null); const loading = ref(false) const isIMInitialized = ref(false); const openid = ref(""); const externalUserId = ref(''); async function login(phoneCode = '') { if (loading.value) return; loading.value = true; try { const { code } = await uni.login({ appid, provider: "weixin", scope: "snsapi_base", }); if (code) { const res = await api('wxAppLogin', { appId: appid, phoneCode, code }); loading.value = false if (res.success && res.data) { account.value = res.data; openid.value = res.data.openid; // 保存账户信息和 openId 到本地存储 uni.setStorageSync('account', res.data); uni.setStorageSync('openid', res.data.openid); initIMAfterLogin(openid.value) return res.data } } toast('登录失败,请重新登录'); } catch (e) { toast('登录失败,请重新登录'); } loading.value = false } async function initIMAfterLogin() { if (isIMInitialized.value) { return true; } try { // 使用 openid 作为 userID 初始化 IM const userID = openid.value || uni.getStorageSync('openid'); if (!userID) { console.log('未获取到有效的 userId,跳过 IM 初始化'); return false; } console.log('开始初始化 IM,userID:', userID); const success = await initGlobalTIM(userID); if (!success) { console.log('initGlobalTIM 返回失败,跳过 IM 初始化'); return false; } // 验证 TIM 实例是否真正创建成功 if (!globalTimChatManager || !globalTimChatManager.tim) { console.log('IM 初始化后 TIM 实例不存在,跳过 IM 初始化'); return false; } isIMInitialized.value = true; console.log('IM 初始化成功'); // IM 初始化成功后,设置全局未读消息监听 globalUnreadListenerManager.setup(); return true; } catch (error) { console.log('IM初始化异常,跳过 IM 初始化:', error.message); return false; } } // 退出登录 async function logout() { try { // 退出腾讯IM if (globalTimChatManager && globalTimChatManager.tim) { console.log('开始退出腾讯IM'); await globalTimChatManager.destroy(); console.log('腾讯IM退出成功'); } // 清除全局未读监听 if (globalUnreadListenerManager.isInitialized) { globalUnreadListenerManager.destroy(); } } catch (error) { console.error('退出腾讯IM失败:', error); } // 清空账户信息 account.value = null; openid.value = ""; isIMInitialized.value = false; // 清除本地存储 uni.removeStorageSync('account'); uni.removeStorageSync('openid'); // 清除 tabBar 徽章 uni.removeTabBarBadge({ index: 1 }); } async function getExternalUserId(corpId) { const unionid = account.value?.unionid; const openid = account.value?.openid; if (!(corpId && unionid && openid) || externalUserId.value) return; const res = await api('getUnionidToExternalUserid', { unionid, openid, corpId }, false); if (res && res.success && typeof res.data === 'string' && res.data.trim()) { externalUserId.value = res.data.trim(); } } return { account, login, initIMAfterLogin, logout, openid, isIMInitialized, externalUserId, getExternalUserId } })