@100mslive/roomkit-react 0.1.14 → 0.1.16
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/{HLSView-662T7R7H.js → HLSView-EMUOLCTM.js} +128 -39
- package/dist/HLSView-EMUOLCTM.js.map +7 -0
- package/dist/Prebuilt/common/PeersSorter.d.ts +1 -0
- package/dist/Prebuilt/common/constants.d.ts +9 -5
- package/dist/Prebuilt/common/hooks.d.ts +1 -0
- package/dist/Prebuilt/components/Footer/ParticipantList.d.ts +17 -0
- package/dist/Prebuilt/components/Footer/RoleAccordion.d.ts +3 -2
- package/dist/Prebuilt/components/Footer/WhiteboardToggle.d.ts +2 -0
- package/dist/Prebuilt/components/HMSVideo/HLSCaptionSelector.d.ts +5 -0
- package/dist/Prebuilt/components/Notifications/HandRaisedNotifications.d.ts +1 -0
- package/dist/Prebuilt/components/Polls/Voting/Leaderboard.d.ts +4 -0
- package/dist/Prebuilt/components/Polls/Voting/LeaderboardEntry.d.ts +9 -0
- package/dist/Prebuilt/components/Polls/Voting/PeerParticipationSummary.d.ts +5 -0
- package/dist/Prebuilt/components/PreviousRoleInMetadata.d.ts +1 -0
- package/dist/Prebuilt/components/RemoveParticipant.d.ts +5 -0
- package/dist/Prebuilt/components/hooks/useCloseScreenshareWhiteboard.d.ts +4 -0
- package/dist/Prebuilt/layouts/WhiteboardView.d.ts +2 -0
- package/dist/{chunk-2B7YYNHQ.js → chunk-ZYR4B4KQ.js} +2240 -1767
- package/dist/chunk-ZYR4B4KQ.js.map +7 -0
- package/dist/index.cjs.js +2805 -2172
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.js +1 -1
- package/dist/meta.cjs.json +739 -177
- package/dist/meta.esbuild.json +749 -186
- package/package.json +7 -7
- package/src/Prebuilt/AppStateContext.tsx +1 -1
- package/src/Prebuilt/common/PeersSorter.ts +24 -8
- package/src/Prebuilt/common/constants.ts +6 -6
- package/src/Prebuilt/common/hooks.ts +16 -0
- package/src/Prebuilt/common/utils.js +33 -0
- package/src/Prebuilt/components/AppData/AppData.tsx +1 -16
- package/src/Prebuilt/components/Chat/Chat.jsx +10 -34
- package/src/Prebuilt/components/Chat/ChatBody.jsx +107 -66
- package/src/Prebuilt/components/Chat/ChatFooter.tsx +21 -12
- package/src/Prebuilt/components/Chat/ChatSelector.tsx +25 -25
- package/src/Prebuilt/components/Chat/ChatSelectorContainer.tsx +15 -16
- package/src/Prebuilt/components/Chat/PinnedMessage.tsx +7 -2
- package/src/Prebuilt/components/ConferenceScreen.tsx +2 -0
- package/src/Prebuilt/components/Footer/ChatToggle.tsx +30 -7
- package/src/Prebuilt/components/Footer/Footer.tsx +2 -1
- package/src/Prebuilt/components/Footer/PaginatedParticipants.tsx +0 -1
- package/src/Prebuilt/components/Footer/{ParticipantList.jsx → ParticipantList.tsx} +169 -127
- package/src/Prebuilt/components/Footer/RoleAccordion.tsx +23 -13
- package/src/Prebuilt/components/Footer/WhiteboardToggle.tsx +34 -0
- package/src/Prebuilt/components/HMSVideo/HLSCaptionSelector.tsx +13 -0
- package/src/Prebuilt/components/HMSVideo/HMSVideo.jsx +34 -2
- package/src/Prebuilt/components/Notifications/HandRaisedNotifications.tsx +35 -0
- package/src/Prebuilt/components/Notifications/Notifications.tsx +47 -14
- package/src/Prebuilt/components/Notifications/PeerNotifications.tsx +7 -2
- package/src/Prebuilt/components/Polls/CreatePollQuiz/PollsQuizMenu.jsx +3 -9
- package/src/Prebuilt/components/Polls/CreateQuestions/CreateQuestions.jsx +21 -1
- package/src/Prebuilt/components/Polls/CreateQuestions/QuestionForm.jsx +34 -7
- package/src/Prebuilt/components/Polls/CreateQuestions/SavedQuestion.jsx +2 -2
- package/src/Prebuilt/components/Polls/Polls.tsx +3 -0
- package/src/Prebuilt/components/Polls/Voting/Leaderboard.tsx +115 -0
- package/src/Prebuilt/components/Polls/Voting/LeaderboardEntry.tsx +63 -0
- package/src/Prebuilt/components/Polls/Voting/PeerParticipationSummary.tsx +38 -0
- package/src/Prebuilt/components/Polls/Voting/QuestionCard.jsx +33 -8
- package/src/Prebuilt/components/Polls/Voting/StandardVoting.jsx +7 -1
- package/src/Prebuilt/components/Polls/Voting/Voting.jsx +31 -13
- package/src/Prebuilt/components/Polls/common/MultipleChoiceOptions.jsx +33 -21
- package/src/Prebuilt/components/Polls/common/SingleChoiceOptions.jsx +47 -35
- package/src/Prebuilt/components/Polls/common/StatusIndicator.jsx +2 -22
- package/src/Prebuilt/components/Polls/common/VoteCount.jsx +1 -15
- package/src/Prebuilt/components/PreviousRoleInMetadata.tsx +21 -0
- package/src/Prebuilt/components/RemoveParticipant.tsx +35 -0
- package/src/Prebuilt/components/RoleChangeModal.jsx +1 -1
- package/src/Prebuilt/components/SidePaneTabs.tsx +0 -1
- package/src/Prebuilt/components/TileMenu/TileMenuContent.tsx +1 -1
- package/src/Prebuilt/components/Toast/ToastConfig.jsx +15 -3
- package/src/Prebuilt/components/VideoLayouts/EqualProminence.tsx +6 -5
- package/src/Prebuilt/components/VideoLayouts/GridLayout.tsx +27 -5
- package/src/Prebuilt/components/VideoLayouts/ScreenshareLayout.tsx +0 -1
- package/src/Prebuilt/components/hooks/useCloseScreenshareWhiteboard.tsx +24 -0
- package/src/Prebuilt/layouts/HLSView.jsx +51 -3
- package/src/Prebuilt/layouts/VideoStreamingSection.tsx +20 -3
- package/src/Prebuilt/layouts/WhiteboardView.tsx +66 -0
- package/dist/HLSView-662T7R7H.js.map +0 -7
- package/dist/chunk-2B7YYNHQ.js.map +0 -7
- package/src/Prebuilt/components/AppData/useAppLayout.js +0 -6
- package/src/Prebuilt/components/init/initUtils.js +0 -67
package/package.json
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
"prebuilt",
|
11
11
|
"roomkit"
|
12
12
|
],
|
13
|
-
"version": "0.1.
|
13
|
+
"version": "0.1.16",
|
14
14
|
"author": "100ms",
|
15
15
|
"license": "MIT",
|
16
16
|
"files": [
|
@@ -76,11 +76,11 @@
|
|
76
76
|
"react": ">=17.0.2 <19.0.0"
|
77
77
|
},
|
78
78
|
"dependencies": {
|
79
|
-
"@100mslive/hls-player": "0.1.
|
80
|
-
"@100mslive/hms-virtual-background": "1.11.
|
81
|
-
"@100mslive/react-icons": "0.8.
|
82
|
-
"@100mslive/react-sdk": "0.8.
|
83
|
-
"@100mslive/types-prebuilt": "0.12.
|
79
|
+
"@100mslive/hls-player": "0.1.25",
|
80
|
+
"@100mslive/hms-virtual-background": "1.11.25",
|
81
|
+
"@100mslive/react-icons": "0.8.25",
|
82
|
+
"@100mslive/react-sdk": "0.8.25",
|
83
|
+
"@100mslive/types-prebuilt": "0.12.5",
|
84
84
|
"@emoji-mart/data": "^1.0.6",
|
85
85
|
"@emoji-mart/react": "^1.0.1",
|
86
86
|
"@radix-ui/react-accordion": "1.0.0",
|
@@ -115,5 +115,5 @@
|
|
115
115
|
"uuid": "^8.3.2",
|
116
116
|
"worker-timers": "^7.0.40"
|
117
117
|
},
|
118
|
-
"gitHead": "
|
118
|
+
"gitHead": "096d50e1ffbeb9f2ec895b630952d2ad9694dfee"
|
119
119
|
}
|
@@ -55,7 +55,7 @@ export const useAppStateManager = () => {
|
|
55
55
|
setActiveState(PrebuiltStates.MEETING);
|
56
56
|
} else if (
|
57
57
|
prevRoomState &&
|
58
|
-
[HMSRoomState.Reconnecting, HMSRoomState.Connected].includes(prevRoomState) &&
|
58
|
+
[HMSRoomState.Reconnecting, HMSRoomState.Connected, HMSRoomState.Connecting].includes(prevRoomState) &&
|
59
59
|
[HMSRoomState.Disconnecting, HMSRoomState.Disconnected].includes(roomState)
|
60
60
|
) {
|
61
61
|
const goTo = isPreviewScreenEnabled ? PrebuiltStates.PREVIEW : PrebuiltStates.MEETING;
|
@@ -17,6 +17,7 @@ class PeersSorter {
|
|
17
17
|
}
|
18
18
|
|
19
19
|
setPeersAndTilesPerPage = ({ peers, tilesPerPage }: { peers: HMSPeer[]; tilesPerPage: number }) => {
|
20
|
+
this.speaker = undefined;
|
20
21
|
this.tilesPerPage = tilesPerPage;
|
21
22
|
const peerIds = new Set(peers.map(peer => peer.id));
|
22
23
|
// remove existing peers which are no longer provided
|
@@ -46,10 +47,13 @@ class PeersSorter {
|
|
46
47
|
this.updateListeners();
|
47
48
|
this.listeners.clear();
|
48
49
|
this.storeUnsubscribe?.();
|
50
|
+
this.storeUnsubscribe = undefined;
|
51
|
+
this.speaker = undefined;
|
49
52
|
};
|
50
53
|
|
51
54
|
moveSpeakerToFront = (speaker?: HMSPeer) => {
|
52
55
|
if (!speaker) {
|
56
|
+
this.maintainLruSize(this.tilesPerPage);
|
53
57
|
this.updateListeners();
|
54
58
|
return;
|
55
59
|
}
|
@@ -59,19 +63,23 @@ class PeersSorter {
|
|
59
63
|
}
|
60
64
|
// delete to insert at beginning
|
61
65
|
this.lruPeers.delete(speaker.id);
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
}
|
66
|
-
this.lruPeers = new Set([speaker.id, ...lruPeerArray]);
|
66
|
+
// - 1 as we are going to insert the new speaker
|
67
|
+
this.maintainLruSize(this.tilesPerPage - 1);
|
68
|
+
this.lruPeers = new Set([speaker.id, ...this.lruPeers]);
|
67
69
|
this.updateListeners();
|
68
70
|
};
|
69
71
|
|
70
72
|
onDominantSpeakerChange = (speaker: HMSPeer | null) => {
|
71
|
-
|
72
|
-
|
73
|
-
|
73
|
+
// no speaker or is current speaker do nothing
|
74
|
+
if (!speaker || speaker.id === this.speaker?.id) {
|
75
|
+
return;
|
74
76
|
}
|
77
|
+
// if the active speaker is not from the peers passed ignore
|
78
|
+
if (!this.peers.has(speaker.id)) {
|
79
|
+
return;
|
80
|
+
}
|
81
|
+
this.speaker = speaker;
|
82
|
+
this.moveSpeakerToFront(speaker);
|
75
83
|
};
|
76
84
|
|
77
85
|
updateListeners = () => {
|
@@ -89,6 +97,14 @@ class PeersSorter {
|
|
89
97
|
});
|
90
98
|
this.listeners.forEach(listener => listener?.(orderedPeers));
|
91
99
|
};
|
100
|
+
|
101
|
+
private maintainLruSize = (size: number) => {
|
102
|
+
const lruPeerArray = Array.from(this.lruPeers);
|
103
|
+
while (lruPeerArray.length > size && lruPeerArray.length) {
|
104
|
+
lruPeerArray.pop();
|
105
|
+
}
|
106
|
+
this.lruPeers = new Set(lruPeerArray);
|
107
|
+
};
|
92
108
|
}
|
93
109
|
|
94
110
|
export default PeersSorter;
|
@@ -17,7 +17,7 @@ export const RTMP_RECORD_DEFAULT_RESOLUTION = {
|
|
17
17
|
export const EMOJI_REACTION_TYPE = 'EMOJI_REACTION';
|
18
18
|
|
19
19
|
export const CHAT_SELECTOR = {
|
20
|
-
|
20
|
+
PEER: 'peer',
|
21
21
|
ROLE: 'role',
|
22
22
|
EVERYONE: 'Everyone',
|
23
23
|
};
|
@@ -33,7 +33,6 @@ export const APP_DATA = {
|
|
33
33
|
waitingViewerRole: 'waitingViewerRole',
|
34
34
|
subscribedNotifications: 'subscribedNotifications',
|
35
35
|
logo: 'logo',
|
36
|
-
appLayout: 'appLayout',
|
37
36
|
hlsStarted: 'hlsStarted',
|
38
37
|
rtmpStarted: 'rtmpStarted',
|
39
38
|
recordingStarted: 'recordingStarted',
|
@@ -111,6 +110,7 @@ export enum SESSION_STORE_KEY {
|
|
111
110
|
CHAT_PEER_BLACKLIST = 'chatPeerBlacklist',
|
112
111
|
CHAT_MESSAGE_BLACKLIST = 'chatMessageBlacklist',
|
113
112
|
CHAT_STATE = 'chatState',
|
113
|
+
SHARED_LEADERBOARDS = 'sharedLeaderboards',
|
114
114
|
}
|
115
115
|
|
116
116
|
export enum INTERACTION_TYPE {
|
@@ -121,15 +121,15 @@ export enum INTERACTION_TYPE {
|
|
121
121
|
export enum QUESTION_TYPE_TITLE {
|
122
122
|
'single-choice' = 'Single Choice',
|
123
123
|
'multiple-choice' = 'Multiple Choice',
|
124
|
-
|
125
|
-
|
124
|
+
'short-answer' = 'Short Answer',
|
125
|
+
'long-answer' = 'Long Answer',
|
126
126
|
}
|
127
127
|
|
128
128
|
export enum QUESTION_TYPE {
|
129
129
|
SINGLE_CHOICE = 'single-choice',
|
130
130
|
MULTIPLE_CHOICE = 'multiple-choice',
|
131
|
-
|
132
|
-
|
131
|
+
SHORT_ANSWER = 'short-answer',
|
132
|
+
LONG_ANSWER = 'long-answer',
|
133
133
|
}
|
134
134
|
|
135
135
|
export const ROLE_CHANGE_DECLINED = 'role_change_declined';
|
@@ -12,6 +12,7 @@ import {
|
|
12
12
|
} from '@100mslive/react-sdk';
|
13
13
|
import { useRoomLayout } from '../provider/roomLayoutProvider';
|
14
14
|
import { useRoomLayoutConferencingScreen } from '../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
15
|
+
import { CHAT_SELECTOR } from './constants';
|
15
16
|
/**
|
16
17
|
* Hook to execute a callback when alone in room(after a certain 5d of time)
|
17
18
|
* @param {number} thresholdMs The threshold(in ms) after which the callback is executed,
|
@@ -55,6 +56,21 @@ export const useFilteredRoles = () => {
|
|
55
56
|
return elements?.chat?.roles_whitelist || [];
|
56
57
|
};
|
57
58
|
|
59
|
+
export const useDefaultChatSelection = () => {
|
60
|
+
const { elements } = useRoomLayoutConferencingScreen();
|
61
|
+
const roles = useFilteredRoles();
|
62
|
+
// default is everyone for public chat
|
63
|
+
if (elements?.chat?.public_chat_enabled) {
|
64
|
+
return CHAT_SELECTOR.EVERYONE;
|
65
|
+
}
|
66
|
+
// sending first role as default
|
67
|
+
if (roles.length > 0) {
|
68
|
+
return roles[0];
|
69
|
+
}
|
70
|
+
// sending empty
|
71
|
+
return '';
|
72
|
+
};
|
73
|
+
|
58
74
|
export const useShowStreamingUI = () => {
|
59
75
|
const layout = useRoomLayout();
|
60
76
|
const { join_form } = layout?.screens?.preview?.default?.elements || {};
|
@@ -137,3 +137,36 @@ export const calculateAvatarAndAttribBoxSize = (calculatedWidth, calculatedHeigh
|
|
137
137
|
};
|
138
138
|
|
139
139
|
export const isMobileUserAgent = /Mobi|Android|iPhone/i.test(navigator.userAgent);
|
140
|
+
|
141
|
+
export const getPeerResponses = (questions, peerid, userid) => {
|
142
|
+
return questions.map(question =>
|
143
|
+
question.responses?.filter(
|
144
|
+
response =>
|
145
|
+
((response && response.peer?.peerid === peerid) || response.peer?.userid === userid) && !response.skipped,
|
146
|
+
),
|
147
|
+
);
|
148
|
+
};
|
149
|
+
|
150
|
+
export const getPeerParticipationSummary = (poll, localPeerID, localCustomerUserID) => {
|
151
|
+
let correctResponses = 0;
|
152
|
+
let score = 0;
|
153
|
+
const questions = poll.questions || [];
|
154
|
+
const peerResponses = getPeerResponses(questions, localPeerID, localCustomerUserID);
|
155
|
+
let totalResponses = peerResponses.length || 0;
|
156
|
+
|
157
|
+
peerResponses.forEach(peerResponse => {
|
158
|
+
if (!peerResponse?.[0]) {
|
159
|
+
return;
|
160
|
+
}
|
161
|
+
const isCorrect = checkCorrectAnswer(
|
162
|
+
questions[peerResponse[0].questionIndex - 1].answer,
|
163
|
+
peerResponse[0],
|
164
|
+
questions[peerResponse[0].questionIndex - 1].type,
|
165
|
+
);
|
166
|
+
if (isCorrect) {
|
167
|
+
score += questions[peerResponse[0].questionIndex - 1]?.weight || 0;
|
168
|
+
correctResponses++;
|
169
|
+
}
|
170
|
+
});
|
171
|
+
return { totalResponses, correctResponses, score };
|
172
|
+
};
|
@@ -1,11 +1,8 @@
|
|
1
1
|
import React, { useEffect } from 'react';
|
2
2
|
import {
|
3
3
|
HMSRoomState,
|
4
|
-
selectAvailableRoleNames,
|
5
4
|
selectFullAppData,
|
6
5
|
selectHLSState,
|
7
|
-
selectLocalPeerRoleName,
|
8
|
-
selectRolesMap,
|
9
6
|
selectRoomState,
|
10
7
|
selectRTMPState,
|
11
8
|
useHMSActions,
|
@@ -13,8 +10,6 @@ import {
|
|
13
10
|
useRecordingStreaming,
|
14
11
|
} from '@100mslive/react-sdk';
|
15
12
|
//@ts-ignore
|
16
|
-
import { normalizeAppPolicyConfig } from '../init/initUtils';
|
17
|
-
//@ts-ignore
|
18
13
|
import { UserPreferencesKeys, useUserPreferences } from '../hooks/useUserPreferences';
|
19
14
|
// @ts-ignore
|
20
15
|
import { useIsSidepaneTypeOpen, useSidepaneToggle } from './useSidepane';
|
@@ -49,7 +44,7 @@ const initialAppData = {
|
|
49
44
|
[APP_DATA.chatOpen]: false,
|
50
45
|
[APP_DATA.chatSelector]: {
|
51
46
|
[CHAT_SELECTOR.ROLE]: '',
|
52
|
-
[CHAT_SELECTOR.
|
47
|
+
[CHAT_SELECTOR.PEER]: {},
|
53
48
|
},
|
54
49
|
[APP_DATA.chatDraft]: '',
|
55
50
|
[APP_DATA.sidePane]: '',
|
@@ -73,9 +68,6 @@ const initialAppData = {
|
|
73
68
|
export const AppData = React.memo(() => {
|
74
69
|
const hmsActions = useHMSActions();
|
75
70
|
const [preferences = {}] = useUserPreferences(UserPreferencesKeys.UI_SETTINGS);
|
76
|
-
const roleNames = useHMSStore(selectAvailableRoleNames);
|
77
|
-
const rolesMap = useHMSStore(selectRolesMap);
|
78
|
-
const localPeerRole = useHMSStore(selectLocalPeerRoleName);
|
79
71
|
const appData = useHMSStore(selectFullAppData);
|
80
72
|
|
81
73
|
useEffect(() => {
|
@@ -109,13 +101,6 @@ export const AppData = React.memo(() => {
|
|
109
101
|
hmsActions.setAppData(APP_DATA.subscribedNotifications, preferences.subscribedNotifications, true);
|
110
102
|
}, [preferences.subscribedNotifications, hmsActions]);
|
111
103
|
|
112
|
-
useEffect(() => {
|
113
|
-
if (localPeerRole) {
|
114
|
-
const config = normalizeAppPolicyConfig(roleNames, rolesMap);
|
115
|
-
hmsActions.setAppData(APP_DATA.appLayout, config[localPeerRole]);
|
116
|
-
}
|
117
|
-
}, [roleNames, rolesMap, localPeerRole, hmsActions]);
|
118
|
-
|
119
104
|
return <ResetStreamingStart />;
|
120
105
|
});
|
121
106
|
|
@@ -1,13 +1,7 @@
|
|
1
|
-
import React, { useCallback,
|
1
|
+
import React, { useCallback, useRef, useState } from 'react';
|
2
2
|
import { useMedia } from 'react-use';
|
3
|
-
import { selectLocalPeer,
|
4
|
-
import {
|
5
|
-
HMSNotificationTypes,
|
6
|
-
selectHMSMessagesCount,
|
7
|
-
useHMSActions,
|
8
|
-
useHMSNotifications,
|
9
|
-
useHMSStore,
|
10
|
-
} from '@100mslive/react-sdk';
|
3
|
+
import { selectLocalPeer, selectSessionStore, selectUnreadHMSMessagesCount } from '@100mslive/hms-video-store';
|
4
|
+
import { selectHMSMessagesCount, useHMSActions, useHMSStore } from '@100mslive/react-sdk';
|
11
5
|
import { ChevronDownIcon } from '@100mslive/react-icons';
|
12
6
|
import { Button } from '../../../Button';
|
13
7
|
import { Flex } from '../../../Layout';
|
@@ -17,33 +11,18 @@ import { ChatFooter } from './ChatFooter';
|
|
17
11
|
import { ChatBlocked, ChatPaused } from './ChatStates';
|
18
12
|
import { PinnedMessage } from './PinnedMessage';
|
19
13
|
import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
20
|
-
import { useSetSubscribedChatSelector } from '../AppData/useUISettings';
|
21
14
|
import { useSetPinnedMessages } from '../hooks/useSetPinnedMessages';
|
22
|
-
import {
|
23
|
-
import { CHAT_SELECTOR, SESSION_STORE_KEY } from '../../common/constants';
|
15
|
+
import { SESSION_STORE_KEY } from '../../common/constants';
|
24
16
|
|
25
17
|
export const Chat = () => {
|
26
18
|
const { elements, screenType } = useRoomLayoutConferencingScreen();
|
27
|
-
const notification = useHMSNotifications(HMSNotificationTypes.PEER_LEFT);
|
28
|
-
const [selectedPeer, setPeerSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.PEER_ID);
|
29
|
-
const [selectedRole, setRoleSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.ROLE);
|
30
19
|
const localPeer = useHMSStore(selectLocalPeer);
|
31
20
|
const [isSelectorOpen] = useState(false);
|
32
21
|
const listRef = useRef(null);
|
33
22
|
const hmsActions = useHMSActions();
|
34
23
|
const { removePinnedMessage } = useSetPinnedMessages();
|
35
24
|
const pinnedMessages = useHMSStore(selectSessionStore(SESSION_STORE_KEY.PINNED_MESSAGES)) || [];
|
36
|
-
const isPeerPresent = !!useHMSStore(selectPeerByID(selectedPeer));
|
37
25
|
|
38
|
-
useEffect(() => {
|
39
|
-
if (notification && notification.data && selectedPeer === notification.data.id) {
|
40
|
-
setPeerSelector('');
|
41
|
-
setRoleSelector('');
|
42
|
-
}
|
43
|
-
if (selectedPeer && !isPeerPresent) {
|
44
|
-
setPeerSelector('');
|
45
|
-
}
|
46
|
-
}, [notification, selectedPeer, setPeerSelector, setRoleSelector, isPeerPresent]);
|
47
26
|
const blacklistedPeerIDs = useHMSStore(selectSessionStore(SESSION_STORE_KEY.CHAT_PEER_BLACKLIST)) || [];
|
48
27
|
const blacklistedPeerIDSet = new Set(blacklistedPeerIDs);
|
49
28
|
const isLocalPeerBlacklisted = blacklistedPeerIDSet.has(localPeer?.customerUserId);
|
@@ -97,17 +76,15 @@ export const Chat = () => {
|
|
97
76
|
|
98
77
|
{isChatEnabled && !isLocalPeerBlacklisted ? (
|
99
78
|
<ChatFooter onSend={() => scrollToBottom(1)} screenType={screenType}>
|
100
|
-
{!isSelectorOpen && !isScrolledToBottom &&
|
101
|
-
<NewMessageIndicator role={selectedRole} peerId={selectedPeer} scrollToBottom={scrollToBottom} />
|
102
|
-
)}
|
79
|
+
{!isSelectorOpen && !isScrolledToBottom && <NewMessageIndicator scrollToBottom={scrollToBottom} />}
|
103
80
|
</ChatFooter>
|
104
81
|
) : null}
|
105
82
|
</Flex>
|
106
83
|
);
|
107
84
|
};
|
108
85
|
|
109
|
-
const NewMessageIndicator = ({
|
110
|
-
const unreadCount =
|
86
|
+
const NewMessageIndicator = ({ scrollToBottom }) => {
|
87
|
+
const unreadCount = useHMSStore(selectUnreadHMSMessagesCount);
|
111
88
|
if (!unreadCount) {
|
112
89
|
return null;
|
113
90
|
}
|
@@ -128,9 +105,8 @@ const NewMessageIndicator = ({ role, peerId, scrollToBottom }) => {
|
|
128
105
|
}}
|
129
106
|
icon
|
130
107
|
css={{
|
131
|
-
p: '$4',
|
132
|
-
pl: '$
|
133
|
-
pr: '$6',
|
108
|
+
p: '$3 $4',
|
109
|
+
pl: '$6',
|
134
110
|
'& > svg': { ml: '$4' },
|
135
111
|
borderRadius: '$round',
|
136
112
|
position: 'relative',
|
@@ -141,7 +117,7 @@ const NewMessageIndicator = ({ role, peerId, scrollToBottom }) => {
|
|
141
117
|
}}
|
142
118
|
>
|
143
119
|
New {unreadCount === 1 ? 'message' : 'messages'}
|
144
|
-
<ChevronDownIcon />
|
120
|
+
<ChevronDownIcon height={16} width={16} />
|
145
121
|
</Button>
|
146
122
|
</Flex>
|
147
123
|
);
|