Files
Wechat/_backup_pre_redesign/chat-core.js

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 };