@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,
203 lines (202 loc) • 5.66 kB
JavaScript
import { ref, computed, reactive } from "vue";
import { TUIVideoStreamType } from "@tencentcloud/tuiroom-engine-js";
import { RoomState } from "../type/Room.mjs";
import { del, set } from "../../utils/vue.mjs";
import { getNewStreamInfo } from "./utils/stream.mjs";
import { getUserListSortComparator, getNewUserInfo } from "./utils/user.mjs";
const roomState = ref(RoomState.Idle);
const roomId = ref("");
const roomInfo = ref();
const userInfoObj = ref({});
const streamInfoObj = ref({});
const localUserId = ref("");
const userSearchText = ref("");
const seatApplicationRequestList = ref([]);
const seatInvitationRequest = ref(null);
const localUser = computed(
() => userInfoObj.value[localUserId.value]
);
const localStream = computed(
() => streamInfoObj.value[`${localUserId.value}_${TUIVideoStreamType.kCameraStream}`]
);
const userList = computed(() => {
return [...Object.values(userInfoObj.value)].sort(
getUserListSortComparator({ localUserId: localUserId.value })
);
});
const onSeatUserList = computed(() => {
return userList.value.filter((item) => item.isOnSeat);
});
const remoteUserList = computed(() => {
return [...Object.values(userInfoObj.value)].filter(
(item) => item.userId !== localUserId.value
);
});
const applyToOnSeatUserList = computed(() => {
const applyToOnSeatUserIdList = seatApplicationRequestList.value.map(
(item) => item.userId
);
return applyToOnSeatUserIdList.map((userId) => userInfoObj.value[userId]).sort((item1, item2) => item1.timestamp - item2.timestamp);
});
function setRoomInfo(data) {
var _a;
const newRoomInfo = { ...roomInfo.value, ...data };
roomInfo.value = newRoomInfo;
if ((_a = roomInfo.value) == null ? void 0 : _a.roomId) {
roomId.value = roomInfo.value.roomId;
}
}
function setLocalUser(options) {
localUserId.value = options.userId;
}
function addUserInfo(userInfo) {
const { userId } = userInfo;
if (!userId) {
return;
}
let newUserInfo;
if (userInfoObj.value[userId]) {
newUserInfo = Object.assign(userInfoObj.value[userId], userInfo);
} else {
newUserInfo = Object.assign(getNewUserInfo(userId), userInfo);
}
newUserInfo.displayName = getDisplayName(newUserInfo);
userInfoObj.value[userId] = newUserInfo;
}
function updateUserInfo(userInfo) {
if (!userInfo.userId) {
return;
}
const newUserInfo = Object.assign(
userInfoObj.value[userInfo.userId],
userInfo
);
newUserInfo.displayName = getDisplayName(newUserInfo);
userInfoObj.value[userInfo.userId] = newUserInfo;
}
function removeUserInfo(userId) {
if (!userId || userId === localUserId.value) {
return;
}
if (userInfoObj.value[userId]) {
delete userInfoObj.value[userId];
}
}
function getUserInfo(options) {
return userInfoObj.value[options.userId];
}
function getRecordStreamType(streamType) {
if (streamType === TUIVideoStreamType.kCameraStreamLow) {
return TUIVideoStreamType.kCameraStream;
}
return streamType;
}
function addStreamInfo(userId, streamType) {
const recordStreamType = getRecordStreamType(streamType);
if (streamInfoObj.value[`${userId}_${recordStreamType}`]) {
return;
}
const newStreamInfo = getNewStreamInfo(userId, recordStreamType);
set(streamInfoObj.value, `${userId}_${recordStreamType}`, newStreamInfo);
}
function updateStreamInfo(streamInfo) {
const { userId, streamType } = streamInfo;
const recordStreamType = getRecordStreamType(streamType);
if (!streamInfoObj.value[`${userId}_${recordStreamType}`]) {
return;
}
if (streamType !== recordStreamType) {
Object.assign(streamInfo, { streamType: recordStreamType });
}
set(
streamInfoObj.value,
`${userId}_${recordStreamType}`,
Object.assign(
streamInfoObj.value[`${userId}_${recordStreamType}`],
streamInfo
)
);
}
function removeStreamInfo(userId, streamType) {
const recordStreamType = getRecordStreamType(streamType);
if (streamInfoObj.value[`${userId}_${recordStreamType}`]) {
del(streamInfoObj.value, `${userId}_${recordStreamType}`);
}
}
function addSeatApplicationRequest(request) {
seatApplicationRequestList.value.push(request);
}
function removeSeatApplicationRequest(request) {
seatApplicationRequestList.value = seatApplicationRequestList.value.filter(
(item) => item.requestAction !== request.requestAction
);
}
function setSeatInvitationRequest(request) {
seatInvitationRequest.value = request;
}
function getDisplayName(options) {
const { nameCard, userName, userId } = options;
return nameCard || userName || userId;
}
function reset() {
roomId.value = "";
roomState.value = RoomState.Idle;
roomInfo.value = void 0;
userInfoObj.value = {};
streamInfoObj.value = {};
}
const store = reactive({
roomId,
roomState,
roomInfo,
setRoomInfo,
userInfoObj,
userList,
localUser,
remoteUserList,
streamInfoObj,
localStream,
onSeatUserList,
applyToOnSeatUserList,
userSearchText,
seatApplicationRequestList,
seatInvitationRequest,
setLocalUser,
addUserInfo,
updateUserInfo,
getUserInfo,
removeUserInfo,
addStreamInfo,
updateStreamInfo,
removeStreamInfo,
reset,
addSeatApplicationRequest,
removeSeatApplicationRequest,
setSeatInvitationRequest
});
function useStore(options) {
return {
store,
roomId,
roomState,
roomInfo,
userInfoObj,
userList,
localUser,
remoteUserList,
streamInfoObj,
localStream,
onSeatUserList,
applyToOnSeatUserList,
userSearchText,
seatApplicationRequestList,
seatInvitationRequest
};
}
export {
addUserInfo,
useStore as default,
setLocalUser,
setRoomInfo,
updateUserInfo
};