Commit 426baedd by qlintonger xeno

眼镜端修复+4

parent ec8a84da
export function convertURL(string: string) {
return string.replace(/^http:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}/, 'https://ifar.test.com:440')
}
\ No newline at end of file
...@@ -13,29 +13,36 @@ ...@@ -13,29 +13,36 @@
<a-col :span="12"> <a-col :span="12">
<div class="flex items-center p-1.5 leading-7"> <div class="flex items-center p-1.5 leading-7">
<global-icon :size="16" icon="user-group"></global-icon> <global-icon :size="16" icon="user-group"></global-icon>
<span class="text-xs ml-1 text-theme-text2">房间已有 {{ chatChannelState.currentChatters.length }}</span> <span class="text-xs ml-1 text-theme-text2">房间已有 {{ chatChannelState.currentChatters.length
}}</span>
</div> </div>
</a-col> </a-col>
<a-col :span="12"> <a-col :span="12">
<div class="flex items-center p-1.5 leading-7"> <div class="flex items-center p-1.5 leading-7">
<global-icon :size="16" icon="mic"></global-icon> <global-icon :size="16" icon="mic"></global-icon>
<span class="text-xs ml-1 text-theme-text2">{{ webrtcStates.isMicroAttached ? '麦克风已开启' : '麦克风未开启' }}</span> <span
class="text-xs ml-1 text-theme-text2">{{ webrtcStates.isMicroAttached ? '麦克风已开启' : '麦克风未开启'
}}</span>
</div> </div>
</a-col> </a-col>
<a-col :span="12"> <a-col :span="12">
<div class="flex items-center p-1.5 leading-7"> <div class="flex items-center p-1.5 leading-7">
<global-icon :size="16" icon="camera"></global-icon> <global-icon :size="16" icon="camera"></global-icon>
<span class="text-xs ml-1 text-theme-text2">{{ webrtcStates.isCameraAttached ? '摄像头已开启' : '摄像头未开启' }}</span> <span
class="text-xs ml-1 text-theme-text2">{{ webrtcStates.isCameraAttached ? '摄像头已开启' : '摄像头未开启'
}}</span>
</div> </div>
</a-col> </a-col>
</a-row> </a-row>
<div class="chat-list p-4 my-4 flex-auto overflow-y-auto mb-0" ref="scrollContainer"> <div ref="scrollContainer" class="chat-list p-4 my-4 flex-auto overflow-y-auto mb-0">
<chat-details v-for="q in mapChatMessageQueue" :key="q.record_id" :data="q.data" :is-self="q.isSelf" :type="q.type"></chat-details> <chat-details v-for="q in mapChatMessageQueue" :key="q.record_id" :data="q.data" :is-self="q.isSelf"
:type="q.type"></chat-details>
</div> </div>
<div class="px-4 py-2"> <div class="px-4 py-2">
<a-space size="medium"> <a-space size="medium">
<a-tooltip content="发送图片"> <a-tooltip content="发送图片">
<a-upload :custom-request="(option) => uploadMuFile(option, 'image')" :show-file-list="false" accept="image/*"> <a-upload :custom-request="(option) => uploadMuFile(option, 'image')" :show-file-list="false"
accept="image/*">
<template #upload-button> <template #upload-button>
<div class="flex-center px-3 py-1 rounded cursor-pointer bg-fill-bg1"> <div class="flex-center px-3 py-1 rounded cursor-pointer bg-fill-bg1">
<global-icon :size="15" icon="image"></global-icon> <global-icon :size="15" icon="image"></global-icon>
...@@ -44,7 +51,8 @@ ...@@ -44,7 +51,8 @@
</a-upload> </a-upload>
</a-tooltip> </a-tooltip>
<a-tooltip content="发送pdf"> <a-tooltip content="发送pdf">
<a-upload :custom-request="(option) => uploadMuFile(option, 'pdf')" :show-file-list="false" accept=".pdf"> <a-upload :custom-request="(option) => uploadMuFile(option, 'pdf')" :show-file-list="false"
accept=".pdf">
<template #upload-button> <template #upload-button>
<div class="flex-center px-3 py-1 rounded cursor-pointer bg-fill-bg1"> <div class="flex-center px-3 py-1 rounded cursor-pointer bg-fill-bg1">
<global-icon :size="15" icon="pdf"></global-icon> <global-icon :size="15" icon="pdf"></global-icon>
...@@ -53,7 +61,8 @@ ...@@ -53,7 +61,8 @@
</a-upload> </a-upload>
</a-tooltip> </a-tooltip>
<a-tooltip content="发送视频"> <a-tooltip content="发送视频">
<a-upload :custom-request="(option) => uploadMuFile(option, 'video')" :show-file-list="false" accept="video/*"> <a-upload :custom-request="(option) => uploadMuFile(option, 'video')" :show-file-list="false"
accept="video/*">
<template #upload-button> <template #upload-button>
<div class="flex-center px-3 py-1 rounded cursor-pointer bg-fill-bg1"> <div class="flex-center px-3 py-1 rounded cursor-pointer bg-fill-bg1">
<global-icon :size="15" icon="video"></global-icon> <global-icon :size="15" icon="video"></global-icon>
...@@ -62,7 +71,8 @@ ...@@ -62,7 +71,8 @@
</a-upload> </a-upload>
</a-tooltip> </a-tooltip>
</a-space> </a-space>
<a-textarea v-model="textMessage" allow-clear class="h-16 mt-2" placeholder="请输入" @keydown.enter.prevent="sendMessageText" /> <a-textarea v-model="textMessage" allow-clear class="h-16 mt-2" placeholder="请输入"
@keydown.enter.prevent="sendMessageText" />
</div> </div>
</div> </div>
</template> </template>
...@@ -77,6 +87,7 @@ import { Message } from '@arco-design/web-vue' ...@@ -77,6 +87,7 @@ import { Message } from '@arco-design/web-vue'
import { userStates } from 'AnyR/states/wsStates' import { userStates } from 'AnyR/states/wsStates'
import { computed, ref } from 'vue' import { computed, ref } from 'vue'
import { useAnyR } from 'AnyR/index' import { useAnyR } from 'AnyR/index'
import { convertURL } from '@/utils/convertURL.ts'
const textMessage = ref('') const textMessage = ref('')
const AnyR = useAnyR() const AnyR = useAnyR()
...@@ -131,13 +142,9 @@ const uploadMuFile = (option: any, type: string) => { ...@@ -131,13 +142,9 @@ const uploadMuFile = (option: any, type: string) => {
) )
} }
function convertURL(string: string) { const mapChatMessageQueue = computed(function() {
return string.replace(/^http:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d{1,5}/, 'https://ifar.test.com:440')
}
const mapChatMessageQueue = computed(function () {
console.log('mq here', chatChannelState.value.messageQueue) console.log('mq here', chatChannelState.value.messageQueue)
return chatChannelState.value.messageQueue.map(function (a: any) { return chatChannelState.value.messageQueue.map(function(a: any) {
return { return {
isSelf: a.uid === userStates.value.currentUserId, isSelf: a.uid === userStates.value.currentUserId,
type: a.type, type: a.type,
...@@ -146,7 +153,7 @@ const mapChatMessageQueue = computed(function () { ...@@ -146,7 +153,7 @@ const mapChatMessageQueue = computed(function () {
fromName: a.fromName, fromName: a.fromName,
sendTime: a.happened_time, sendTime: a.happened_time,
message: a.title, message: a.title,
src: convertURL(a.title?.fileUrl as string), src: convertURL(a.title?.fileUrl || '' as string),
fileName: a.title?.fileName fileName: a.title?.fileName
} }
} }
......
...@@ -101,7 +101,4 @@ onUnmounted(() => { ...@@ -101,7 +101,4 @@ onUnmounted(() => {
}) })
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
:deep([data-self='vc'] video), :deep(.agora_video_player) {
transform: none !important;
}
</style> </style>
<template> <template>
<div> <div>
<div :id="`RemoteVideo${ps.id}`" class="relative mb-4 flex-auto bg-fill-bg1" data-self="remote-main" @mousedown.capture="handleBlinkingStart" ref="remoteVideoRef"> <div :id="`RemoteVideo${ps.id}`" ref="remoteVideoRef" class="relative mb-4 flex-auto bg-fill-bg1"
data-self="remote-main" @mousedown.capture="handleBlinkingStart">
<n-message-provider> <n-message-provider>
<image-editor <image-editor
:before-cancel="beforeEndMarkHandle" :before-cancel="beforeEndMarkHandle"
...@@ -9,7 +10,7 @@ ...@@ -9,7 +10,7 @@
:show-quit="isScreenShotByCurrentUser" :show-quit="isScreenShotByCurrentUser"
:start="chatChannelState.displayImageEditor" :start="chatChannelState.displayImageEditor"
:target="firstVideoToBeAttached" :target="firstVideoToBeAttached"
:url-image="chatChannelState.screenshotURL" :url-image="convertURL(chatChannelState.screenshotURL)"
@cancel="reallyEndMarkHandle" @cancel="reallyEndMarkHandle"
@first-paint-done="initialPaintDone" @first-paint-done="initialPaintDone"
@canvas-saved="paintSaved" @canvas-saved="paintSaved"
...@@ -28,19 +29,22 @@ ...@@ -28,19 +29,22 @@
></div> ></div>
<template v-if="isVideoVisible"> <template v-if="isVideoVisible">
<div class="absolute flex justify-between items-center p-1 t-0 l-0 w-full z-10"> <div class="absolute flex justify-between items-center p-1 t-0 l-0 w-full z-10">
<div v-if="userDataForThis.userCallGroup == 1" class="text-xs px-2 rounded-sm leading-5 bg-primary-disable text-primary"> <div v-if="userDataForThis.userCallGroup == 1"
class="text-xs px-2 rounded-sm leading-5 bg-primary-disable text-primary">
{{ userDataForThis.name }} {{ userDataForThis.name }}
</div> </div>
<div v-else class="text-xs px-2 rounded-sm leading-5" style="background-color: rgb(var(--success-1)); color: rgb(var(--success-6))"> <div v-else class="text-xs px-2 rounded-sm leading-5"
style="background-color: rgb(var(--success-1)); color: rgb(var(--success-6))">
{{ userDataForThis.name }} {{ userDataForThis.name }}
</div> </div>
<div class="rounded-full size-6 flex-center" style="background-color: var(--color-border-1)"> <div class="rounded-full size-6 flex-center" style="background-color: var(--color-border-1)">
<global-icon v-if="!isCenterUserMuted" :size="12" color="rgb(var(--success-6))" :icon="'mic'"></global-icon> <global-icon v-if="!isCenterUserMuted" :icon="'mic'" :size="12"
<global-icon v-else :size="12" :icon="'mic-off'"></global-icon> color="rgb(var(--success-6))"></global-icon>
<global-icon v-else :icon="'mic-off'" :size="12"></global-icon>
</div> </div>
</div> </div>
</template> </template>
<div class="absolute w-full h-full flex-center" v-else> <div v-else class="absolute w-full h-full flex-center">
<video-loader></video-loader> <video-loader></video-loader>
</div> </div>
</div> </div>
...@@ -54,7 +58,7 @@ ...@@ -54,7 +58,7 @@
<span class="mt-1" style="color: rgb(var(--danger-5))">结束会议</span> <span class="mt-1" style="color: rgb(var(--danger-5))">结束会议</span>
</div> </div>
<div class="w-[120px] h-[72px] item" @click="toggleMute"> <div class="w-[120px] h-[72px] item" @click="toggleMute">
<global-icon :size="21" :icon="isCurrentUserMuted ? 'mic-off' : 'mic'"></global-icon> <global-icon :icon="isCurrentUserMuted ? 'mic-off' : 'mic'" :size="21"></global-icon>
<span class="mt-1 color-text-2">{{ isCurrentUserMuted ? '取消静音' : '静音' }}</span> <span class="mt-1 color-text-2">{{ isCurrentUserMuted ? '取消静音' : '静音' }}</span>
</div> </div>
<div class="w-[120px] h-[72px] item" @click="toggleVoiceChatOnly"> <div class="w-[120px] h-[72px] item" @click="toggleVoiceChatOnly">
...@@ -68,12 +72,16 @@ ...@@ -68,12 +72,16 @@
<div class="w-[120px] h-[72px] item" @click="toggleScreenShare"> <div class="w-[120px] h-[72px] item" @click="toggleScreenShare">
<global-icon :size="21" icon="shared-screen"></global-icon> <global-icon :size="21" icon="shared-screen"></global-icon>
<span class="mt-1 color-text-2"> <span class="mt-1 color-text-2">
{{ screenShareMetaData.byOther ? '他人正在共享' : screenShareMetaData.byCurrentUser ? '取消屏幕共享' : '屏幕共享' }} {{ screenShareMetaData.byOther ? '他人正在共享' : screenShareMetaData.byCurrentUser ? '取消屏幕共享' : '屏幕共享'
}}
</span> </span>
</div> </div>
<div class="w-[120px] h-[72px] item" @click="toggleRecording"> <div class="w-[120px] h-[72px] item" @click="toggleRecording">
<global-icon :size="21" :icon="!chatChannelState.recordingData.id ? 'record' : 'record-stop'"></global-icon> <global-icon :icon="!chatChannelState.recordingData.id ? 'record' : 'record-stop'"
<span class="mt-1 color-text-2">{{ !chatChannelState.recordingData.id ? '开始录制' : chatChannelState.recordingData.id === userStates.currentUserId ? '结束录制' : '他人正在录制' }}</span> :size="21"></global-icon>
<span
class="mt-1 color-text-2">{{ !chatChannelState.recordingData.id ? '开始录制' : chatChannelState.recordingData.id === userStates.currentUserId ? '结束录制' : '他人正在录制'
}}</span>
</div> </div>
<div v-if="isUserHost" class="w-[120px] h-[72px] item" @click="allMute"> <div v-if="isUserHost" class="w-[120px] h-[72px] item" @click="allMute">
<global-icon :size="21" icon="mic-off"></global-icon> <global-icon :size="21" icon="mic-off"></global-icon>
...@@ -90,13 +98,22 @@ ...@@ -90,13 +98,22 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useAnyR } from 'AnyR/index' import { useAnyR } from 'AnyR/index'
import { NMessageProvider } from 'naive-ui' import { NMessageProvider } from 'naive-ui'
import { allOtherChattersIdSet, chatChannelState, isCurrentUserMuted, isScreenShotByCurrentUser, isUserHost, screenShareMetaData, screenshotRecord } from 'AnyR/states/chatChannelStates' import {
allOtherChattersIdSet,
chatChannelState,
isCurrentUserMuted,
isScreenShotByCurrentUser,
isUserHost,
screenShareMetaData,
screenshotRecord
} from 'AnyR/states/chatChannelStates'
import { onMounted, onUpdated, ref } from 'vue' import { onMounted, onUpdated, ref } from 'vue'
import { userStates } from 'AnyR/states/wsStates' import { userStates } from 'AnyR/states/wsStates'
import ImageEditor from 'AnyR/widgets/ImageEditor/imageEditor.vue' import ImageEditor from 'AnyR/widgets/ImageEditor/imageEditor.vue'
import { Message, Modal } from '@arco-design/web-vue' import { Message, Modal } from '@arco-design/web-vue'
import { alova } from '@/api/alova-instance.ts' import { alova } from '@/api/alova-instance.ts'
import VideoLoader from './videoLoader.vue' import VideoLoader from './videoLoader.vue'
import { convertURL } from '@/utils/convertURL.ts'
const ps = defineProps<{ const ps = defineProps<{
id: any id: any
...@@ -123,12 +140,12 @@ async function toggleRecording() { ...@@ -123,12 +140,12 @@ async function toggleRecording() {
} }
} }
const isCenterUserMuted = computed(function () { const isCenterUserMuted = computed(function() {
return chatChannelState.value.mutedUserIdSet.includes(ps.id) return chatChannelState.value.mutedUserIdSet.includes(ps.id)
}) })
const firstVideoToBeAttached = ref('[data-self="remote-main"] video') const firstVideoToBeAttached = ref('[data-self="remote-main"] video')
const recordListener = function (records: any) { const recordListener = function(records: any) {
AnyR?.agora.continueMark(records) AnyR?.agora.continueMark(records)
} }
...@@ -183,7 +200,7 @@ function paintSaved(blob: any) { ...@@ -183,7 +200,7 @@ function paintSaved(blob: any) {
async function beforeEndMarkHandle() { async function beforeEndMarkHandle() {
if (isScreenShotByCurrentUser.value) { if (isScreenShotByCurrentUser.value) {
return new Promise(function (resolve) { return new Promise(function(resolve) {
Modal.warning({ Modal.warning({
title: '退出确认', title: '退出确认',
content: '你是截图发起者,退出后将会要求其他用户一同退出,确认?', content: '你是截图发起者,退出后将会要求其他用户一同退出,确认?',
...@@ -233,7 +250,7 @@ function handleBlinkingStart($e: PointerEvent) { ...@@ -233,7 +250,7 @@ function handleBlinkingStart($e: PointerEvent) {
}) })
} }
const userDataForThis = computed(function () { const userDataForThis = computed(function() {
const userNow: any = userStates.value.onlineContacts.find((a: any) => a.fromID === ps.id) const userNow: any = userStates.value.onlineContacts.find((a: any) => a.fromID === ps.id)
return { return {
name: userNow?.fromName || '--', name: userNow?.fromName || '--',
...@@ -249,12 +266,12 @@ const checkVideoExists = () => { ...@@ -249,12 +266,12 @@ const checkVideoExists = () => {
isVideoVisible.value = video ? true : false isVideoVisible.value = video ? true : false
} }
const observer = new MutationObserver(checkVideoExists) const observer = new MutationObserver(checkVideoExists)
onMounted(function () { onMounted(function() {
AnyR?.agora.forceReplay(ps.id) AnyR?.agora.forceReplay(ps.id)
observer.observe(remoteVideoRef.value, { childList: true, subtree: true }) observer.observe(remoteVideoRef.value, { childList: true, subtree: true })
}) })
onUpdated(function () { onUpdated(function() {
AnyR?.agora.forceReplay(ps.id) AnyR?.agora.forceReplay(ps.id)
}) })
...@@ -276,7 +293,8 @@ function toggleScreenShare() { ...@@ -276,7 +293,8 @@ function toggleScreenShare() {
AnyR?.agora.screenShareHandle() AnyR?.agora.screenShareHandle()
} }
AnyR?.agora.screenShareHandle() AnyR?.agora.screenShareHandle()
AnyR?.agora.agoraApp.toggleScreenShare(!screenShareMetaData.value.byCurrentUser, endHandle, endHandle, () => {}) AnyR?.agora.agoraApp.toggleScreenShare(!screenShareMetaData.value.byCurrentUser, endHandle, endHandle, () => {
})
} }
function allMute() { function allMute() {
...@@ -298,7 +316,7 @@ function hangupCall() { ...@@ -298,7 +316,7 @@ function hangupCall() {
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.item { .item {
@apply flex-center flex-col rounded cursor-pointer; @apply flex-center flex-col rounded cursor-pointer;
&:hover { &:hover {
background-color: var(--color-fill-2); background-color: var(--color-fill-2);
...@@ -324,6 +342,7 @@ function hangupCall() { ...@@ -324,6 +342,7 @@ function hangupCall() {
opacity: 1; opacity: 1;
} }
} }
:deep([data-self='remote-main'] video) { :deep([data-self='remote-main'] video) {
transform: none !important; transform: none !important;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment