243 lines
7.9 KiB
Vue
243 lines
7.9 KiB
Vue
|
|
<script>
|
|||
|
|
/* EaseIM */
|
|||
|
|
import '@/EaseIM';
|
|||
|
|
import { emConnectListener, emMountGlobalListener } from '@/EaseIM/listener';
|
|||
|
|
import { emInsertInformMessage } from '@/EaseIM/utils';
|
|||
|
|
import { emConnect, emUserInfos, emGroups, emContacts } from '@/EaseIM/imApis';
|
|||
|
|
import emHandleReconnect from '@/EaseIM/utils/emHandleReconnect';
|
|||
|
|
import {
|
|||
|
|
CONNECT_CALLBACK_TYPE,
|
|||
|
|
HANDLER_EVENT_NAME,
|
|||
|
|
CHAT_TYPE,
|
|||
|
|
} from '@/EaseIM/constant';
|
|||
|
|
import { useLoginStore } from '@/stores/login';
|
|||
|
|
import { useGroupStore } from '@/stores/group';
|
|||
|
|
import { useConversationStore } from '@/stores/conversation';
|
|||
|
|
import { useContactsStore } from '@/stores/contacts';
|
|||
|
|
import { EMClient, EaseSDK } from './EaseIM';
|
|||
|
|
// #ifdef APP-PLUS
|
|||
|
|
/* callKit */
|
|||
|
|
import { useInitCallKit } from '@/components/emCallKit';
|
|||
|
|
import useCallKitEvent from '@/components/emCallKit/callKitManage/useCallKitEvent';
|
|||
|
|
// #endif
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
setup() {
|
|||
|
|
console.log(uni.getStorageSync("token"),11111)
|
|||
|
|
if (!uni.getStorageSync("token")) {
|
|||
|
|
uni.reLaunch({
|
|||
|
|
url:'/pages/login/index'
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
const loginStore = useLoginStore();
|
|||
|
|
const groupStore = useGroupStore();
|
|||
|
|
const contactsStore = useContactsStore();
|
|||
|
|
/* 链接所需监听回调 */
|
|||
|
|
//传给监听callback回调
|
|||
|
|
const connectedCallback = (type) => {
|
|||
|
|
console.log('>>>>>连接成功回调', type);
|
|||
|
|
if (type === CONNECT_CALLBACK_TYPE.CONNECT_CALLBACK) {
|
|||
|
|
onConnectedSuccess();
|
|||
|
|
}
|
|||
|
|
if (type === CONNECT_CALLBACK_TYPE.DISCONNECT_CALLBACK) {
|
|||
|
|
onDisconnect();
|
|||
|
|
}
|
|||
|
|
if (type === CONNECT_CALLBACK_TYPE.RECONNECTING_CALLBACK) {
|
|||
|
|
onReconnecting();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
//IM连接成功
|
|||
|
|
const { closeEaseIM } = emConnect();
|
|||
|
|
const onConnectedSuccess = () => {
|
|||
|
|
const { loginUserId } = loginStore.loginUserBaseInfos || {};
|
|||
|
|
const finalLoginUserId = loginUserId || EMClient.user;
|
|||
|
|
if (!loginStore.loginStatus) {
|
|||
|
|
fetchLoginUserNeedData();
|
|||
|
|
}
|
|||
|
|
loginStore.setLoginUserBaseInfos({ loginUserId: finalLoginUserId });
|
|||
|
|
loginStore.setLoginStatus(true);
|
|||
|
|
uni.hideLoading();
|
|||
|
|
console.log('*-------------')
|
|||
|
|
// uni.redirectTo({
|
|||
|
|
// url: '/pages/friends/index',
|
|||
|
|
// });
|
|||
|
|
};
|
|||
|
|
//IM断开连接
|
|||
|
|
const { actionEMReconnect } = emHandleReconnect();
|
|||
|
|
const onDisconnect = () => {
|
|||
|
|
//断开回调触发后,如果业务登录状态为true则说明异常断开需要重新登录
|
|||
|
|
if (!loginStore.loginStatus) {
|
|||
|
|
// uni.showToast({
|
|||
|
|
// title: '退出登录',
|
|||
|
|
// icon: 'none',
|
|||
|
|
// duration: 2000,
|
|||
|
|
// });
|
|||
|
|
// uni.redirectTo({
|
|||
|
|
// url: '../login/login',
|
|||
|
|
// });
|
|||
|
|
closeEaseIM();
|
|||
|
|
} else {
|
|||
|
|
//执行通过token进行重新登录
|
|||
|
|
actionEMReconnect();
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
//IM重连中
|
|||
|
|
const onReconnecting = () => {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: 'IM 重连中...',
|
|||
|
|
icon: 'none',
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
//挂载IM websocket连接成功监听
|
|||
|
|
emConnectListener(connectedCallback);
|
|||
|
|
const { fetchUserInfoWithLoginId, fetchOtherInfoFromServer } =
|
|||
|
|
emUserInfos();
|
|||
|
|
const { fetchJoinedGroupListFromServer } = emGroups();
|
|||
|
|
const { fetchContactsListFromServer } = emContacts();
|
|||
|
|
//获取登录所需基础参数
|
|||
|
|
const fetchLoginUserNeedData = async () => {
|
|||
|
|
//获取好友列表
|
|||
|
|
const friendList = await fetchContactsListFromServer();
|
|||
|
|
await contactsStore.setFriendList(friendList);
|
|||
|
|
fetchJoinedGroupList();
|
|||
|
|
if (friendList.length) {
|
|||
|
|
//获取好友用户属性
|
|||
|
|
const friendProfiles = await fetchOtherInfoFromServer(friendList);
|
|||
|
|
contactsStore.setFriendUserInfotoMap(friendProfiles);
|
|||
|
|
}
|
|||
|
|
//获取当前登录用户好友信息
|
|||
|
|
const profiles = await fetchUserInfoWithLoginId();
|
|||
|
|
await loginStore.setLoginUserProfiles(profiles[EMClient.user]);
|
|||
|
|
};
|
|||
|
|
//获取加入的群组列表
|
|||
|
|
const fetchJoinedGroupList = async () => {
|
|||
|
|
//获取群组列表
|
|||
|
|
const joinedGroupList = await fetchJoinedGroupListFromServer();
|
|||
|
|
console.log('>>>>>>>>>joinedGroupList', joinedGroupList);
|
|||
|
|
await groupStore.setJoinedGroupList(joinedGroupList);
|
|||
|
|
};
|
|||
|
|
//挂载全局所需监听回调【好友关系、消息监听、群组监听】
|
|||
|
|
/* 退群解散群逻辑 */
|
|||
|
|
const conversationStore = useConversationStore();
|
|||
|
|
const globaleventcallback = (listenerType, event) => {
|
|||
|
|
//群组事件监听
|
|||
|
|
if (listenerType === HANDLER_EVENT_NAME.GROUP_EVENT) {
|
|||
|
|
const { operation, id } = event;
|
|||
|
|
console.log('>>>>>触发群组事件回调。');
|
|||
|
|
switch (operation) {
|
|||
|
|
case 'directJoined':
|
|||
|
|
{
|
|||
|
|
uni.showToast({ icon: 'none', title: `被拉入群组${id}` });
|
|||
|
|
fetchJoinedGroupList();
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 'removeMember':
|
|||
|
|
{
|
|||
|
|
uni.showToast({ icon: 'none', title: `从${id}群中被移出` });
|
|||
|
|
fetchJoinedGroupList();
|
|||
|
|
//删除该群相关会话
|
|||
|
|
conversationStore.deleteConversation(id);
|
|||
|
|
//如果在该群会话中则退出会话
|
|||
|
|
if (conversationStore.chattingId === id) {
|
|||
|
|
uni.reLaunch({
|
|||
|
|
url: '../home/index',
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case 'destroy':
|
|||
|
|
{
|
|||
|
|
uni.showToast({ icon: 'none', title: `${id}已解散` });
|
|||
|
|
fetchJoinedGroupList();
|
|||
|
|
conversationStore.deleteConversation(id);
|
|||
|
|
//如果在该群会话中则退出会话
|
|||
|
|
if (conversationStore.chattingId === id) {
|
|||
|
|
console.log('>>>>会话中退出聊天页面');
|
|||
|
|
uni.reLaunch({
|
|||
|
|
url: '../home/index',
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (listenerType === HANDLER_EVENT_NAME.ERROR_EVENT) {
|
|||
|
|
const { type } = event;
|
|||
|
|
switch (type) {
|
|||
|
|
case 206:
|
|||
|
|
{
|
|||
|
|
uni.showToast({
|
|||
|
|
icon: 'none',
|
|||
|
|
title: '有其他用户登录,断开连接!',
|
|||
|
|
});
|
|||
|
|
loginStore.setLoginStatus(false);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
emMountGlobalListener(globaleventcallback);
|
|||
|
|
|
|||
|
|
/* callKit仅支持原生端使用 */
|
|||
|
|
// #ifdef APP-PLUS
|
|||
|
|
const { setCallKitClient } = useInitCallKit();
|
|||
|
|
setCallKitClient(EMClient, EaseSDK.message);
|
|||
|
|
//监听callkit状态变化展示对应的页面
|
|||
|
|
const { EVENT_NAME, CALLKIT_EVENT_CODE, SUB_CHANNEL_EVENT } =
|
|||
|
|
useCallKitEvent();
|
|||
|
|
const { insertInformMessage } = emInsertInformMessage();
|
|||
|
|
SUB_CHANNEL_EVENT(EVENT_NAME, (params) => {
|
|||
|
|
const { type, ext, callType, eventHxId } = params;
|
|||
|
|
console.log('>>>>>>订阅到callkit事件发布', params);
|
|||
|
|
//弹出待接听事件
|
|||
|
|
switch (type.code) {
|
|||
|
|
case CALLKIT_EVENT_CODE.ALERT_SCREEN:
|
|||
|
|
{
|
|||
|
|
console.log('>>>>>>监听到对应code', type.code);
|
|||
|
|
uni.navigateTo({
|
|||
|
|
url: '../emCallKitPages/alertScreen',
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CALLKIT_EVENT_CODE.TIMEOUT:
|
|||
|
|
{
|
|||
|
|
console.log('>>>>>通话超时未接听');
|
|||
|
|
insertInformMessage({
|
|||
|
|
to: params.eventHxId,
|
|||
|
|
chatType:
|
|||
|
|
params.callType > 1
|
|||
|
|
? CHAT_TYPE.GROUP_CHAT
|
|||
|
|
: CHAT_TYPE.SINGLE_CHAT,
|
|||
|
|
msg: params.ext.message,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case CALLKIT_EVENT_CODE.CALLEE_BUSY:
|
|||
|
|
{
|
|||
|
|
insertInformMessage({
|
|||
|
|
to: params.eventHxId,
|
|||
|
|
chatType:
|
|||
|
|
params.callType > 1
|
|||
|
|
? CHAT_TYPE.GROUP_CHAT
|
|||
|
|
: CHAT_TYPE.SINGLE_CHAT,
|
|||
|
|
msg: params.ext.message,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
// #endif
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
</script>
|
|||
|
|
<style lang="scss">
|
|||
|
|
@import './app.css';
|
|||
|
|
</style>
|