roomkit-web-vue3
Version:
<h1 align="center"> TUIRoomKit</h1> Conference (TUIRoomKit) is a product suitable for multi-person audio and video conversation scenarios such as business meetings, webinars, and online education. By integrating this product, you can add room management,
137 lines (134 loc) • 4.67 kB
text/typescript
import {
TUIMediaDeviceType,
TRTCVideoMirrorType,
TRTCVideoRotation,
TRTCVideoFillMode,
TUIVideoQuality,
} from '@tencentcloud/tuiroom-engine-js';
import useRoomEngine from '../../../hooks/useRoomEngine';
import useDeviceManager from '../../../hooks/useDeviceManager';
import i18n from '../../../locales';
import TUIMessageBox from '../../../components/common/base/MessageBox';
import TUIMessage from '../../../components/common/base/Message';
import { isWeChat, isMobile } from '../../../utils/environment';
import { MediaDeviceState } from '../../type';
import { WARNING_MESSAGE, MESSAGE_DURATION } from '../../../constants/message';
import { roomService } from '../../../services';
import useVideoDeviceManagerState, {
isCameraListInitiated,
} from './videoDeviceManagerState';
import { initMediaDeviceList } from './videoDeviceListHandler';
const { t } = i18n.global;
const roomEngine = useRoomEngine();
const deviceManager = useDeviceManager();
const {
currentCameraDevice,
isFrontCamera,
cameraState,
isCameraTesting,
isCameraTestLoading,
localVideoQuality,
} = useVideoDeviceManagerState();
class Camera {
static instance: Camera;
constructor() {
if (!Camera.instance) {
Camera.instance = this;
}
return Camera.instance;
}
public async startCameraDeviceTest(options: { view: string }) {
if (!isCameraListInitiated) {
await initMediaDeviceList();
}
isCameraTestLoading.value = true;
try {
await deviceManager.instance?.startCameraDeviceTest(options);
isCameraTestLoading.value = false;
isCameraTesting.value = true;
} catch (error) {
isCameraTestLoading.value = false;
}
}
public async stopCameraDeviceTest() {
isCameraTestLoading.value = false;
await deviceManager.instance?.stopCameraDeviceTest();
isCameraTesting.value = false;
}
public async switchCamera(options: { isFrontCamera: boolean }) {
await deviceManager.instance?.switchCamera(options);
isFrontCamera.value = options.isFrontCamera;
}
public async switchMirror(options: { mirror: boolean }) {
const trtcCloud = roomEngine.instance?.getTRTCCloud();
trtcCloud?.setLocalRenderParams({
mirrorType: options.mirror
? TRTCVideoMirrorType.TRTCVideoMirrorType_Enable
: TRTCVideoMirrorType.TRTCVideoMirrorType_Disable,
rotation: TRTCVideoRotation.TRTCVideoRotation0,
fillMode: TRTCVideoFillMode.TRTCVideoFillMode_Fill,
});
}
public async updateVideoQuality(options: { quality: TUIVideoQuality }) {
await roomEngine.instance?.updateVideoQuality(options);
localVideoQuality.value = options.quality;
}
public async openLocalCamera() {
if (cameraState.value === MediaDeviceState.NotSupportCapture && !isWeChat) {
TUIMessageBox({
title: t('Note'),
message: t('The current browser does not support capturing video'),
confirmButtonText: t('Sure'),
});
return;
}
if (cameraState.value === MediaDeviceState.NoDeviceDetected && !isWeChat) {
TUIMessageBox({
title: t('Note'),
message: t('Camera not detected on current device'),
confirmButtonText: t('Sure'),
});
return;
}
if (cameraState.value === MediaDeviceState.DeviceOffAndDisabled) {
let warningMessage = '';
if (roomService.roomStore.isAudience) {
warningMessage = WARNING_MESSAGE.UNMUTE_LOCAL_CAMERA_FAIL_AUDIENCE;
} else if (roomService.roomStore.isCameraDisableForAllUser) {
warningMessage = WARNING_MESSAGE.UNMUTE_LOCAL_CAMERA_FAIL_MUTE_ALL;
}
TUIMessage({
type: 'warning',
message: t(warningMessage),
duration: MESSAGE_DURATION.NORMAL,
});
return;
}
if (isMobile) {
await roomEngine.instance?.openLocalCamera({
isFrontCamera: isFrontCamera.value,
});
} else {
await roomEngine.instance?.openLocalCamera();
}
}
public async closeLocalCamera() {
await roomEngine.instance?.closeLocalCamera();
}
public async setCurrentDevice(options: { deviceId: string }) {
const { deviceId } = options;
await deviceManager.instance?.setCurrentDevice({
type: TUIMediaDeviceType.kMediaDeviceTypeVideoCamera,
deviceId,
});
currentCameraDevice.value = deviceManager.instance?.getCurrentDevice({
type: TUIMediaDeviceType.kMediaDeviceTypeVideoCamera,
});
}
}
const camera = new Camera();
export default function useVideoDeviceManager() {
return {
camera,
};
}