| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <script lang="ts" setup> |
| | | import { IconifyIcon as Icon } from '#/packages/icons/src' |
| | | |
| | | import { useMediaStreamElement } from '../../composables/useMediaStreamElement' |
| | | import { UserAvatar } from '../user' |
| | | |
| | | const props = defineProps<{ |
| | | cameraEnabled: boolean |
| | | isGroup?: boolean |
| | | isVideo: boolean |
| | | localStream?: MediaStream | null // æ¬å°è§é¢æµï¼è§é¢å¼å«é¢è§éºåº |
| | | micEnabled: boolean |
| | | peerAvatar?: string |
| | | peerNickname?: string |
| | | speakerEnabled: boolean |
| | | }>() |
| | | |
| | | defineEmits<{ |
| | | cancel: [] |
| | | toggleCamera: [] |
| | | toggleMic: [] |
| | | toggleSpeaker: [] |
| | | }>() |
| | | |
| | | const setLocalVideoRef = useMediaStreamElement<HTMLVideoElement>(() => props.localStream) |
| | | </script> |
| | | |
| | | <template> |
| | | <!-- 主å«çå¾
å¯¹æ¹æ¥å¬çæ¬æµ®çªï¼1v1 ç§è 320Ã540ï¼ç¾¤éè¯åå¤§çª 720Ã560 --> |
| | | <div |
| | | class="fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-xl overflow-hidden shadow-[0_12px_36px_rgba(0,0,0,0.35)] z-[1000] flex flex-col text-white bg-gradient-to-b from-[#2a2a2c] to-[#1a1a1c]" |
| | | :class="isGroup ? 'w-[720px] h-[560px]' : 'w-[320px] h-[540px]'" |
| | | > |
| | | <div class="flex relative flex-1 justify-center items-center"> |
| | | <!-- è§é¢å¼å«ï¼èªå·±æå头é¢è§éºåºï¼å¯¹æ¹å¤´åæ¬æµ®é¡¶é¨ --> |
| | | <video |
| | | v-if="isVideo && localStream" |
| | | :ref="setLocalVideoRef" |
| | | class="absolute inset-0 object-cover w-full h-full scale-x-[-1]" |
| | | autoplay |
| | | muted |
| | | playsinline |
| | | ></video> |
| | | <div |
| | | class="flex relative z-[1] flex-col gap-4 items-center" |
| | | :class="{ 'self-start mt-16': isVideo }" |
| | | > |
| | | <UserAvatar |
| | | :url="peerAvatar" |
| | | :name="peerNickname" |
| | | :size="96" |
| | | radius="8px" |
| | | :clickable="false" |
| | | /> |
| | | <div class="text-[17px] font-medium">{{ peerNickname || '对æ¹' }}</div> |
| | | <div class="text-13px text-white/60">çå¾
å¯¹æ¹æ¥åé请â¦â¦</div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- åºé¨æä½åºï¼éº¦å
é£ / åæ¶ / (æå头 | æ¬å£°å¨) --> |
| | | <div class="flex flex-shrink-0 gap-4 justify-around items-center pt-4 px-5 pb-5"> |
| | | <div |
| | | class="flex flex-col gap-2 items-center cursor-pointer select-none" |
| | | @click="$emit('toggleMic')" |
| | | > |
| | | <!-- Iconify é mic æéé³åä½ï¼speaker / camera 没æåæºéé³åä½ï¼off æå tabler:*-off 表达æçº¿ --> |
| | | <span |
| | | class="flex justify-center items-center w-12 h-12 rounded-full" |
| | | :class="micEnabled ? 'bg-white text-[#1a1a1c]' : 'bg-white/15 text-white'" |
| | | > |
| | | <Icon |
| | | :icon="micEnabled ? 'ant-design:audio-outlined' : 'ant-design:audio-muted-outlined'" |
| | | :size="22" |
| | | /> |
| | | </span> |
| | | <span class="text-xs text-white/70 whitespace-nowrap"> |
| | | {{ micEnabled ? '麦å
é£å·²å¼' : '麦å
é£å·²å
³' }} |
| | | </span> |
| | | </div> |
| | | <div |
| | | class="flex flex-col gap-2 items-center cursor-pointer select-none" |
| | | @click="$emit('cancel')" |
| | | > |
| | | <span |
| | | class="flex justify-center items-center w-12 h-12 text-white rounded-full bg-[#f04a4a]" |
| | | > |
| | | <Icon icon="ant-design:phone-outlined" :size="22" class="rotate-[135deg]" /> |
| | | </span> |
| | | <span class="text-xs text-white/70 whitespace-nowrap">åæ¶</span> |
| | | </div> |
| | | <div |
| | | v-if="isVideo" |
| | | class="flex flex-col gap-2 items-center cursor-pointer select-none" |
| | | @click="$emit('toggleCamera')" |
| | | > |
| | | <span |
| | | class="flex justify-center items-center w-12 h-12 rounded-full" |
| | | :class="cameraEnabled ? 'bg-white text-[#1a1a1c]' : 'bg-white/15 text-white'" |
| | | > |
| | | <Icon |
| | | :icon="cameraEnabled ? 'ant-design:video-camera-outlined' : 'tabler:video-off'" |
| | | :size="22" |
| | | /> |
| | | </span> |
| | | <span class="text-xs text-white/70 whitespace-nowrap"> |
| | | {{ cameraEnabled ? 'æå头已å¼' : 'æå头已å
³' }} |
| | | </span> |
| | | </div> |
| | | <div |
| | | v-else |
| | | class="flex flex-col gap-2 items-center cursor-pointer select-none" |
| | | @click="$emit('toggleSpeaker')" |
| | | > |
| | | <span |
| | | class="flex justify-center items-center w-12 h-12 rounded-full" |
| | | :class="speakerEnabled ? 'bg-white text-[#1a1a1c]' : 'bg-white/15 text-white'" |
| | | > |
| | | <Icon |
| | | :icon="speakerEnabled ? 'ant-design:sound-outlined' : 'tabler:volume-off'" |
| | | :size="22" |
| | | /> |
| | | </span> |
| | | <span class="text-xs text-white/70 whitespace-nowrap"> |
| | | {{ speakerEnabled ? 'æ¬å£°å¨å·²å¼' : 'æ¬å£°å¨å·²å
³' }} |
| | | </span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |