Ai_GirlFriend/xuniYou/App.vue

243 lines
7.9 KiB
Vue
Raw Normal View History

2026-01-31 19:15:41 +08:00
<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>