268 lines
9.3 KiB
JavaScript
268 lines
9.3 KiB
JavaScript
// utils/chat-core.js - 最终角标稳定版
|
|
import GoEasy from '../static/lib/goeasy-2.13.24.esm.min';
|
|
import { jianquanxian } from './imAuth/jianquanxian';
|
|
|
|
let _convListener = null;
|
|
let _privateListener = null;
|
|
let _groupListener = null;
|
|
let _notificationHandler = null;
|
|
|
|
function initGlobalMessageSystem(app) {
|
|
app.ensureConnection = () => ensureConnection(app);
|
|
app.loadConversations = () => loadConversations(app);
|
|
app.disconnectGoEasy = () => disconnectGoEasy(app);
|
|
app.switchRoleAndReconnect = (newRole) => switchRoleAndReconnect(app, newRole);
|
|
app.updateUnreadCount = (count) => updateTabBarBadge(app, count || 0);
|
|
|
|
try {
|
|
const muted = wx.getStorageSync('notificationMuted');
|
|
if (muted !== undefined) app.globalData.messageManager.notificationMuted = muted;
|
|
} catch(e) {}
|
|
|
|
initAppStateListener(app);
|
|
initNetworkListener(app);
|
|
ensureConnection(app);
|
|
}
|
|
|
|
function getCurrentUserId() {
|
|
return (wx.goEasy && wx.goEasy.im && wx.goEasy.im.userId) || null;
|
|
}
|
|
|
|
async function ensureConnection(app) {
|
|
const role = app.globalData.currentRole || 'normal';
|
|
const uid = wx.getStorageSync('uid');
|
|
if (!uid) return;
|
|
|
|
const prefixMap = { normal: 'Boss', dashou: 'Ds', shangjia: 'Sj', guanshi: 'Gs', zuzhang: 'Zz', kaoheguan: 'Kh' };
|
|
const prefix = prefixMap[role] || 'Boss';
|
|
const targetUserId = prefix + uid;
|
|
|
|
const status = wx.goEasy.getConnectionStatus ? wx.goEasy.getConnectionStatus() : 'disconnected';
|
|
if (status === 'connected' || status === 'reconnected') {
|
|
const currentUserId = getCurrentUserId();
|
|
if (currentUserId === targetUserId) {
|
|
registerGlobalListeners(app);
|
|
await subscribeAllGroups(app);
|
|
loadConversations(app);
|
|
registerNotification(app);
|
|
// 强制立即更新一次角标,避免切后台后不显示
|
|
setTimeout(() => { loadConversations(app); }, 500);
|
|
return;
|
|
} else {
|
|
wx.goEasy.disconnect();
|
|
}
|
|
}
|
|
connectGoEasy(app, targetUserId, role);
|
|
}
|
|
|
|
function connectGoEasy(app, userId, identityType) {
|
|
const currentUser = app.globalData.currentUser || {
|
|
id: wx.getStorageSync('uid'),
|
|
name: '用户' + (wx.getStorageSync('uid') || '').substring(0, 6),
|
|
avatar: app.globalData.ossImageUrl + app.globalData.morentouxiang
|
|
};
|
|
wx.goEasy.connect({
|
|
id: userId,
|
|
data: {
|
|
name: currentUser.name,
|
|
avatar: currentUser.avatar || (app.globalData.ossImageUrl + app.globalData.morentouxiang),
|
|
identityType: identityType
|
|
},
|
|
onSuccess: async () => {
|
|
wx.setStorageSync('savedGoEasyConnection', JSON.stringify({
|
|
userId, identityType, lastConnectTime: Date.now(), status: 'connected'
|
|
}));
|
|
registerGlobalListeners(app);
|
|
await subscribeAllGroups(app);
|
|
loadConversations(app);
|
|
registerNotification(app);
|
|
},
|
|
onFailed: (error) => {
|
|
console.error('GoEasy连接失败', error);
|
|
if (error.code === 408) {
|
|
registerGlobalListeners(app);
|
|
loadConversations(app);
|
|
registerNotification(app);
|
|
} else {
|
|
wx.showToast({ title: '连接失败,请重试', icon: 'none' });
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function subscribeAllGroups(app) {
|
|
return new Promise((resolve) => {
|
|
if (!wx.goEasy || !wx.goEasy.im) return resolve();
|
|
wx.goEasy.im.latestConversations({
|
|
onSuccess: (result) => {
|
|
const conversations = result?.content?.conversations || result?.conversations || [];
|
|
const groupIds = conversations.filter(c => c.type === 'group' && c.groupId).map(c => c.groupId);
|
|
if (groupIds.length && wx.goEasy.im.subscribeGroup) {
|
|
wx.goEasy.im.subscribeGroup({
|
|
groupIds: groupIds,
|
|
onSuccess: () => resolve(),
|
|
onFailed: () => resolve()
|
|
});
|
|
} else {
|
|
resolve();
|
|
}
|
|
},
|
|
onFailed: () => resolve()
|
|
});
|
|
});
|
|
}
|
|
|
|
function registerGlobalListeners(app) {
|
|
if (!wx.goEasy || !wx.goEasy.im) return;
|
|
if (_convListener) {
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.CONVERSATIONS_UPDATED, _convListener);
|
|
}
|
|
if (_privateListener) {
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, _privateListener);
|
|
}
|
|
if (_groupListener) {
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.GROUP_MESSAGE_RECEIVED, _groupListener);
|
|
}
|
|
|
|
_convListener = (result) => {
|
|
const unreadTotal = result.unreadTotal || 0;
|
|
updateTabBarBadge(app, unreadTotal);
|
|
app.emitEvent('conversationsUpdated', result);
|
|
};
|
|
wx.goEasy.im.on(wx.GoEasy.IM_EVENT.CONVERSATIONS_UPDATED, _convListener);
|
|
|
|
_privateListener = () => { loadConversations(app); };
|
|
wx.goEasy.im.on(wx.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, _privateListener);
|
|
|
|
_groupListener = () => { loadConversations(app); };
|
|
wx.goEasy.im.on(wx.GoEasy.IM_EVENT.GROUP_MESSAGE_RECEIVED, _groupListener);
|
|
}
|
|
|
|
function loadConversations(app) {
|
|
if (!getCurrentUserId()) return;
|
|
wx.goEasy.im.latestConversations({
|
|
onSuccess: (result) => {
|
|
const unreadTotal = result.unreadTotal || 0;
|
|
updateTabBarBadge(app, unreadTotal);
|
|
app.emitEvent('conversationsUpdated', result);
|
|
subscribeAllGroups(app);
|
|
},
|
|
onFailed: (err) => console.error('加载会话失败', err)
|
|
});
|
|
}
|
|
|
|
function updateTabBarBadge(app, unreadCount) {
|
|
const badgeText = unreadCount > 0 ? (unreadCount > 99 ? '99+' : String(unreadCount)) : '';
|
|
app.globalData.messageManager.unreadTotal = unreadCount;
|
|
app.emitEvent('tabBarBadgeChanged', { badgeText, showRedDot: unreadCount > 0 });
|
|
// 直接更新组件,确保角标立即显示
|
|
try {
|
|
const pages = getCurrentPages();
|
|
if (pages.length) {
|
|
const tabBar = pages[pages.length-1].selectComponent('#custom-tab-bar');
|
|
if (tabBar && tabBar.setData) tabBar.setData({ badgeText });
|
|
// 兼容 getTabBar 方式
|
|
const page = pages[pages.length-1];
|
|
if (page.getTabBar) {
|
|
const tabBarInstance = page.getTabBar();
|
|
if (tabBarInstance && tabBarInstance.setData) tabBarInstance.setData({ badgeText });
|
|
}
|
|
}
|
|
} catch(e) {}
|
|
wx.setStorageSync('messageUnreadTotal', unreadCount);
|
|
}
|
|
|
|
function registerNotification(app) {
|
|
if (!wx.goEasy || !wx.goEasy.im) return;
|
|
if (_notificationHandler) {
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, _notificationHandler);
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.GROUP_MESSAGE_RECEIVED, _notificationHandler);
|
|
}
|
|
_notificationHandler = (message) => {
|
|
if (app.globalData.messageManager.notificationMuted) return;
|
|
const pages = getCurrentPages();
|
|
if (pages.length) {
|
|
const curPage = pages[pages.length - 1];
|
|
if (curPage.route === 'pages/liaotian/liaotian' || curPage.route === 'pages/qunliaotian/qunliaotian') return;
|
|
}
|
|
const senderName = message.senderData?.name || (message.senderId || '用户');
|
|
let content = '';
|
|
if (message.type === 'text') content = message.payload?.text || '[文本]';
|
|
else if (message.type === 'image') content = '[图片]';
|
|
else if (message.type === 'audio') content = '[语音]';
|
|
else content = '[新消息]';
|
|
if (app.globalData.globalNotification && app.globalData.globalNotification.show) {
|
|
app.globalData.globalNotification.show({
|
|
senderName, content, message,
|
|
notificationType: message.groupId ? 'group' : 'private',
|
|
groupId: message.groupId, orderId: message.orderId
|
|
});
|
|
} else {
|
|
wx.showToast({ title: `${senderName}: ${content}`, icon: 'none', duration: 2000 });
|
|
}
|
|
};
|
|
wx.goEasy.im.on(wx.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, _notificationHandler);
|
|
wx.goEasy.im.on(wx.GoEasy.IM_EVENT.GROUP_MESSAGE_RECEIVED, _notificationHandler);
|
|
}
|
|
|
|
function disconnectGoEasy(app) {
|
|
if (_convListener) {
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.CONVERSATIONS_UPDATED, _convListener);
|
|
_convListener = null;
|
|
}
|
|
if (_privateListener) {
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, _privateListener);
|
|
_privateListener = null;
|
|
}
|
|
if (_groupListener) {
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.GROUP_MESSAGE_RECEIVED, _groupListener);
|
|
_groupListener = null;
|
|
}
|
|
if (_notificationHandler) {
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, _notificationHandler);
|
|
wx.goEasy.im.off(wx.GoEasy.IM_EVENT.GROUP_MESSAGE_RECEIVED, _notificationHandler);
|
|
_notificationHandler = null;
|
|
}
|
|
wx.goEasy.disconnect({ onSuccess: () => {}, onFailed: () => {} });
|
|
wx.removeStorageSync('savedGoEasyConnection');
|
|
}
|
|
|
|
async function switchRoleAndReconnect(app, newRole) {
|
|
await disconnectGoEasy(app);
|
|
app.globalData.currentRole = newRole;
|
|
wx.setStorageSync('currentRole', newRole);
|
|
ensureConnection(app);
|
|
return true;
|
|
}
|
|
|
|
function initAppStateListener(app) {
|
|
let isActive = true;
|
|
wx.onAppShow(() => {
|
|
if (!isActive) return;
|
|
const status = wx.goEasy.getConnectionStatus ? wx.goEasy.getConnectionStatus() : 'disconnected';
|
|
if (status !== 'connected' && status !== 'reconnected') {
|
|
ensureConnection(app);
|
|
} else {
|
|
// 连接存在但可能角标未更新,强制拉取并更新
|
|
loadConversations(app);
|
|
// 额外确保角标组件刷新
|
|
setTimeout(() => {
|
|
const unread = app.globalData.messageManager.unreadTotal || 0;
|
|
updateTabBarBadge(app, unread);
|
|
}, 500);
|
|
}
|
|
});
|
|
wx.onAppHide(() => {});
|
|
}
|
|
|
|
function initNetworkListener(app) {
|
|
wx.onNetworkStatusChange((res) => {
|
|
if (res.isConnected) {
|
|
setTimeout(() => {
|
|
ensureConnection(app);
|
|
}, 1000);
|
|
}
|
|
});
|
|
}
|
|
|
|
module.exports = { initGlobalMessageSystem }; |