-
Notifications
You must be signed in to change notification settings - Fork 17
/
ConferenceParticipantGrid.js
103 lines (98 loc) · 3.29 KB
/
ConferenceParticipantGrid.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import React, { useRef, useState } from "react";
import { View, Dimensions, ActivityIndicator } from "react-native";
import BottomSheet from "../../../components/BottomSheet";
import { useOrientation } from "../../../utils/useOrientation";
import ParticipantStatsViewer from "../Components/ParticipantStatsViewer";
import ParticipantView from "./ParticipantView";
import PauseInvisibleParticipants from "./PauseInvisibleParticipant";
const MemoizedParticipant = React.memo(
ParticipantView,
(
{ participantId, quality, key, openStatsBottomSheet },
{
participantId: oldParticipantId,
quality: oldQuality,
key: oldkey,
openStatsBottomSheet: oldopenStatsBottomSheet,
}
) =>
participantId === oldParticipantId &&
quality === oldQuality &&
key === oldkey &&
openStatsBottomSheet === oldopenStatsBottomSheet
);
function ConferenceParticipantGrid({ participantIds, isPresenting }) {
const orientation = useOrientation();
const participantCount = participantIds.length;
const perRow = isPresenting ? 2 : participantCount >= 3 ? 2 : 1;
const quality =
participantCount > 4 ? "low" : participantCount > 2 ? "med" : "high";
const bottomSheetRef = useRef();
const [participantId, setParticipantId] = useState("");
const openStatsBottomSheet = ({ pId }) => {
setParticipantId(pId);
bottomSheetRef.current.show();
};
return (
<>
<PauseInvisibleParticipants visibleParticipantIds={participantIds} />
{Array.from({ length: Math.ceil(participantCount / perRow) }, (_, i) => {
return (
<View
style={{
flex: 1,
flexDirection: orientation == "PORTRAIT" ? "row" : "column",
}}
>
{participantIds
.slice(i * perRow, (i + 1) * perRow)
.map((participantId) => {
return (
<MemoizedParticipant
key={participantId}
participantId={participantId}
quality={quality}
openStatsBottomSheet={openStatsBottomSheet}
/>
);
})}
<BottomSheet
sheetBackgroundColor={"#2B3034"}
draggable={false}
radius={12}
hasDraggableIcon
closeFunction={() => {
setParticipantId("");
}}
ref={bottomSheetRef}
height={Dimensions.get("window").height * 0.5}
>
{participantId ? (
<ParticipantStatsViewer participantId={participantId} />
) : (
<View
style={{
flex: 1,
justifyContent: "center",
alignItems: "center",
}}
>
<ActivityIndicator size={"large"} />
</View>
)}
</BottomSheet>
</View>
);
})}
</>
);
}
export const MemoizedParticipantGrid = React.memo(
ConferenceParticipantGrid,
(
{ participantIds, isPresenting },
{ participantIds: oldParticipantIds, isPresenting: oldIsPresenting }
) =>
JSON.stringify(participantIds) === JSON.stringify(oldParticipantIds) &&
isPresenting === oldIsPresenting
);