import { GetRoomInfo, GetRoomUser, GetShowUser, GetApplySpeak, PostMuteAll, PostOpenMicr, PostOpenCamera, DeleteRoomManager } from '../../api/meeting/index' import { GetRoomRtcToken } from '../../api/form/index' import { agora } from '../../utils/agora' import { onInvoke, onSignalr, getSignIr, offSignalr, onStop } from '../../utils/singlr' import { role, getStorage } from '../../utils/utils' import { Message, Toast } from 'tdesign-miniprogram'; import * as signalR from "signalr-for-wx"; import dayjs from 'dayjs'; const computedBehavior = require('miniprogram-computed').behavior; let reconnectTime = "" as any; let refreshTime = "" as any; let isAutoApplySpeakTime = "" as any; let isSpeakTime = "" as any; Page({ behaviors: [computedBehavior], data: { footerList: [ { title: '关闭听筒', titleActive: '开启听筒', active: true, icon: '/assets/icon1.png', iconActive: '/assets/icon1-active.png', show: false, }, { title: '静音', titleActive: '解除静音', active: false, icon: '/assets/icon2.png', iconActive: '/assets/icon2-active.png', show: true, }, { title: '关闭视频', titleActive: '打开视频', active: false, icon: '/assets/icon3.png', iconActive: '/assets/icon3-active.png', show: true, }, { title: '翻转', titleActive: '翻转', active: true, icon: '/assets/icon4.png', iconActive: '/assets/icon4.png', show: false, }, { title: '聊天', titleActive: '聊天', active: true, icon: '/assets/icon5.png', iconActive: '/assets/icon5.png', show: true, }, { title: '成员', titleActive: '成员', active: true, icon: '/assets/icon6.png', iconActive: '/assets/icon6.png', show: true, }, { title: '申请发言', titleActive: '结束发言', active: true, icon: '/assets/icon7.png', iconActive: '/assets/icon7-active.png', show: true, }, ], channelId: '', tabBarIndex: 1, roomInfo: '', roomUserList: [], audioList: [], userVolume: 0, chatList: [], isAdmin: 0, currentUid: '', currentUser: '', userNumer: 0, scrollTop: 0, noViewChatList: 0, applySpeakDialog: false, leaveDialog: false, userPopupVisible: false, chatPopupVisible: false, inputPopupVisible: false, isFullscreen: false, muted: false, currentRequestSpeakType: '', user: '', messageStr: '', inputStr: '', commonlyChatList: [ '能听到我说话吗?', '听得到', '听不到', '我要发言', ], isFirstShow: true, isCurrePage: true, isReconnec: false, isAutoApplySpeakDialog: false, showScroll: false, reconnecNumber: 0, setting: { voiceStimulation: true, //语音激励 } }, watch: { 'roomUserList.**': function (roomUserList) { this.setData({ isAdmin: roomUserList.filter((item: any) => (role.ID.includes(item.roleId) || item.isRoomManager) && item.isRoom).length, userNumer: roomUserList.filter((item: any) => item.isRoom).length, audioList: roomUserList.map(item => { return { volume: item.volume || '0%', volumeNumber: item.volumeNumber || 0, uid: item.uid, } }) }) const item = roomUserList.find(row => row.uid == this.data.currentUid || row.screenShareId == this.data.currentUid) if (item) { this.setData({ currentUser: item, }) if (!((role.ID.includes(item.roleId) || item.isRoomManager) && item.isRoom)) { this.getShowUser() } } }, 'footerList.**': function (footerList) { const footerListTemplate = [...footerList]; footerListTemplate[3].show = footerListTemplate[2].active // if (!footerListTemplate[1].active && !footerListTemplate[2].active) { // if (isAutoApplySpeakTime) { // clearTimeout(isAutoApplySpeakTime) // isAutoApplySpeakTime = '' // } // isAutoApplySpeakTime = setTimeout(() => { // let userItem = this.data.roomUserList.find((item: any) => item.uid === this.data.user.uid) // if (!role.ID.includes(this.data.user.roleId) && userItem && userItem.isRoomManager) { // DeleteRoomManager({ // roomId: this.data.roomInfo.id, // roomNum: this.data.channelId, // userId: userItem.uid // }) // this.setData({ // isAutoApplySpeakDialog: true // }) // } // clearTimeout(isAutoApplySpeakTime) // isAutoApplySpeakTime = '' // }, 1000 * 60 * 5); // } else { // if (isAutoApplySpeakTime) { // clearTimeout(isAutoApplySpeakTime) // isAutoApplySpeakTime = '' // } // } this.setData({ footerList: footerListTemplate }) }, 'isClicked': function (isClicked) { if (isClicked) { let timer = setTimeout(() => { this.setData({ isClicked: false, }) clearTimeout(timer) }, 10000); } }, 'isCurrePage': function (isCurrePage) { if (isCurrePage) { this.clearTimer() } else { refreshTime = setInterval(() => { GetRoomUser(this.data.channelId).then(res => { if (res.code === 200) { res.data.forEach((item: any) => { let row = this.data.roomUserList.find((row: any) => row.uid == item.uid); if (row) { row.enableCamera = item.enableCamera; row.enableMicr = item.enableMicr; row.isRoomManager = item.isRoomManager; row.isAdmin = role.ID.includes(item.roleId) || item.isRoomManager; } }); this.changeAgoraDevice() } }) }, 1000 * 30) } }, 'currentUid': function (currentUid) { this.data.roomUserList.forEach(item => { if (item.src) { if (item.uid == currentUid) { agora.setRemoteVideoStreamType(Number(item.uid), 0) } else { agora.setRemoteVideoStreamType(Number(item.uid), 1) } } }); const item = this.data.roomUserList.find(row => row.uid == currentUid || row.screenShareId == currentUid) if (item) { this.setData({ currentUser: item, }) } }, 'isAdmin': function (isAdmin) { const query = wx.createSelectorQuery() query.select('#meeting-content-smallvideo').fields({ size: true, scrollOffset: true }, (res) => { this.setData({ showScroll: Math.ceil(isAdmin * 94) > Math.ceil(res.height) }) }) query.exec() } }, async onLoad(option) { wx.enableAlertBeforeUnload({ message: "确定要离开房间吗?" }) this.setData({ channelId: option.roomNum, user: await getStorage('user') }) await this.joinChannel() await this.getRoomUser() await this.getShowUser() this.startClientEvent() this.startSignalr() await this.getRoomInfo() const that = this; wx.getStorage({ key: 'historicalList', success(res: any) { const list = [...res.data] if (list.length >= 3) { list.splice(0, 1) } list.push({ nickName: option.nickName, roomNum: option.roomNum, roomName: that.data.roomInfo.roomName }) wx.setStorage({ key: "historicalList", data: list }) }, fail() { wx.setStorage({ key: "historicalList", data: [{ nickName: option.nickName, roomNum: option.roomNum, roomName: that.data.roomInfo.roomName }] }) } }) }, onReady() { wx.onNetworkStatusChange(this.listener) this.setStorageData() }, async onShow() { wx.setKeepScreenOn({ keepScreenOn: true, }); this.setData({ isCurrePage: false }) if (this.data.isFirstShow) { this.setData({ isFirstShow: false, }) } else { this.reconnecFun() } isSpeakTime = setInterval(() => { if (this.data.setting.voiceStimulation) { function getMaxObject(arr) { let maxObject = arr[0]; for (let i = 1; i < arr.length; i++) { if (arr[i].volumeNumber > maxObject.volumeNumber) { maxObject = arr[i]; } } return maxObject; } const isShare = this.data.roomUserList.find(item => item.shareSrc) const item = getMaxObject(this.data.audioList) const user = this.data.roomUserList.find(row => item.uid === row.uid) if (item && (this.data.currentUid !== item.uid && !isShare && (user && user.isRoom) && item.volumeNumber > 0 && item.uid !== this.data.user.uid)) { this.setData({ currentUid: item.uid }) } } }, 3000) }, // 隐藏 onHide() { this.setData({ isCurrePage: true, }) this.clearTimer() }, // 卸载 onUnload() { wx.offNetworkStatusChange(this.listener) this.clearTimer() }, // 设置缓存 async setStorageData() { const setting: any = await getStorage('setting') if (setting) { this.setData({ setting }) } else { wx.setStorage({ key: "setting", data: this.data.setting }) } }, // 重连 async reconnecFun() { wx.hideLoading() wx.showLoading({ title: '重连中', mask: true }) if (reconnectTime) { clearTimeout(reconnectTime) reconnectTime = '' } agora.destroy(() => { this.startReconnec() reconnectTime = setInterval(() => { this.startReconnec() }, 3000) }) }, async startReconnec() { if (getSignIr() === signalR.HubConnectionState.Connected) { clearTimeout(reconnectTime) reconnectTime = '' await GetRoomRtcToken(this.data.channelId).then(res => { if (res.code === 200) { agora.reconnecSetOption(res.data, async (bool) => { if (bool) { await this.joinChannel() this.startClientEvent() this.startSignalr() await this.getRoomUser() await this.getShowUser() Message.success({ context: this, offset: [20, 32], duration: 3000, content: '重连成功', }); this.setData({ isReconnec: false }) } else { this.setData({ isReconnec: true }) } wx.hideLoading() }) } else { wx.hideLoading() this.setData({ isReconnec: true }) } }).catch(() => { wx.hideLoading() this.setData({ isReconnec: true }) }) } else { if (this.data.reconnecNumber > 10) { this.setIsConnectedBack() } else { this.setData({ reconnecNumber: this.data.reconnecNumber + 1 }) } } }, // 清除定时器 clearTimer() { if (refreshTime) { clearInterval(refreshTime) refreshTime = '' } if (reconnectTime) { clearInterval(reconnectTime) reconnectTime = '' } if (isAutoApplySpeakTime) { clearTimeout(isAutoApplySpeakTime) isAutoApplySpeakTime = '' } if (isSpeakTime) { clearInterval(isSpeakTime) isSpeakTime = '' } }, // 显示聊天输入框 showInputPopup() { this.setData({ inputPopupVisible: true, inputStr: this.data.messageStr, chatPopupVisible: false }) }, // 隐藏聊天输入框 hideInputPopup() { this.setData({ inputPopupVisible: false, messageStr: this.data.inputStr, chatPopupVisible: true }) }, // 申请发言提示框 confirmIsAutoApplySpeakDialog() { if (!this.data.isClicked) { GetApplySpeak(this.data.channelId).then(res => { if (res.code === 200) { this.setData({ isClicked: true, }) this.message('申请发言成功').success() } this.setData({ isAutoApplySpeakDialog: false }) }).catch(() => { this.setData({ isAutoApplySpeakDialog: false }) }) } else { this.message('申请太频繁了,请稍后重试!').error(); } }, // 关闭发言断开弹窗 cancelIsAutoApplySpeakDialog() { this.setData({ isAutoApplySpeakDialog: false }) }, // socket监听 startSignalr() { offSignalr() onSignalr(async (item) => { if (this.data.isCurrePage) { const item = this.data.roomUserList.find(row => row.uid === this.data.user.uid) if (item && !item.isRoomManager) { return } } const userInfo: any = await getStorage('user') switch (item.key) { // 聊天 case 'ReceiveMessage': if (!this.data.chatPopupVisible) { this.setData({ noViewChatList: this.data.noViewChatList += 1 }) } item.timestamp = dayjs(item.timestamp).format('HH:mm:ss') this.setData({ chatList: [...this.data.chatList, item] }) this.scrollToBottom() break; // 扩展操作 case 'Operation': // 4:屏幕共享 break; // 全员离开房间 case 'AllLeave': wx.setStorage({ key: "isAllLeave", data: true }) this.closeRoom() break; // 移出会议 case 'ForceExitRoom': wx.setStorage({ key: "isForceExitRoom", data: true }) this.closeRoom() break; // 更新视图模式 case 'RefreshView': break; // 全员看他 case 'ShowUser': if (item.operUid && item.operUserName) { if (item.operUid !== userInfo.uid) { if (item.uid === userInfo.uid) { this.message(`${item.operUserName}设置全员看你`).success() } else { this.message(`${item.operUserName}设置全员看${item.uname}`).success() } } } this.getShowUser() break; // 用户加入频道回调 case 'UserJoined': this.setAllUserListData('UserJoined', item) break; // 用户退出频道回调 case 'UserLeave': this.setAllUserListData('UserLeave', item) if (item.uid === this.data.currentUid) { this.getShowUser(); } break; // 所有用户开闭麦 case 'OperAllMicr': this.setAllUserListData('OperAllMicr', item) break; // 用户关闭开启麦克风 case 'OperMicr': if (item.operUid !== userInfo.uid) { if (item.user.uid === userInfo.uid) { this.message(item.user.enableMicr ? '管理员已取消你的静音' : '你已被管理员静音').success() } } this.setAllUserListData('OperMicr', item) break; // 用户开启关闭摄像头 case 'OperCamera': if (item.operUid !== userInfo.uid) { if (item.user.uid === userInfo.uid) { this.message(item.user.enableCamera ? '管理员已开启你的摄像头' : '管理员已关闭你摄像头').success() } } this.setAllUserListData('OperCamera', item) break; // 发言人用户信息刷新 case 'ManagerRefresh': this.setAllUserListData('ManagerRefresh', item, async () => { if (item.user.uid === item.uid) { if (item.user.uid === userInfo.uid) { // await agora.allLeaveChannelEx() this.message(`操作成功`).success() await agora.setRole(item.user.isRoomManager, (url: string) => { const roomUserListTemp = [...this.data.roomUserList] const itemUser = roomUserListTemp.find(row => row.uid == userInfo.uid) itemUser.src = url this.setData({ roomUserList: roomUserListTemp, }) }) await this.postOpenMicrApi(item.user.isRoomManager, userInfo.uid, false) await this.postOpenCameraApi(false, userInfo.uid) // 不管身份如何改变都关闭摄像头 } else { this.message(`${item.user.userName}已结束发言`).success() } } else { if (item.user.uid === userInfo.uid) { if (item.user.isRoomManager) { // await agora.allLeaveChannelEx() } this.message(`管理员${item.user.isRoomManager ? '设置' : '取消'}您为发言人`).success() await agora.setRole(item.user.isRoomManager, (url: string) => { const roomUserListTemp = [...this.data.roomUserList] const itemUser = roomUserListTemp.find(row => row.uid == userInfo.uid) itemUser.src = url this.setData({ roomUserList: roomUserListTemp, }) }) if (this.data.currentRequestSpeakType === 'video') { await this.postOpenCameraApi(item.user.isRoomManager, userInfo.uid) } else if (this.data.currentRequestSpeakType === 'audio') { await this.postOpenMicrApi(item.user.isRoomManager, userInfo.uid, false) } else { await this.postOpenMicrApi(item.user.isRoomManager, userInfo.uid, false) await this.postOpenCameraApi(false, userInfo.uid) } this.setData({ currentRequestSpeakType: '' }) } else { this.message(`管理员${item.user.isRoomManager ? '设置' : '取消'}${item.user.userName}为发言人`).success() } } }) break; // 申请发言 case 'ApplyToSpeak': break; // 管理员查看随机用户 case 'Watch': if (!role.ID.includes(userInfo.roleId)) { let userId = item.watchUids.find((uid: any) => uid === userInfo.uid) if (userId) { // await agora.allJoinChannelEx() } else { // await agora.allLeaveChannelEx() } } break; // 设备列表 case 'DriverList': break; // 设置设备 case 'SaveDriver': break; // 显示设备列表 case 'ShowDriverList': break; // 修改用户名称 case 'ModifyNickName': this.setAllUserListData('ModifyNickName', item) break; case 'SetSpeaker': await onInvoke('SetSpeakerCallback', item.RoomManagerInputDTO) break; // 扩展参数 case 'ReceivedOperation': try { const temp = JSON.parse(item.contentString) if (temp.type === 'audio') { await PostOpenMicr({ roomNum: temp.roomNum, uid: temp.uid, enableMicr: temp.enableMicr }) } else { await PostOpenCamera({ roomNum: temp.roomNum, uid: temp.uid, enableCamera: temp.enableCamera }) } } catch (error) { } break; // 共享人取消共享屏幕 case 'StopedSharedScreen': this.getShowUser() break; } }) }, // 声网监听 startClientEvent() { agora.clientEvent({ streamAdded: async (url: string, uid: number | string) => { const roomUserListTemp = [...this.data.roomUserList] const item = roomUserListTemp.find(row => row.uid == uid || row.screenShareId == uid) if (item) { if (String(uid).length === 9) { item.shareSrc = url } else { item.src = url } } this.setData({ roomUserList: roomUserListTemp, }) }, streamRemoved: (uid) => { const roomUserListTemp = [...this.data.roomUserList] uid.forEach(id => { if (String(id).length === 9) { const item = roomUserListTemp.find(row => row.uid == id || row.screenShareId == id) item.shareSrc = '' this.setData({ roomUserList: roomUserListTemp, }) } }); }, tokenRef: () => { GetRoomRtcToken(this.data.channelId).then(res => { if (res.code === 200) { agora.renewToken(res.data) } }) }, updateUrl: (e) => { const roomUserListTemp = [...this.data.roomUserList] const item = roomUserListTemp.find(row => row.uid == e.uid || row.screenShareId == e.uid) if (item) { if (String(e.uid).length === 9) { item.shareSrc = e.url; } else { item.src = e.url; } } }, error: (e) => { this.reconnecFun() }, }) }, // 获取房间用户 async getRoomUser(): Promise { await GetRoomUser(this.data.channelId).then(res => { if (res.code === 200) { res.data.forEach((item) => { item.isRoom = true; item.isAdmin = role.ID.includes(item.roleId) || item.isRoomManager item.avatarName = item.userName?.slice(-2) }) this.setData({ roomUserList: res.data }) } }) }, // 切换tab setTabBarIndex(e) { this.setData({ tabBarIndex: Number(e.currentTarget.dataset.tabbarindex) }) this.setStorageData() }, // 修改缓存设置 changeSetting(e) { this.data.setting[e.currentTarget.dataset.str] = e.detail.value wx.setStorage({ key: "setting", data: this.data.setting }) }, // 成员显示用户名称 showMultiText(e) { Toast({ context: this, selector: '#t-toast', message: e.currentTarget.dataset.item.userName, }); }, // 查看全员观看 async getShowUser(): Promise { await GetShowUser(this.data.channelId).then(async (res) => { if (res.code === 200 && res.data) { this.setData({ currentUid: res.data, }) } }) }, // 首次获取用户信息 async getRoomInfo(): Promise { await GetRoomInfo(this.data.channelId).then(async (res) => { if (res.code === 200) { this.setData({ roomInfo: res.data, }) } }) }, // 加入房间 async joinChannel(): Promise { const item = this.data.roomUserList.find(row => row.uid === this.data.user.uid) await onInvoke('joinChannel', { roomNum: this.data.channelId, enableMicr: this.data.footerList[1].active, enableCamera: this.data.footerList[2].active, isRoomManager: item ? item.isRoomManager : false, }) agora.joinChannel(item ? item.isRoomManager : false, (url: string) => { const roomUserListTemp = [...this.data.roomUserList] const itemUser = roomUserListTemp.find(row => row.uid == this.data.user.uid) itemUser.src = url this.setData({ roomUserList: roomUserListTemp, }) }) this.changeAgoraDevice() }, // 用户数据组装 async setAllUserListData(key: string, item: any, callBack?: Function): Promise { const { roomUserList } = this.data; const userInfo: any = await getStorage('user') switch (key) { case 'OperMicr': case 'OperCamera': case 'ManagerRefresh': let userItem = roomUserList.find((row: any) => row.uid === item.user.uid) if (userItem) { for (const keys in item.user) { if (keys !== 'enableCamera' && keys !== 'enableMicr') { userItem[keys] = item.user[keys]; } } if (key === 'OperCamera') { userItem.enableCamera = item.user.enableCamera; if (userItem.uid === userInfo.uid) { // userItem.enableCamera ? agora.startCameraCapture() : agora.stopCameraCapture() } } if (key === 'OperMicr') { userItem.enableMicr = item.user.enableMicr; } userItem.isAdmin = role.ID.includes(item.user.roleId) || item.user.isRoomManager; this.setData({ roomUserList }) } if (key === 'ManagerRefresh') { callBack && callBack() } break; case 'UserJoined': let userJoinedItem = roomUserList.find((row: any) => row.uid === item.user.uid) if (userJoinedItem) { for (const key in item.user) { userJoinedItem[key] = item.user[key]; } userJoinedItem.isRoom = true; userJoinedItem.isAdmin = role.ID.includes(item.user.roleId) || item.user.isRoomManager; this.setData({ roomUserList }) } else { item.user.isRoom = true; item.user.isAdmin = role.ID.includes(item.user.roleId) || item.user.isRoomManager; item.user.avatarName = item.user.userName?.slice(-2) this.setData({ roomUserList: [...roomUserList, item.user] }) } break; case 'UserLeave': let userLeaveItem = roomUserList.find((row: any) => row.uid === item.uid) if (userLeaveItem) { userLeaveItem.isRoom = false userLeaveItem.isAdmin = false this.setData({ roomUserList }) } break; case 'OperAllMicr': roomUserList.forEach((row: any) => { if (row.uid !== item.uid) { row.enableMicr = item.enableMicr } }) this.setData({ roomUserList }) break; case 'ModifyNickName': let row = roomUserList.find((row: any) => row.uid == item.uid) if (row) { row.userName = item.nickName row.avatarName = item.nickName?.slice(-2) } this.setData({ roomUserList }) break; } this.changeAgoraDevice() }, // 点击底部按钮 async changeFooterList(e): Promise { const userInfo: any = await getStorage('user') const { index } = e.currentTarget.dataset; const { footerList } = this.data; const footerListTemplate = [...footerList] const item = footerListTemplate[index]; let title = item.active ? item.title : item.titleActive; switch (title) { case '关闭听筒': case '开启听筒': break; case '解除静音': case '静音': if (item.active) { // 静音 await this.postOpenMicrApi(false, userInfo.uid, false, true) } else { // 解除静音 await this.getUserRoomInfo().then(async (res) => { if (res) { await this.postOpenMicrApi(true, userInfo.uid, false, true) } else { if (!this.data.isClicked) { this.setData({ applySpeakDialog: true, currentRequestSpeakType: 'audio' }) } else { this.message('申请太频繁了,请稍后重试!').error(); } } }) } break; case '关闭视频': case '打开视频': if (item.active) { // 关闭视频 await this.postOpenCameraApi(false, userInfo.uid, true) } else { // 打开视频 await this.getUserRoomInfo().then(async (res) => { if (res) { await this.postOpenCameraApi(true, userInfo.uid, true) } else { if (!this.data.isClicked) { this.setData({ applySpeakDialog: true, currentRequestSpeakType: 'video' }) } else { this.message('申请太频繁了,请稍后重试!').error(); } } }) } break; case '申请发言': case '结束发言': if (item.active) { // 申请发言 if (!this.data.isClicked) { this.setData({ applySpeakDialog: true, currentRequestSpeakType: '' }) } else { this.message('申请太频繁了,请稍后重试!').error(); } } else { // 结束发言 DeleteRoomManager({ roomId: this.data.roomInfo.id, roomNum: this.data.channelId, userId: userInfo.uid }) } break; case '翻转': await this.getUserRoomInfo().then(async (res) => { if (res) { wx.createLivePusherContext().switchCamera() } else { this.message('暂无权限').error(); } }) break; case '聊天': this.setData({ chatPopupVisible: true, noViewChatList: 0 }) this.scrollToBottom() break; case '成员': this.setData({ userPopupVisible: true }) break; } }, // 开关摄像头 async postOpenMicrApi(enableMicr: boolean, uid: string, isAll: boolean, isMessage: boolean = false): Promise { if (isAll) { await PostMuteAll({ roomNum: this.data.channelId, enableMicr }) } else { await onInvoke('sendOper2User', { uid, contentString: JSON.stringify({ roomNum: this.data.channelId, uid, enableMicr, type: 'audio' }) }) // await PostOpenMicr({ // roomNum: this.data.channelId, // uid, // enableMicr // }) } if (isMessage) { this.message('操作成功').success() } }, // 开关摄像头 async postOpenCameraApi(enableCamera: boolean, uid: string, isMessage: boolean = false): Promise { if (enableCamera) { // await agora.startCameraCapture() } else { // await agora.stopCameraCapture(); } await onInvoke('sendOper2User', { uid, contentString: JSON.stringify({ roomNum: this.data.channelId, uid, enableCamera, type: 'video' }) }) // await PostOpenCamera({ // roomNum: this.data.channelId, // uid, // enableCamera // }) if (isMessage) { this.message('操作成功').success() } }, // 关闭弹窗 async closeDialog(e) { const { type } = e.currentTarget.dataset; switch (e.type) { case "confirm": switch (type) { case "applySpeakDialog": await GetApplySpeak(this.data.channelId).then(res => { if (res.code === 200) { this.setData({ isClicked: true, [type]: false, }) this.message('申请发言成功').success() } }) break; case "leaveDialog": wx.disableAlertBeforeUnload({ complete: () => { wx.navigateBack() } }) break; } break; case "cancel": this.setData({ [type]: false }) break; } }, // 音量提示 playerAudioVolumenotify(e) { const { uid } = e.currentTarget.dataset; const { volume } = e.detail; const audioListTemp = [...this.data.audioList] const percentage = (volume / 100) * 100 const item = audioListTemp.find(row => row.uid == uid) if (item) { item.volume = Math.floor(percentage) + '%' item.volumeNumber = Math.floor(percentage) } this.setData({ audioList: audioListTemp, userVolume: audioListTemp.find(row => row.uid == this.data.user.uid).volume }) }, // 切换视频 clickChangeVideo(e) { const { item } = e.currentTarget.dataset; const isShare = this.data.roomUserList.find(item => item.shareSrc) if (isShare) { this.message(`正在进行屏幕共享,不允许切换画面。`).error() } else { this.setData({ currentUid: item.uid }) } }, // 悬浮提示 message(content: string) { return { success: () => { Message.success({ context: this, offset: [20, 32], duration: 2000, content, }); }, error: () => { Message.error({ context: this, offset: [20, 32], duration: 2000, content, }); } } }, // 获取当前用户在房间信息 async getUserRoomInfo(): Promise { const userInfo: any = await getStorage('user') return new Promise((resolve, _reject) => { let userItem = this.data.roomUserList.find((item: any) => item.uid === userInfo.uid) if (userItem && (role.ID.includes(userItem.roleId) || userItem.isRoomManager)) { resolve(userItem) } else { resolve('') } }) }, // 更改数据 async changeAgoraDevice(): Promise { const userInfo: any = await getStorage('user') this.data.roomUserList.forEach(async (item: any) => { if (item.uid == userInfo.uid) { const footerListTemplate = [...this.data.footerList] footerListTemplate[1].active = item.enableMicr footerListTemplate[2].active = item.enableCamera item.enableMicr ? await agora.unmuteLocal('audio') : await agora.muteLocal('audio') item.enableCamera ? await agora.unmuteLocal('video') : await agora.muteLocal('video') if (!role.ID.includes(userInfo.roleId)) { footerListTemplate[6].active = !item.isRoomManager; } this.setData({ footerList: footerListTemplate }) } }); }, // 退出提示 async back() { this.setData({ leaveDialog: true }) }, // 关闭聊天和成员 onVisibleChange() { this.setData({ userPopupVisible: false, chatPopupVisible: false, }) }, // 聊天内容输入框赋值 changeMessageStr(e) { this.setData({ messageStr: e.detail.value }) }, // 聊天内容输入框赋值 changeInputStr(e) { this.setData({ inputStr: e.detail.value }) }, // 聊天发送 async sendMeg(e) { if (this.data.messageStr || e.target.dataset.item) { await onInvoke('sendChannelMsg', { roomNum: this.data.channelId, msg: e.target.dataset.item || this.data.messageStr }) const item = this.data.roomUserList.find(row => row.uid === this.data.user.uid) this.setData({ chatList: [...this.data.chatList, { userName: item.userName, message: e.target.dataset.item || this.data.messageStr, timestamp: dayjs(+new Date()).format('HH:mm:ss'), me: true }], }) if (!e.target.dataset.item) { this.setData({ messageStr: '' }) } this.scrollToBottom() } else { this.message('请输入文字!').error() } }, // 全屏切换 changeFullscreen() { this.setData({ isFullscreen: !this.data.isFullscreen }) }, // 聊天框位置滚动 scrollToBottom() { wx.createSelectorQuery() .select('#chatView') .node() .exec((res) => { const scrollView = res[0].node; scrollView.scrollTo({ top: 10000000000000 }) }) }, // 断网退出房间 setIsConnectedBack() { wx.setStorage({ key: "isConnected", data: true }) wx.disableAlertBeforeUnload({ complete: () => { wx.navigateBack() } }) }, // 监听网络变化 async listener(res) { if (res.isConnected && (res.networkType !== 'none' || res.networkType !== 'unknown')) { } else { } }, // 重连失败退出房间 closeRoom() { wx.disableAlertBeforeUnload({ complete: () => { this.setData({ isReconnec: false }) wx.navigateBack() } }) }, // 上箭头滚动 scrollUp() { const query = wx.createSelectorQuery() query.select('#meeting-content-smallvideo').scrollOffset((res => { this.setData({ scrollTop: res.scrollTop - 50 }) })) query.exec() }, // 下箭头滚动 scrollDown() { const query = wx.createSelectorQuery() query.select('#meeting-content-smallvideo').scrollOffset((res => { this.setData({ scrollTop: res.scrollTop + 50 }) })) query.exec() }, })