Web/vueVersion/src/pages/Welcome/components/Preview.vue (62 lines of code) (raw):

<template> <Row class="previewWrap"> <Col ref="refContainer" :class="!deviceInfo.cameraEnable ? 'avatar' : 'camera'"> <Avatar size="large">{{ userName }}</Avatar> </Col> <Row class="devices"> <Col class="deviceColumn"> <Camera :click="onClickCamera" /> </Col> <Divider type="vertical" /> <Col class="deviceColumn"> <Mic :click="onClickMic" /> </Col> </Row> </Row> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue'; import { Mic, Camera } from '~/components/Device'; import { Row, Col, Divider, Avatar } from 'ant-design-vue'; import { useDevice } from '~/hooks/device'; import { useChannelInfo, useCurrentUserInfo, useDeviceInfo, useGlobalFlag } from '~/store'; const refContainer = ref(null); // 状态管理 const cameraTrack = ref(null); const globalFlag = useGlobalFlag(); const { userName } = useCurrentUserInfo(); const deviceInfo = useDeviceInfo(); const channelInfo = useChannelInfo(); // 设备操作 const { openMicAndCameraSameTime, operateCamera, operateMic, openCamera, openMic } = useDevice('pre'); onMounted(async () => { if (globalFlag.isMobile) { return }; const [track] = await openMicAndCameraSameTime(); cameraTrack.value = track; if (!globalFlag.joined) { track?.play(refContainer.value.$el, { fit: 'cover' }); } }); const onClickCamera = () => { if (globalFlag.isMobile && !channelInfo.cameraTrack) { openCamera().then((track) => { track?.play(refContainer.value.$el, { fit: 'cover' }); }); } else { operateCamera(); } }; const onClickMic = () => { if (globalFlag.isMobile && !channelInfo.micTrack) { openMic(); } else { operateMic(); } }; </script> <style lang="less" scoped> @import url('../index.module.less'); </style>