@tencentcloud/roomkit-electron-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,
185 lines (184 loc) • 7.57 kB
JavaScript
"use strict";
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
const Vue = require("vue");
const pinia = require("pinia");
const Message = require("../common/base/Message/Message.js");
const index$1 = require("../common/base/Dialog/index.vue.js");
const room = require("../../stores/room.js");
const message = require("../../constants/message.js");
const index = require("../../locales/index.js");
const TUIRoomEngine = require("@tencentcloud/tuiroom-engine-electron");
const useRoomEngine = require("../../hooks/useRoomEngine.js");
const environment = require("../../utils/environment.js");
const Button = require("../common/base/Button.vue.js");
const AudioMediaControl = require("../common/AudioMediaControl.vue.js");
const basic = require("../../stores/basic.js");
const index$2 = require("../common/base/MessageBox/index.js");
const _sfc_main = /* @__PURE__ */ Vue.defineComponent({
__name: "AudioControl",
emits: ["click"],
setup(__props, { emit: __emit }) {
const roomEngine = useRoomEngine.default();
const roomStore = room.useRoomStore();
const basicStore = basic.useBasicStore();
const {
isAudience,
localUser,
isLocalAudioIconDisable,
isMicrophoneDisableForAllUser,
userVolumeObj
} = pinia.storeToRefs(roomStore);
const emits = __emit;
const hasMore = Vue.computed(() => !environment.isMobile);
const { t } = index.useI18n();
const dialogContent = Vue.ref("");
function handleAudioMediaClick() {
emits("click");
toggleMuteAudio();
}
async function toggleMuteAudio() {
var _a, _b, _c, _d;
if (isLocalAudioIconDisable.value) {
let warningMessage = "";
if (isAudience.value) {
warningMessage = message.WARNING_MESSAGE.UNMUTE_LOCAL_MIC_FAIL_AUDIENCE;
} else if (isMicrophoneDisableForAllUser.value) {
warningMessage = message.WARNING_MESSAGE.UNMUTE_LOCAL_MIC_FAIL_MUTE_ALL;
}
Message.default({
type: "warning",
message: t(warningMessage),
duration: message.MESSAGE_DURATION.NORMAL
});
return;
}
if (localUser.value.hasAudioStream) {
await ((_a = roomEngine.instance) == null ? void 0 : _a.muteLocalAudio());
if (roomStore.isMicrophoneDisableForAllUser) {
roomStore.setCanControlSelfAudio(false);
}
} else {
const microphoneList = await ((_b = roomEngine.instance) == null ? void 0 : _b.getMicDevicesList());
const hasMicrophoneDevice = microphoneList.length > 0;
if (!hasMicrophoneDevice && !environment.isWeChat) {
index$2.default({
title: t("Note"),
message: t("Microphone not detected on current device"),
confirmButtonText: t("Sure")
});
return;
}
await ((_c = roomEngine.instance) == null ? void 0 : _c.unmuteLocalAudio());
if (!basicStore.isOpenMic) {
(_d = roomEngine.instance) == null ? void 0 : _d.openLocalMicrophone();
basicStore.setIsOpenMic(true);
}
}
}
const showRequestOpenMicDialog = Vue.ref(false);
const requestOpenMicRequestId = Vue.ref("");
async function onRequestReceived(eventInfo) {
const { userId, requestAction, requestId } = eventInfo.request;
if (requestAction === TUIRoomEngine.TUIRequestAction.kRequestToOpenRemoteMicrophone) {
const userRole = roomStore.getUserRole(userId) === TUIRoomEngine.TUIRole.kRoomOwner ? t("RoomOwner") : t("Admin");
dialogContent.value = t("Sb invites you to turn on the microphone", {
role: userRole
});
requestOpenMicRequestId.value = requestId;
showRequestOpenMicDialog.value = true;
}
}
async function handleAccept() {
var _a;
roomStore.setCanControlSelfAudio(true);
await ((_a = roomEngine.instance) == null ? void 0 : _a.responseRemoteRequest({
requestId: requestOpenMicRequestId.value,
agree: true
}));
requestOpenMicRequestId.value = "";
showRequestOpenMicDialog.value = false;
}
async function handleReject() {
var _a;
await ((_a = roomEngine.instance) == null ? void 0 : _a.responseRemoteRequest({
requestId: requestOpenMicRequestId.value,
agree: false
}));
requestOpenMicRequestId.value = "";
showRequestOpenMicDialog.value = false;
}
async function onRequestCancelled(eventInfo) {
const { requestId } = eventInfo;
if (requestOpenMicRequestId.value === requestId) {
showRequestOpenMicDialog.value = false;
}
}
TUIRoomEngine.once("ready", () => {
var _a, _b;
(_a = roomEngine.instance) == null ? void 0 : _a.on(TUIRoomEngine.TUIRoomEvents.onRequestReceived, onRequestReceived);
(_b = roomEngine.instance) == null ? void 0 : _b.on(TUIRoomEngine.TUIRoomEvents.onRequestCancelled, onRequestCancelled);
});
Vue.onUnmounted(() => {
var _a, _b;
(_a = roomEngine.instance) == null ? void 0 : _a.off(TUIRoomEngine.TUIRoomEvents.onRequestReceived, onRequestReceived);
(_b = roomEngine.instance) == null ? void 0 : _b.off(
TUIRoomEngine.TUIRoomEvents.onRequestCancelled,
onRequestCancelled
);
});
return (_ctx, _cache) => {
return Vue.openBlock(), Vue.createElementBlock("div", null, [
Vue.createVNode(AudioMediaControl.default, {
"has-more": hasMore.value,
"is-muted": !Vue.unref(localUser).hasAudioStream,
"is-disabled": Vue.unref(isLocalAudioIconDisable),
"audio-volume": Vue.unref(userVolumeObj)[Vue.unref(localUser).userId],
onClick: handleAudioMediaClick
}, null, 8, ["has-more", "is-muted", "is-disabled", "audio-volume"]),
Vue.createVNode(index$1.default, {
modelValue: showRequestOpenMicDialog.value,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => showRequestOpenMicDialog.value = $event),
title: Vue.unref(t)("Tips"),
modal: true,
"show-close": false,
"close-on-click-modal": false,
width: "500px",
"append-to-room-container": true,
"confirm-button": Vue.unref(t)("Turn on the microphone"),
"cancel-button": Vue.unref(t)("Keep it closed"),
onConfirm: handleAccept,
onCancel: handleReject
}, {
footer: Vue.withCtx(() => [
Vue.createVNode(Button.default, {
class: "agree-button",
size: "default",
onClick: handleAccept
}, {
default: Vue.withCtx(() => [
Vue.createTextVNode(Vue.toDisplayString(Vue.unref(t)("Turn on the microphone")), 1)
]),
_: 1
}),
Vue.createVNode(Button.default, {
class: "cancel-button",
size: "default",
type: "primary",
onClick: handleReject
}, {
default: Vue.withCtx(() => [
Vue.createTextVNode(Vue.toDisplayString(Vue.unref(t)("Keep it closed")), 1)
]),
_: 1
})
]),
default: Vue.withCtx(() => [
Vue.createElementVNode("span", null, Vue.toDisplayString(dialogContent.value), 1)
]),
_: 1
}, 8, ["modelValue", "title", "confirm-button", "cancel-button"])
]);
};
}
});
exports.default = _sfc_main;