@tencentcloud/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,
499 lines (498 loc) • 18.9 kB
JavaScript
"use strict";
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
const Vue = require("vue");
const index = require("../../../locales/index.js");
const room = require("../../../stores/room.js");
const useRoomEngine = require("../../../hooks/useRoomEngine.js");
const basic = require("../../../stores/basic.js");
const useMasterApplyControl = require("../../../hooks/useMasterApplyControl.js");
const TUIRoomEngine = require("@tencentcloud/tuiroom-engine-js");
const pinia = require("pinia");
const message = require("../../../constants/message.js");
const useMitt = require("../../../hooks/useMitt.js");
const useMemberItemHooks = require("../MemberItem/useMemberItemHooks.js");
require("../../../services/main.js");
const roomService = require("../../../services/roomService.js");
const environment = require("../../../utils/environment.js");
const utils = require("../../../utils/utils.js");
require("mitt");
require("../../../services/manager/roomActionManager.js");
require("@tencentcloud/tui-core");
const uikitBaseComponentVue3 = require("@tencentcloud/uikit-base-component-vue3");
function useMemberControl(props) {
const roomEngine = useRoomEngine.default();
const { t } = index.useI18n();
const basicStore = basic.useBasicStore();
const roomStore = room.useRoomStore();
const isDialogVisible = Vue.ref(false);
const isShowInput = Vue.ref(false);
const editorInputEle = Vue.ref();
const editorInputEleContainer = Vue.ref();
const tempUserName = Vue.ref("");
const dialogData = Vue.reactive({
title: "",
content: "",
confirmText: "",
actionType: "",
showInput: false,
isConfirmButtonDisable: false
});
const kickOffDialogContent = Vue.computed(
() => t("whether to kick sb off the room", {
name: roomService.roomService.getDisplayName(props.userInfo)
})
);
const transferOwnerTitle = Vue.computed(
() => t("Transfer the roomOwner to sb", {
name: roomService.roomService.getDisplayName(props.userInfo)
})
);
const {
isFreeSpeakMode,
isSpeakAfterTakingSeatMode,
localUser,
isGeneralUser,
anchorUserList,
maxSeatCount
} = pinia.storeToRefs(roomStore);
const {
agreeUserOnStage,
denyUserOnStage,
inviteUserOnStage,
cancelInviteUserOnStage,
kickUserOffStage
} = useMasterApplyControl.default();
const { isCanOperateMySelf } = useMemberItemHooks.default(props.userInfo);
const isMe = Vue.computed(() => basicStore.userId === props.userInfo.userId);
const isTargetUserAnchor = Vue.computed(() => props.userInfo.onSeat === true);
const isTargetUserAudience = Vue.computed(() => props.userInfo.onSeat !== true);
const controlList = Vue.computed(() => {
if (isCanOperateMySelf.value) {
return [changeUserNameCard.value];
}
const agreeOrDenyStageList = props.userInfo.isUserApplyingToAnchor ? [agreeOnStage.value, denyOnStage.value] : [];
const inviteStageList = isTargetUserAudience.value && !props.userInfo.isUserApplyingToAnchor ? [inviteOnStage.value] : [];
const onStageControlList = isTargetUserAnchor.value ? [audioControl.value, videoControl.value, makeOffStage.value] : [];
const controlListObj = {
freeSpeak: {
[TUIRoomEngine.TUIRole.kRoomOwner]: [
audioControl.value,
videoControl.value,
chatControl.value,
setOrRevokeAdmin.value,
transferOwner.value,
kickUser.value,
changeUserNameCard.value
],
[TUIRoomEngine.TUIRole.kAdministrator]: [
audioControl.value,
videoControl.value,
chatControl.value,
changeUserNameCard.value
]
},
speakAfterTakeSeat: {
[TUIRoomEngine.TUIRole.kRoomOwner]: [
...inviteStageList,
...onStageControlList,
...agreeOrDenyStageList,
setOrRevokeAdmin.value,
transferOwner.value,
chatControl.value,
kickUser.value,
changeUserNameCard.value
],
[TUIRoomEngine.TUIRole.kAdministrator]: [
...inviteStageList,
...onStageControlList,
...agreeOrDenyStageList,
chatControl.value,
changeUserNameCard.value
]
}
};
if (isFreeSpeakMode.value) {
return controlListObj.freeSpeak[localUser.value.userRole] || [];
}
if (isSpeakAfterTakingSeatMode.value) {
return controlListObj.speakAfterTakeSeat[localUser.value.userRole] || [];
}
return [];
});
const audioControl = Vue.computed(() => ({
key: "audioControl",
icon: uikitBaseComponentVue3.IconAudioOpen,
title: props.userInfo.hasAudioStream ? t("Mute") : t("Unmute"),
func: muteUserAudio
}));
const videoControl = Vue.computed(() => {
const videoControlTitle = props.userInfo.hasVideoStream ? t("Disable video") : t("Enable video");
return {
key: "videoControl",
icon: uikitBaseComponentVue3.IconVideoOpen,
title: videoControlTitle,
func: muteUserVideo
};
});
const chatControl = Vue.computed(() => ({
key: "chatControl",
icon: uikitBaseComponentVue3.IconChatForbidden,
title: props.userInfo.isMessageDisabled ? t("Enable chat") : t("Disable chat"),
func: disableUserChat
}));
const transferOwner = Vue.computed(() => ({
key: "transferOwner",
icon: uikitBaseComponentVue3.IconTransferOwner,
title: t("Make host"),
func: () => handleOpenDialog("transferOwner")
}));
const setOrRevokeAdmin = Vue.computed(() => ({
key: "setOrRevokeAdmin",
icon: props.userInfo.userRole === TUIRoomEngine.TUIRole.kAdministrator ? uikitBaseComponentVue3.IconRevokeAdmin : uikitBaseComponentVue3.IconSetAdmin,
title: props.userInfo.userRole === TUIRoomEngine.TUIRole.kAdministrator ? t("Remove administrator") : t("Set as administrator"),
func: handleSetOrRevokeAdmin
}));
const kickUser = Vue.computed(() => ({
key: "kickUser",
icon: uikitBaseComponentVue3.IconKickOut,
title: t("Kick out"),
func: () => handleOpenDialog("kickUser")
}));
const inviteOnStage = Vue.computed(() => ({
key: "inviteOnStage",
icon: props.userInfo.isInvitingUserToAnchor ? uikitBaseComponentVue3.IconDenyOnStage : uikitBaseComponentVue3.IconInviteOnStage,
title: props.userInfo.isInvitingUserToAnchor ? t("Cancel stage") : t("Invite stage"),
func: toggleInviteUserOnStage
}));
const agreeOnStage = Vue.computed(() => ({
key: "agreeOnStage",
icon: uikitBaseComponentVue3.IconOnStage,
title: t("Agree to the stage"),
func: agreeUserOnStage
}));
const denyOnStage = Vue.computed(() => ({
key: "denyOnStage",
icon: uikitBaseComponentVue3.IconDenyOnStage,
title: t("Refuse stage"),
func: denyUserOnStage
}));
const makeOffStage = Vue.computed(() => ({
key: "makeOffStage",
icon: uikitBaseComponentVue3.IconOffStage,
title: t("Step down"),
func: kickUserOffStage
}));
const changeUserNameCard = Vue.computed(() => ({
key: "changeUserNameCard",
icon: uikitBaseComponentVue3.IconEditNameCard,
title: t("change name"),
func: () => handleOpenDialog("changeUserNameCard")
}));
async function toggleInviteUserOnStage(userInfo) {
const { isInvitingUserToAnchor } = userInfo;
if (isInvitingUserToAnchor) {
cancelInviteUserOnStage(userInfo);
} else {
if (anchorUserList.value.length === maxSeatCount.value) {
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.WARNING,
message: `${t("The stage is full")}`,
duration: message.MESSAGE_DURATION.NORMAL
});
return;
}
inviteUserOnStage(userInfo);
}
}
async function muteUserAudio(userInfo) {
var _a, _b;
if (userInfo.hasAudioStream) {
await ((_a = roomEngine.instance) == null ? void 0 : _a.closeRemoteDeviceByAdmin({
userId: userInfo.userId,
device: TUIRoomEngine.TUIMediaDevice.kMicrophone
}));
} else {
if (userInfo.isRequestingUserOpenMic) {
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.INFO,
message: `${t("An invitation to open the microphone has been sent to sb.", { name: roomService.roomService.getDisplayName(userInfo) })}`,
duration: message.MESSAGE_DURATION.NORMAL
});
return;
}
const request = await ((_b = roomEngine.instance) == null ? void 0 : _b.openRemoteDeviceByAdmin({
userId: userInfo.userId,
device: TUIRoomEngine.TUIMediaDevice.kMicrophone,
timeout: 0,
requestCallback: (callbackInfo) => {
roomStore.setRequestUserOpenMic({
userId: userInfo.userId,
isRequesting: false
});
const { requestCallbackType, code } = callbackInfo;
switch (requestCallbackType) {
case TUIRoomEngine.TUIRequestCallbackType.kRequestError:
if (code === TUIRoomEngine.TUIErrorCode.ERR_REQUEST_ID_REPEAT) {
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.WARNING,
message: t(
"This member has already received the same request, please try again later"
),
duration: message.MESSAGE_DURATION.NORMAL
});
}
break;
}
}
}));
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.INFO,
message: `${t("An invitation to open the microphone has been sent to sb.", { name: roomService.roomService.getDisplayName(userInfo) })}`,
duration: message.MESSAGE_DURATION.NORMAL
});
if (request && request.requestId) {
roomStore.setRequestUserOpenMic({
userId: userInfo.userId,
isRequesting: true,
requestId: request.requestId
});
}
}
}
async function muteUserVideo(userInfo) {
var _a, _b;
if (userInfo.hasVideoStream) {
await ((_a = roomEngine.instance) == null ? void 0 : _a.closeRemoteDeviceByAdmin({
userId: userInfo.userId,
device: TUIRoomEngine.TUIMediaDevice.kCamera
}));
} else {
if (userInfo.isRequestingUserOpenCamera) {
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.INFO,
message: `${t("An invitation to open the camera has been sent to sb.", { name: roomService.roomService.getDisplayName(userInfo) })}`,
duration: message.MESSAGE_DURATION.NORMAL
});
return;
}
const request = await ((_b = roomEngine.instance) == null ? void 0 : _b.openRemoteDeviceByAdmin({
userId: userInfo.userId,
device: TUIRoomEngine.TUIMediaDevice.kCamera,
timeout: 0,
requestCallback: (callbackInfo) => {
roomStore.setRequestUserOpenCamera({
userId: userInfo.userId,
isRequesting: false
});
const { requestCallbackType, code } = callbackInfo;
switch (requestCallbackType) {
case TUIRoomEngine.TUIRequestCallbackType.kRequestError:
if (code === TUIRoomEngine.TUIErrorCode.ERR_REQUEST_ID_REPEAT) {
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.WARNING,
message: t(
"This member has already received the same request, please try again later"
),
duration: message.MESSAGE_DURATION.NORMAL
});
}
break;
}
}
}));
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.INFO,
message: `${t("An invitation to open the camera has been sent to sb.", { name: roomService.roomService.getDisplayName(userInfo) })}`,
duration: message.MESSAGE_DURATION.NORMAL
});
if (request && request.requestId) {
roomStore.setRequestUserOpenCamera({
userId: userInfo.userId,
isRequesting: true,
requestId: request.requestId
});
}
}
}
async function disableUserChat(userInfo) {
var _a;
const { isMessageDisabled } = userInfo;
try {
await ((_a = roomEngine.instance) == null ? void 0 : _a.disableSendingMessageByAdmin({
userId: userInfo.userId,
isDisable: !isMessageDisabled
}));
roomStore.setMuteUserChat(userInfo.userId, !isMessageDisabled);
} catch (error) {
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.ERROR,
message: t("Failed to disable chat"),
duration: message.MESSAGE_DURATION.NORMAL
});
}
}
async function kickOffUser(userInfo) {
var _a;
await ((_a = roomEngine.instance) == null ? void 0 : _a.kickRemoteUserOutOfRoom({
userId: userInfo.userId
}));
roomStore.removeUserInfo(userInfo.userId);
}
async function handleTransferOwner(userInfo) {
var _a, _b;
const roomInfo = await ((_a = roomEngine.instance) == null ? void 0 : _a.fetchRoomInfo());
if ((roomInfo == null ? void 0 : roomInfo.roomOwner) === roomStore.localUser.userId) {
try {
if (roomStore.localUser.hasScreenStream && roomStore.isScreenShareDisableForAllUser) {
useMitt.default.emit("ScreenShare:stopScreenShare");
}
await ((_b = roomEngine.instance) == null ? void 0 : _b.changeUserRole({
userId: userInfo.userId,
userRole: TUIRoomEngine.TUIRole.kRoomOwner
}));
roomStore.setMasterUserId(userInfo.userId);
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.SUCCESS,
message: t("The room owner has been transferred to sb", {
name: roomService.roomService.getDisplayName(userInfo)
}),
duration: message.MESSAGE_DURATION.NORMAL
});
} catch (error) {
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.ERROR,
message: t("Make host failed, please try again."),
duration: message.MESSAGE_DURATION.NORMAL
});
}
}
}
async function handleSetOrRevokeAdmin(userInfo) {
var _a, _b;
const newRole = userInfo.userRole === TUIRoomEngine.TUIRole.kGeneralUser ? TUIRoomEngine.TUIRole.kAdministrator : TUIRoomEngine.TUIRole.kGeneralUser;
await ((_a = roomEngine.instance) == null ? void 0 : _a.changeUserRole({
userId: userInfo.userId,
userRole: newRole
}));
const updatedUserName = roomStore.getUserName(userInfo.userId);
const tipMessage = newRole === TUIRoomEngine.TUIRole.kAdministrator ? `${t("sb has been set as administrator", { name: updatedUserName })}` : `${t("The administrator status of sb has been withdrawn", { name: updatedUserName })}`;
uikitBaseComponentVue3.TUIToast({ type: uikitBaseComponentVue3.TOAST_TYPE.SUCCESS, message: tipMessage });
roomStore.setRemoteUserRole(userInfo.userId, newRole);
if (newRole === TUIRoomEngine.TUIRole.kGeneralUser && userInfo.hasScreenStream) {
await ((_b = roomEngine.instance) == null ? void 0 : _b.closeRemoteDeviceByAdmin({
userId: userInfo.userId,
device: TUIRoomEngine.TUIMediaDevice.kScreen
}));
}
}
function handleOpenDialog(action) {
var _a;
switch (action) {
case "kickUser":
isDialogVisible.value = true;
Object.assign(dialogData, {
title: t("Note"),
content: kickOffDialogContent.value,
confirmText: t("Confirm"),
actionType: action,
showInput: false,
isConfirmButtonDisable: false
});
break;
case "transferOwner":
isDialogVisible.value = true;
Object.assign(dialogData, {
title: transferOwnerTitle.value,
content: t(
"After transfer the room owner, you will become a general user"
),
confirmText: t("Confirm transfer"),
actionType: action,
showInput: false,
isConfirmButtonDisable: false
});
break;
case "changeUserNameCard":
tempUserName.value = props.userInfo.nameCard || props.userInfo.userName;
if (environment.isMobile) {
isShowInput.value = true;
(_a = document == null ? void 0 : document.body) == null ? void 0 : _a.appendChild(editorInputEleContainer.value);
} else {
isDialogVisible.value = true;
}
Object.assign(dialogData, {
title: t("change name"),
content: "",
confirmText: t("Confirm"),
actionType: action,
showInput: true,
isConfirmButtonDisable: Vue.computed(() => tempUserName.value === "")
});
break;
}
}
const nameCardCheck = () => {
const result = utils.calculateByteLength(tempUserName.value) <= 32;
!result && uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.WARNING,
message: t("The user name cannot exceed 32 characters"),
duration: message.MESSAGE_DURATION.NORMAL
});
return result;
};
async function handleChangeUserNameCard(userInfo) {
var _a;
if (!nameCardCheck()) return;
try {
await ((_a = roomEngine.instance) == null ? void 0 : _a.changeUserNameCard({
userId: userInfo.userId,
nameCard: tempUserName.value
}));
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.SUCCESS,
message: t("Name changed successfully"),
duration: message.MESSAGE_DURATION.NORMAL
});
} catch (error) {
uikitBaseComponentVue3.TUIToast({
type: uikitBaseComponentVue3.TOAST_TYPE.ERROR,
message: t("change name failed, please try again."),
duration: message.MESSAGE_DURATION.NORMAL
});
}
}
function handleAction(userInfo) {
switch (dialogData.actionType) {
case "kickUser":
kickOffUser(userInfo);
break;
case "transferOwner":
handleTransferOwner(userInfo);
break;
case "changeUserNameCard":
handleChangeUserNameCard(userInfo);
isShowInput.value = false;
}
isDialogVisible.value = false;
}
function handleCancelDialog() {
tempUserName.value = props.userInfo.nameCard || props.userInfo.userName;
isDialogVisible.value = false;
}
return {
props,
isMe,
isGeneralUser,
controlList,
kickOffDialogContent,
handleCancelDialog,
handleAction,
isDialogVisible,
dialogData,
tempUserName,
isShowInput,
editorInputEle,
editorInputEleContainer
};
}
exports.default = useMemberControl;