You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import Vue from 'vue'
import define from '@/utils/define'
import store from '@/store'
const Socket = {
contime: 0,
ws: null,
initSocket() {
try {
const token = uni.getStorageSync('token') || ''
const sys = uni.getStorageSync('systemInfo') || ''
Socket.ws = uni.connectSocket({
url: define.webSocketUrl + '/' + encodeURIComponent(token),
// #ifdef APP-PLUS
header: {
'User-Agent': sys
},
// #endif
success() {
// console.log("websocket连接成功")
},
});
store.state.chat.socket = Socket.ws
uni.onSocketOpen(res => {
Socket.contime = 0
const msg = JSON.stringify({
method: "OnConnection",
token,
mobileDevice: true
});
Socket.sendMsg(msg)
});
uni.onSocketError(res => {
store.state.chat.socket = null
setTimeout(() => {
Socket.contime += 1
if (Socket.contime <= 10) {
if (Socket.contime >= 3) {
uni.showToast({
title: 'IM通讯正在连接:' + '连接第' + Socket.contime + '次!稍后...',
icon: 'none'
})
}
Socket.reConnect();
} else {
uni.showToast({
title: 'IM通讯连接失败联系服务器管理员',
icon: 'none'
})
}
}, 10)
});
uni.onSocketClose(res => {
store.state.chat.socket = null
});
uni.onSocketMessage(res => {
const data = JSON.parse(res.data)
let options = {
cover: false,
sound: 'system',
title: data.title
};
switch (data.method) {
case "initMessage": //初始化
const msgInfo = {
messageText: data.messageDefaultText || '暂无数据',
messageCount: data.unreadTotalCount || 0,
}
let badgeNum = data.unreadTotalCount || 0
for (let i = 0; i < data.unreadNums.length; i++) {
badgeNum = badgeNum + data.unreadNums[i].unreadNum
}
store.commit('chat/SET_BADGE_NUM', badgeNum)
store.commit('chat/SET_MSGINFO', msgInfo)
break;
case "Online": //在线用户
break;
case "Offline": //离线用户
break;
case "sendMessage": //发送消息
store.dispatch('chat/sendMessage', data)
break;
case "receiveMessage": //接收消息
// #ifdef APP-PLUS
plus.push.createMessage('你有一条聊天消息', data, options);
// #endif
store.dispatch('chat/receiveMessage', data)
break;
case "messageList": //消息列表
store.dispatch('chat/getMessageList', data)
break;
case "messagePush": //消息推送
// #ifdef APP-PLUS
let content = data.messageType == 2 ? '流程' : '公告'
plus.push.createMessage(`你有一条${content}消息`, data, options);
// #endif
store.dispatch('chat/messagePush', data)
break;
case "closeSocket": //断开websocket连接
uni.closeSocket()
break;
case "logout":
uni.showToast({
title: data.msg || '登录已过期',
icon: 'none',
complete: () => {
setTimeout(() => {
store.dispatch('user/resetToken').then(() => {
uni.closeSocket()
uni.reLaunch({
url: '/pages/login/index'
})
})
}, 1500)
}
})
break;
default:
break;
}
});
} catch (e) {}
},
sendMsg(msg) {
uni.sendSocketMessage({
data: msg,
fail: (e) => {
Socket.reConnect()
}
})
},
//重连
reConnect() {
Socket.initSocket()
},
};
export default Socket