Ai_GirlFriend/xuniYou/App.vue
2026-01-31 19:15:41 +08:00

243 lines
7.9 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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