app/utils/handleim.js

235 lines
6.5 KiB
JavaScript
Raw Normal View History

2025-04-30 14:28:07 +08:00
import {
getUserimInfo
} from '@/api/members';
2025-05-07 17:45:16 +08:00
import {
refreshTokenFn
} from "@/api/login.js";
2025-04-30 14:28:07 +08:00
2025-05-07 17:45:16 +08:00
import storage from "@/utils/storage.js";
// ---------------------------
2025-04-30 14:28:07 +08:00
import {
TUILogin
} from '@tencentcloud/tui-core';
import {
TUIConversationService,
} from '@tencentcloud/chat-uikit-engine';
import {
TUIGlobal
} from '@tencentcloud/universal-api';
import * as Push from '@/uni_modules/TencentCloud-Push';
// sdkStateNotReady IM断了
// onMessageReceived 收到推送的单聊、群聊、群提示、群系统通知的新消息
// im断开链接时
const onSdkNotReady = function(event) {
console.log('IM断了')
2025-05-07 17:45:16 +08:00
// var islogin = storage.getVlogUserInfo();
// if (islogin != null) {
// // 重新执行IM登录
// loginIm()
// }
2025-04-30 14:28:07 +08:00
}
const onMessageReceived = function(event) {
// event.data - 存储 Message 对象的数组 - [Message]
// 这里处理消息通知相关业务4.0版本后续进行开发
console.log('收到了消息通知内容')
console.log(event.data)
}
const pushClick = (res) => {
console.log('notification clicked', res);
// 解析扩展信息,跳转到相应的会话(代码仅供参考,发布前需要完善)
try {
const data = JSON.parse(res.data);
const conv_type = data?.entity?.chatType === 1 ? 'C2C' : 'GROUP';
// 根据推送信息拼的 conversationID
const conversationID = `${conv_type}${data.entity.sender}`;
// 切换会话
TUIConversationService.switchConversation(conversationID);
const chatPath = '/TUIKit/components/TUIChat/index';
uni.navigateTo({
url: chatPath
});
} catch (error) {
console.log('error', error);
}
}
const pushOnLine = (res) => {
// res 为消息内容
console.log('在线推送', res);
}
const pushMsgBack = (res) => {
// res 为被撤回的消息 ID
console.log('撤回消息推送', res);
}
2025-05-07 17:45:16 +08:00
export const loginIm = async () => {
2025-04-30 14:28:07 +08:00
console.log('执行im登录')
2025-05-07 17:45:16 +08:00
if (storage.getRefreshToken() && storage.getHasLogin()) {
var tokenResult = await refreshTokenFn(storage.getRefreshToken())
if (tokenResult.data.result) {
var {
accessToken,
refreshToken
} = tokenResult.data.result;
storage.setAccessToken(accessToken);
storage.setRefreshToken(refreshToken);
console.log('----------IM初始化登录--------------刷新token成功')
} else {
console.log('-------------------IM初始化登录-----刷新token失败');
return;
}
}
2025-04-30 14:28:07 +08:00
getUserimInfo()
.then(({
data
}) => {
console.log(data)
if (data.code == 200) {
const par = data.result;
TUILogin.login({
SDKAppID: par.sdkAppId,
userID: par.userID,
userSig: par.userSig,
useUploadPlugin: true, // If you need to send rich media messages, please set to true.
framework: `vue2` // framework used vue2 / vue3
}).then((res) => {
var {
SDKAppID,
userID,
userSig,
chat
} = TUILogin.getContext();
getApp().globalData.chat = chat;
console.log('我是个老板', res)
// 每次登录先移除,避免多次监听
chat.off('sdkStateNotReady', onSdkNotReady);
chat.off('onMessageReceived', onMessageReceived);
// 监听im断开链接后重新链接
chat.on('sdkStateNotReady', onSdkNotReady);
// 监听消息通知
chat.on('onMessageReceived', onMessageReceived);
Push.setRegistrationID(par.userID, () => {
console.log('设置id设置id设置id设置id设置id设置id设置id设置id设置id设置id', par.userID);
Push.registerPush(
par.sdkAppId,
'vkFpe55aYqfV7Sk5uGaoxhEstJ3tcI9dquk7JwG1GloDSLD2HeMWeQweWWXgNlhC',
(data) => {
console.log('registerPush ok', data);
Push.getRegistrationID((registrationID) => {
console.log('getRegistrationID ok',
registrationID);
});
},
(errCode, errMsg) => {
console.error('registerPush failed', errCode, errMsg);
}
);
});
// 监听通知栏点击事件,获取推送扩展信息
Push.addPushListener(Push.EVENT.NOTIFICATION_CLICKED, pushClick);
// 监听在线推送
Push.addPushListener(Push.EVENT.MESSAGE_RECEIVED, pushOnLine);
// 监听在线推送被撤回
Push.addPushListener(Push.EVENT.MESSAGE_REVOKED, pushMsgBack);
});
} else {
// 接口返回非 200 状态码,跳转登录页面
uni.navigateTo({
url: '/pages/passport/login'
});
}
})
.catch((e) => {
console.log(e)
});
}
export const clearIm = async () => {
var chat = getApp().globalData.chat;
var res_out = await chat.logout()
console.log(res_out)
console.log('IM退出登录')
getApp().globalData.chat = null;
// chat.logout中做了关闭推送服务
// Push.unRegisterPush().then(res => {
// //反注册关闭推送服务
// console.log(res)
// console.log('反注册关闭推送服务')
// })
Push.removePushListener(Push.EVENT.NOTIFICATION_CLICKED, pushClick)
Push.removePushListener(Push.EVENT.MESSAGE_RECEIVED, pushOnLine)
Push.removePushListener(Push.EVENT.MESSAGE_REVOKED, pushMsgBack)
}
export const conversationData = async () => {
// 会话列表
try {
const chatInstance = getApp().globalData.chat
console.log(chatInstance)
var res = await chatInstance.getConversationList()
return res
} catch (err) {
console.log(err)
}
}
export const sendVlogCustomMsg = async (i, vlogItem) => {
// i=IM相关用户信息
console.log(i);
console.log(vlogItem);
try {
var chat = getApp().globalData.chat;
var conversationType = i.type;
if (conversationType == 'C2C') {
var to = i.userProfile.userID;
} else {
var to = i.groupProfile.groupID;
}
var message = chat.createCustomMessage({
to,
conversationType,
payload: {
data: JSON.stringify({
businessID: 'video',
title: vlogItem.vlogerName,
description: vlogItem.content,
price: '分享好视频',
link: '/pages/me/vlog?vlogId=' + vlogItem.vlogId,
imageUrl: vlogItem.cover || vlogItem.firstFrameImg
}),
description: '[分享视频]',
extension: '',
},
cloudCustomData: JSON.stringify({
pushTitle: vlogItem.vlogerName,
pushDesc: vlogItem.content,
businessID: 'video', // 保持一致
})
})
var result = await chat.sendMessage(message)
console.log('发送成功:', result);
return result; // 成功就把发送结果返回出去
} catch (err) {
console.log(err);
throw err;
}
}