@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,
108 lines (97 loc) • 3.03 kB
text/typescript
import { ref, computed, watch } from 'vue';
import type { ComputedRef } from 'vue';
import { StreamInfo, useRoomStore } from '../../../stores/room';
import { storeToRefs } from 'pinia';
import { TUIVideoStreamType } from '@tencentcloud/tuiroom-engine-electron';
export default function useMultiStreamViewHook(props) {
const roomStore = useRoomStore();
const { streamList } = storeToRefs(roomStore);
const isHorizontalInfinityLayout = computed(
() => props.maxColumn === Infinity
);
const isVerticalInfinityLayout = computed(() => props.maxRow === Infinity);
const isEqualPointsLayout = computed(
() => props.maxColumn !== Infinity && props.maxRow !== Infinity
);
const column = computed(() => {
if (props.maxColumn === Infinity) {
return props.maxColumn;
}
return Math.min(
Math.ceil(Math.sqrt(renderStreamInfoList.value.length)),
props.maxColumn
);
});
const row = computed(() => {
if (props.maxRow === Infinity) {
return props.maxRow;
}
return Math.min(
Math.ceil(renderStreamInfoList.value.length / column.value),
props.maxRow
);
});
const currentPageIndex = ref(0);
const maxCountEveryPage = computed(() => props.maxColumn * props.maxRow);
const renderStreamInfoList: ComputedRef<StreamInfo[]> = computed(() => {
if (props.streamInfoList) {
return props.streamInfoList;
}
return streamList.value.filter(
(item1: StreamInfo) =>
!props.excludeStreamInfoList?.find(
(item2: { userId: string; streamType: TUIVideoStreamType }) =>
item2.userId === item1.userId &&
item2.streamType === item1.streamType
)
);
});
watch(
() => renderStreamInfoList.value.length,
val => {
if (isEqualPointsLayout.value) {
if (
currentPageIndex.value > 0 &&
currentPageIndex.value > Math.ceil(val / maxCountEveryPage.value) - 1
) {
currentPageIndex.value = Math.ceil(val / maxCountEveryPage.value) - 1;
}
}
}
);
const totalStreamNumber = computed(() => {
return streamList.value.length;
});
const equalPointsLayoutStreamList: ComputedRef<StreamInfo[][]> = computed(
() => {
if (isEqualPointsLayout.value) {
return [...new Array(totalPageNumber.value).keys()].map(
(pageIndex: number) => {
return renderStreamInfoList.value.slice(
pageIndex * maxCountEveryPage.value,
(pageIndex + 1) * maxCountEveryPage.value
);
}
);
}
return [[]];
}
);
const totalPageNumber = computed(() =>
Math.ceil(renderStreamInfoList.value.length / maxCountEveryPage.value)
);
return {
column,
row,
isHorizontalInfinityLayout,
isVerticalInfinityLayout,
isEqualPointsLayout,
maxCountEveryPage,
streamList,
renderStreamInfoList,
equalPointsLayoutStreamList,
totalStreamNumber,
totalPageNumber,
currentPageIndex,
};
}