@100mslive/roomkit-react 0.3.21 → 0.3.22-alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/Accordion/Accordion.d.ts +134 -322
- package/dist/Accordion/index.d.ts +134 -322
- package/dist/Avatar/Avatar.d.ts +47 -141
- package/dist/Button/Button.d.ts +47 -141
- package/dist/Checkbox/Checkbox.d.ts +134 -322
- package/dist/Collapsible/Collapsible.d.ts +201 -483
- package/dist/Divider/Divider.d.ts +134 -322
- package/dist/Dropdown/Dropdown.d.ts +804 -1932
- package/dist/Fieldset/Fieldset.d.ts +47 -141
- package/dist/Footer/Footer.d.ts +536 -1288
- package/dist/{HLSView-CIEOVB7G.js → HLSView-LCFZPBH3.js} +2 -2
- package/dist/{HLSView-IUYITNDV.css → HLSView-Z2JID2W7.css} +3 -3
- package/dist/{HLSView-IUYITNDV.css.map → HLSView-Z2JID2W7.css.map} +1 -1
- package/dist/IconButton/IconButton.d.ts +47 -141
- package/dist/Input/Input.d.ts +362 -926
- package/dist/Label/Label.d.ts +47 -141
- package/dist/Layout/Box.d.ts +47 -141
- package/dist/Layout/Flex.d.ts +47 -141
- package/dist/Link/Link.d.ts +47 -141
- package/dist/Modal/Dialog.d.ts +329 -987
- package/dist/Modal/DialogContent.d.ts +469 -1127
- package/dist/Pagination/StyledPagination.d.ts +268 -644
- package/dist/Popover/index.d.ts +201 -483
- package/dist/Prebuilt/IconButton.d.ts +134 -322
- package/dist/Prebuilt/components/Chat/ChatBody.d.ts +134 -322
- package/dist/Prebuilt/components/Leave/LeaveAtoms.d.ts +335 -805
- package/dist/Prebuilt/components/Notifications/DeviceChangeNotifications.d.ts +1 -0
- package/dist/Prebuilt/components/Notifications/DeviceInUseError.d.ts +2 -0
- package/dist/Prebuilt/components/Notifications/ErrorNotifications.d.ts +1 -0
- package/dist/Prebuilt/components/Notifications/MessageNotifications.d.ts +1 -0
- package/dist/Prebuilt/components/Notifications/PollNotificationModal.d.ts +1 -0
- package/dist/Prebuilt/components/Settings/common.d.ts +134 -322
- package/dist/Progress/index.d.ts +134 -322
- package/dist/RadioGroup/RadioGroup.d.ts +201 -483
- package/dist/ReactSelect/ReactSelect.d.ts +670 -1610
- package/dist/Select/Select.d.ts +201 -483
- package/dist/Sheet/Sheet.d.ts +329 -987
- package/dist/Slider/Slider.d.ts +47 -141
- package/dist/Stats/StyledStats.d.ts +402 -966
- package/dist/Switch/Switch.d.ts +47 -141
- package/dist/Tabs/Tabs.d.ts +268 -644
- package/dist/Text/Text.d.ts +47 -141
- package/dist/TextArea/TextArea.d.ts +47 -141
- package/dist/Theme/base.config.d.ts +26 -78
- package/dist/Theme/stitches.config.d.ts +1046 -1493
- package/dist/TileMenu/StyledMenuTile.d.ts +469 -1127
- package/dist/Toast/Toast.d.ts +382 -946
- package/dist/Video/Video.d.ts +47 -141
- package/dist/VideoList/StyledVideoList.d.ts +201 -483
- package/dist/VideoTile/StyledVideoTile.d.ts +670 -1610
- package/dist/{chunk-D6EIIW34.js → chunk-CRGZUJSX.js} +1000 -875
- package/dist/chunk-CRGZUJSX.js.map +7 -0
- package/dist/index.cjs.css +2 -2
- package/dist/index.cjs.css.map +1 -1
- package/dist/index.cjs.js +1038 -861
- package/dist/index.cjs.js.map +4 -4
- package/dist/index.css +2 -2
- package/dist/index.css.map +1 -1
- package/dist/index.js +1 -1
- package/dist/meta.cjs.json +348 -78
- package/dist/meta.esbuild.json +355 -85
- package/package.json +8 -8
- package/src/Avatar/Avatar.tsx +1 -1
- package/src/Popover/Popover.stories.tsx +1 -1
- package/src/Prebuilt/components/Header/common.jsx +6 -5
- package/src/Prebuilt/components/Notifications/DeviceChangeNotifications.tsx +18 -0
- package/src/Prebuilt/components/Notifications/DeviceInUseError.tsx +79 -0
- package/src/Prebuilt/components/Notifications/ErrorNotifications.tsx +56 -0
- package/src/Prebuilt/components/Notifications/MessageNotifications.tsx +24 -0
- package/src/Prebuilt/components/Notifications/Notifications.tsx +13 -159
- package/src/Prebuilt/components/Notifications/PeerNotifications.tsx +23 -2
- package/src/Prebuilt/components/Notifications/PollNotificationModal.tsx +71 -0
- package/src/Prebuilt/components/Notifications/ReconnectNotifications.tsx +1 -5
- package/src/Prebuilt/components/Notifications/TrackBulkUnmuteModal.tsx +7 -5
- package/src/Prebuilt/components/Notifications/TrackNotifications.tsx +23 -1
- package/src/Prebuilt/components/Notifications/TrackUnmuteModal.tsx +13 -5
- package/src/Prebuilt/components/StatsForNerds.jsx +32 -3
- package/src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx +2 -2
- package/src/Prebuilt/components/VirtualBackground/VBOption.tsx +3 -1
- package/src/Prebuilt/components/VirtualBackground/VBPicker.tsx +6 -0
- package/dist/chunk-D6EIIW34.js.map +0 -7
- /package/dist/{HLSView-CIEOVB7G.js.map → HLSView-LCFZPBH3.js.map} +0 -0
package/package.json
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
"prebuilt",
|
11
11
|
"roomkit"
|
12
12
|
],
|
13
|
-
"version": "0.3.
|
13
|
+
"version": "0.3.22-alpha.1",
|
14
14
|
"author": "100ms",
|
15
15
|
"license": "MIT",
|
16
16
|
"repository": {
|
@@ -75,12 +75,12 @@
|
|
75
75
|
"react": ">=17.0.2 <19.0.0"
|
76
76
|
},
|
77
77
|
"dependencies": {
|
78
|
-
"@100mslive/hls-player": "0.3.
|
78
|
+
"@100mslive/hls-player": "0.3.22-alpha.1",
|
79
79
|
"@100mslive/hms-noise-cancellation": "0.0.1",
|
80
|
-
"@100mslive/hms-virtual-background": "1.13.
|
81
|
-
"@100mslive/hms-whiteboard": "0.0.
|
82
|
-
"@100mslive/react-icons": "0.10.
|
83
|
-
"@100mslive/react-sdk": "0.10.
|
80
|
+
"@100mslive/hms-virtual-background": "1.13.22-alpha.1",
|
81
|
+
"@100mslive/hms-whiteboard": "0.0.12-alpha.1",
|
82
|
+
"@100mslive/react-icons": "0.10.22-alpha.1",
|
83
|
+
"@100mslive/react-sdk": "0.10.22-alpha.1",
|
84
84
|
"@100mslive/types-prebuilt": "0.12.12",
|
85
85
|
"@emoji-mart/data": "^1.0.6",
|
86
86
|
"@emoji-mart/react": "^1.0.1",
|
@@ -99,7 +99,7 @@
|
|
99
99
|
"@radix-ui/react-tabs": "1.0.0",
|
100
100
|
"@radix-ui/react-toast": "1.0.0",
|
101
101
|
"@radix-ui/react-tooltip": "1.0.6",
|
102
|
-
"@stitches/react": "
|
102
|
+
"@stitches/react": "1.3.1-1",
|
103
103
|
"emoji-mart": "^5.2.2",
|
104
104
|
"eventemitter2": "^6.4.9",
|
105
105
|
"lodash.merge": "^4.6.2",
|
@@ -117,5 +117,5 @@
|
|
117
117
|
"uuid": "^8.3.2",
|
118
118
|
"worker-timers": "^7.0.40"
|
119
119
|
},
|
120
|
-
"gitHead": "
|
120
|
+
"gitHead": "12d0289650b160b7c4b97cbd4336877a2e4baf4b"
|
121
121
|
}
|
package/src/Avatar/Avatar.tsx
CHANGED
@@ -2,6 +2,7 @@ import React from 'react';
|
|
2
2
|
import {
|
3
3
|
DeviceType,
|
4
4
|
getAudioDeviceCategory,
|
5
|
+
HMSAudioDeviceCategory,
|
5
6
|
selectIsLocalVideoEnabled,
|
6
7
|
selectLocalVideoTrackID,
|
7
8
|
selectVideoTrackByID,
|
@@ -79,13 +80,13 @@ export const AudioActions = () => {
|
|
79
80
|
if (!audioFiltered) {
|
80
81
|
return null;
|
81
82
|
}
|
82
|
-
const deviceCategory = getAudioDeviceCategory(currentSelection
|
83
|
+
const deviceCategory = getAudioDeviceCategory(currentSelection?.label);
|
83
84
|
let AudioIcon = <SpeakerIcon />;
|
84
|
-
if (deviceCategory ===
|
85
|
+
if (deviceCategory === HMSAudioDeviceCategory.BLUETOOTH) {
|
85
86
|
AudioIcon = <BluetoothIcon />;
|
86
|
-
} else if (deviceCategory ===
|
87
|
+
} else if (deviceCategory === HMSAudioDeviceCategory.WIRED) {
|
87
88
|
AudioIcon = <HeadphonesIcon />;
|
88
|
-
} else if (deviceCategory ===
|
89
|
+
} else if (deviceCategory === HMSAudioDeviceCategory.EARPIECE) {
|
89
90
|
AudioIcon = <TelePhoneIcon />;
|
90
91
|
}
|
91
92
|
return (
|
@@ -112,7 +113,7 @@ export const AudioActions = () => {
|
|
112
113
|
await hmsActions.refreshDevices();
|
113
114
|
}}
|
114
115
|
>
|
115
|
-
<IconButton>{AudioIcon}
|
116
|
+
<IconButton>{AudioIcon}</IconButton>
|
116
117
|
</Box>
|
117
118
|
</AudioSelectionSheet>
|
118
119
|
);
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { useEffect } from 'react';
|
2
|
+
import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
|
3
|
+
// @ts-ignore: No implicit Any
|
4
|
+
import { ToastManager } from '../Toast/ToastManager';
|
5
|
+
|
6
|
+
export const DeviceChangeNotifications = () => {
|
7
|
+
const notification = useHMSNotifications(HMSNotificationTypes.DEVICE_CHANGE_UPDATE);
|
8
|
+
|
9
|
+
useEffect(() => {
|
10
|
+
if (notification) {
|
11
|
+
ToastManager.addToast({
|
12
|
+
title: notification.message,
|
13
|
+
});
|
14
|
+
}
|
15
|
+
}, [notification]);
|
16
|
+
|
17
|
+
return null;
|
18
|
+
};
|
@@ -0,0 +1,79 @@
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
2
|
+
import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
|
3
|
+
import { Button, Dialog, Text } from '../../..';
|
4
|
+
// @ts-ignore: No implicit Any
|
5
|
+
import { DialogContent, DialogRow } from '../../primitives/DialogContent';
|
6
|
+
// @ts-ignore: No implicit Any
|
7
|
+
import { ToastManager } from '../Toast/ToastManager';
|
8
|
+
|
9
|
+
const Instruction = ({ description }: { description: string }) => (
|
10
|
+
<li>
|
11
|
+
<DialogRow css={{ ml: '$4' }}>
|
12
|
+
<Text variant="body2">{description}</Text>
|
13
|
+
</DialogRow>
|
14
|
+
</li>
|
15
|
+
);
|
16
|
+
|
17
|
+
export function DeviceInUseError() {
|
18
|
+
const notification = useHMSNotifications(HMSNotificationTypes.ERROR);
|
19
|
+
const [showDeviceInUseModal, setShowDeviceInUseModal] = useState(false);
|
20
|
+
const [deviceType, setDeviceType] = useState('');
|
21
|
+
|
22
|
+
useEffect(() => {
|
23
|
+
const error = notification?.data;
|
24
|
+
if (!error || error.code !== 3003) {
|
25
|
+
return;
|
26
|
+
}
|
27
|
+
|
28
|
+
const errorMessage = error?.message;
|
29
|
+
ToastManager.addToast({
|
30
|
+
title: `Error: ${errorMessage} - ${error?.description}`,
|
31
|
+
action: (
|
32
|
+
<Button outlined variant="standard" css={{ w: 'max-content' }} onClick={() => setShowDeviceInUseModal(true)}>
|
33
|
+
Help
|
34
|
+
</Button>
|
35
|
+
),
|
36
|
+
});
|
37
|
+
|
38
|
+
const hasAudio = errorMessage.includes('audio');
|
39
|
+
const hasVideo = errorMessage.includes('video');
|
40
|
+
const hasScreen = errorMessage.includes('screen');
|
41
|
+
if (hasAudio && hasVideo) {
|
42
|
+
setDeviceType('camera and microphone');
|
43
|
+
} else if (hasAudio) {
|
44
|
+
setDeviceType('microphone');
|
45
|
+
} else if (hasVideo) {
|
46
|
+
setDeviceType('camera');
|
47
|
+
} else if (hasScreen) {
|
48
|
+
setDeviceType('screen');
|
49
|
+
}
|
50
|
+
}, [notification]);
|
51
|
+
|
52
|
+
return (
|
53
|
+
<Dialog.Root
|
54
|
+
open={showDeviceInUseModal}
|
55
|
+
onOpenChange={() => {
|
56
|
+
setShowDeviceInUseModal(false);
|
57
|
+
}}
|
58
|
+
>
|
59
|
+
<DialogContent title="Device Access Error">
|
60
|
+
<DialogRow>
|
61
|
+
<Text variant="body2">
|
62
|
+
We weren't able to access your {deviceType} since it's either in use by another application or is not
|
63
|
+
configured properly. Please follow the following instructions to resolve this issue.
|
64
|
+
</Text>
|
65
|
+
</DialogRow>
|
66
|
+
<ol>
|
67
|
+
<Instruction
|
68
|
+
description={`Please check if the ${deviceType} device(s) are in use by another browser or application and close it.`}
|
69
|
+
/>
|
70
|
+
<Instruction
|
71
|
+
description={`Go to Browser Settings > Privacy and security > Site settings > ${deviceType} and check if your preferred device is selected as default.`}
|
72
|
+
/>
|
73
|
+
<Instruction description="Try restarting the browser." />
|
74
|
+
<Instruction description="Try disconnecting and reconnecting the external device if your intention is to use one." />
|
75
|
+
</ol>
|
76
|
+
</DialogContent>
|
77
|
+
</Dialog.Root>
|
78
|
+
);
|
79
|
+
}
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import React, { useEffect } from 'react';
|
2
|
+
import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
|
3
|
+
import { GroupIcon } from '@100mslive/react-icons';
|
4
|
+
import { Box } from '../../../Layout';
|
5
|
+
// @ts-ignore: No implicit Any
|
6
|
+
import { ToastManager } from '../Toast/ToastManager';
|
7
|
+
// @ts-ignore: No implicit Any
|
8
|
+
import { useSubscribedNotifications } from '../AppData/useUISettings';
|
9
|
+
|
10
|
+
export const ErrorNotifications = () => {
|
11
|
+
const notification = useHMSNotifications(HMSNotificationTypes.ERROR);
|
12
|
+
const subscribedNotifications = useSubscribedNotifications() || {};
|
13
|
+
|
14
|
+
useEffect(() => {
|
15
|
+
if (!notification || !notification.data) return;
|
16
|
+
|
17
|
+
const { isTerminal, action, code, message, description } = notification.data;
|
18
|
+
|
19
|
+
if (isTerminal && action !== 'INIT') {
|
20
|
+
if ([500, 6008].includes(code)) {
|
21
|
+
ToastManager.addToast({
|
22
|
+
title: `Error: ${message}`,
|
23
|
+
});
|
24
|
+
} else if (message === 'role limit reached') {
|
25
|
+
ToastManager.addToast({
|
26
|
+
title: 'The room is currently full, try joining later',
|
27
|
+
close: true,
|
28
|
+
icon: (
|
29
|
+
<Box css={{ color: '$alert_error_default' }}>
|
30
|
+
<GroupIcon />
|
31
|
+
</Box>
|
32
|
+
),
|
33
|
+
});
|
34
|
+
} else {
|
35
|
+
ToastManager.addToast({
|
36
|
+
title: message || 'We couldn’t reconnect you. When you’re back online, try joining the room.',
|
37
|
+
close: false,
|
38
|
+
});
|
39
|
+
}
|
40
|
+
return;
|
41
|
+
}
|
42
|
+
// Autoplay error or user denied screen share (cancelled browser pop-up)
|
43
|
+
if ([3008, 3001, 3011].includes(code)) {
|
44
|
+
return;
|
45
|
+
}
|
46
|
+
if (action === 'INIT') {
|
47
|
+
return;
|
48
|
+
}
|
49
|
+
if (!subscribedNotifications.ERROR) return;
|
50
|
+
ToastManager.addToast({
|
51
|
+
title: `Error: ${message} - ${description}`,
|
52
|
+
});
|
53
|
+
}, [notification, subscribedNotifications.ERROR]);
|
54
|
+
|
55
|
+
return null;
|
56
|
+
};
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import { useEffect } from 'react';
|
2
|
+
import { HMSNotificationTypes, selectIsLocalScreenShared } from '@100mslive/hms-video-store';
|
3
|
+
import { useAwayNotifications, useHMSNotifications, useHMSStore } from '@100mslive/react-sdk';
|
4
|
+
import { useRoomLayout } from '../../provider/roomLayoutProvider';
|
5
|
+
import { usePIPWindow } from '../PIP/usePIPWindow';
|
6
|
+
|
7
|
+
export const MessageNotifications = () => {
|
8
|
+
const notification = useHMSNotifications(HMSNotificationTypes.NEW_MESSAGE);
|
9
|
+
const amIScreenSharing = useHMSStore(selectIsLocalScreenShared);
|
10
|
+
const logoURL = useRoomLayout()?.logo?.url;
|
11
|
+
const { pipWindow } = usePIPWindow();
|
12
|
+
const { showNotification } = useAwayNotifications();
|
13
|
+
|
14
|
+
useEffect(() => {
|
15
|
+
if (notification && amIScreenSharing && !notification.data?.ignored && !pipWindow) {
|
16
|
+
showNotification(`New message from ${notification.data.senderName}`, {
|
17
|
+
body: notification.data.message,
|
18
|
+
icon: logoURL,
|
19
|
+
});
|
20
|
+
}
|
21
|
+
}, [notification]);
|
22
|
+
|
23
|
+
return null;
|
24
|
+
};
|
@@ -1,59 +1,31 @@
|
|
1
1
|
/* eslint-disable no-case-declarations */
|
2
|
-
import React, { useCallback
|
3
|
-
import {
|
4
|
-
HMSNotificationTypes,
|
5
|
-
HMSRoleChangeRequest,
|
6
|
-
HMSRoomState,
|
7
|
-
selectIsLocalScreenShared,
|
8
|
-
selectLocalPeerID,
|
9
|
-
selectPeerNameByID,
|
10
|
-
selectRoomState,
|
11
|
-
useAwayNotifications,
|
12
|
-
useCustomEvent,
|
13
|
-
useHMSNotifications,
|
14
|
-
useHMSStore,
|
15
|
-
useHMSVanillaStore,
|
16
|
-
} from '@100mslive/react-sdk';
|
17
|
-
import { GroupIcon } from '@100mslive/react-icons';
|
18
|
-
import { Box, Button } from '../../..';
|
19
|
-
import { useRoomLayout, useUpdateRoomLayout } from '../../provider/roomLayoutProvider';
|
2
|
+
import React, { useCallback } from 'react';
|
3
|
+
import { HMSRoleChangeRequest, HMSRoomState, selectRoomState, useCustomEvent, useHMSStore } from '@100mslive/react-sdk';
|
20
4
|
// @ts-ignore: No implicit Any
|
21
5
|
import { ToastManager } from '../Toast/ToastManager';
|
22
6
|
import { AutoplayBlockedModal } from './AutoplayBlockedModal';
|
23
7
|
import { ChatNotifications } from './ChatNotifications';
|
8
|
+
import { DeviceChangeNotifications } from './DeviceChangeNotifications';
|
9
|
+
import { DeviceInUseError } from './DeviceInUseError';
|
10
|
+
import { ErrorNotifications } from './ErrorNotifications';
|
24
11
|
import { HandRaisedNotifications } from './HandRaisedNotifications';
|
25
12
|
import { InitErrorModal } from './InitErrorModal';
|
13
|
+
import { MessageNotifications } from './MessageNotifications';
|
26
14
|
import { PeerNotifications } from './PeerNotifications';
|
27
15
|
import { PermissionErrorNotificationModal } from './PermissionErrorModal';
|
16
|
+
import { PollNotificationModal } from './PollNotificationModal';
|
28
17
|
import { ReconnectNotifications } from './ReconnectNotifications';
|
29
18
|
import { TrackBulkUnmuteModal } from './TrackBulkUnmuteModal';
|
30
19
|
import { TrackNotifications } from './TrackNotifications';
|
31
20
|
import { TrackUnmuteModal } from './TrackUnmuteModal';
|
32
21
|
import { TranscriptionNotifications } from './TranscriptionNotifications';
|
33
|
-
import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
34
22
|
// @ts-ignore: No implicit Any
|
35
|
-
import {
|
36
|
-
// @ts-ignore: No implicit Any
|
37
|
-
import { useIsNotificationDisabled, useSubscribedNotifications } from '../AppData/useUISettings';
|
38
|
-
import { usePIPWindow } from '../PIP/usePIPWindow';
|
23
|
+
import { useIsNotificationDisabled } from '../AppData/useUISettings';
|
39
24
|
import { ROLE_CHANGE_DECLINED } from '../../common/constants';
|
40
25
|
|
41
|
-
const pollToastKey: Record<string, string> = {};
|
42
|
-
|
43
26
|
export function Notifications() {
|
44
|
-
const localPeerID = useHMSStore(selectLocalPeerID);
|
45
|
-
const notification = useHMSNotifications();
|
46
|
-
const subscribedNotifications = useSubscribedNotifications() || {};
|
47
27
|
const roomState = useHMSStore(selectRoomState);
|
48
|
-
const updateRoomLayoutForRole = useUpdateRoomLayout();
|
49
28
|
const isNotificationDisabled = useIsNotificationDisabled();
|
50
|
-
const screenProps = useRoomLayoutConferencingScreen();
|
51
|
-
const vanillaStore = useHMSVanillaStore();
|
52
|
-
const togglePollView = usePollViewToggle();
|
53
|
-
const { showNotification } = useAwayNotifications();
|
54
|
-
const amIScreenSharing = useHMSStore(selectIsLocalScreenShared);
|
55
|
-
const logoURL = useRoomLayout()?.logo?.url;
|
56
|
-
const { pipWindow } = usePIPWindow();
|
57
29
|
|
58
30
|
const handleRoleChangeDenied = useCallback((request: HMSRoleChangeRequest & { peerName: string }) => {
|
59
31
|
ToastManager.addToast({
|
@@ -64,129 +36,6 @@ export function Notifications() {
|
|
64
36
|
|
65
37
|
useCustomEvent({ type: ROLE_CHANGE_DECLINED, onEvent: handleRoleChangeDenied });
|
66
38
|
|
67
|
-
useEffect(() => {
|
68
|
-
if (!notification || isNotificationDisabled) {
|
69
|
-
return;
|
70
|
-
}
|
71
|
-
switch (notification.type) {
|
72
|
-
case HMSNotificationTypes.NAME_UPDATED:
|
73
|
-
console.log(notification.data.id + ' changed their name to ' + notification.data.name);
|
74
|
-
break;
|
75
|
-
case HMSNotificationTypes.ERROR:
|
76
|
-
if (notification.data?.isTerminal && notification.data?.action !== 'INIT') {
|
77
|
-
if ([500, 6008].includes(notification.data?.code)) {
|
78
|
-
ToastManager.addToast({
|
79
|
-
title: `Error: ${notification.data?.message}`,
|
80
|
-
});
|
81
|
-
} else if (notification.data?.message === 'role limit reached') {
|
82
|
-
ToastManager.addToast({
|
83
|
-
title: 'The room is currently full, try joining later',
|
84
|
-
close: true,
|
85
|
-
icon: (
|
86
|
-
<Box css={{ color: '$alert_error_default' }}>
|
87
|
-
<GroupIcon />
|
88
|
-
</Box>
|
89
|
-
),
|
90
|
-
});
|
91
|
-
} else {
|
92
|
-
ToastManager.addToast({
|
93
|
-
title:
|
94
|
-
notification.data?.message ||
|
95
|
-
'We couldn’t reconnect you. When you’re back online, try joining the room.',
|
96
|
-
close: false,
|
97
|
-
});
|
98
|
-
}
|
99
|
-
return;
|
100
|
-
}
|
101
|
-
// Autoplay error or user denied screen share (cancelled browser pop-up)
|
102
|
-
if (notification.data?.code === 3008 || notification.data?.code === 3001 || notification.data?.code === 3011) {
|
103
|
-
return;
|
104
|
-
}
|
105
|
-
if (notification.data?.action === 'INIT') {
|
106
|
-
return;
|
107
|
-
}
|
108
|
-
if (!subscribedNotifications.ERROR) return;
|
109
|
-
ToastManager.addToast({
|
110
|
-
title: `Error: ${notification.data?.message} - ${notification.data?.description}`,
|
111
|
-
});
|
112
|
-
break;
|
113
|
-
case HMSNotificationTypes.ROLE_UPDATED: {
|
114
|
-
if (notification.data?.isLocal && notification.data?.roleName) {
|
115
|
-
ToastManager.addToast({
|
116
|
-
title: `You are now a ${notification.data.roleName}`,
|
117
|
-
});
|
118
|
-
updateRoomLayoutForRole?.(notification.data.roleName);
|
119
|
-
}
|
120
|
-
break;
|
121
|
-
}
|
122
|
-
case HMSNotificationTypes.CHANGE_TRACK_STATE_REQUEST:
|
123
|
-
const track = notification.data?.track;
|
124
|
-
if (!notification.data.enabled) {
|
125
|
-
ToastManager.addToast({
|
126
|
-
title: `Your ${track.source} ${track.type} was muted by
|
127
|
-
${notification.data.requestedBy?.name}.`,
|
128
|
-
});
|
129
|
-
}
|
130
|
-
break;
|
131
|
-
case HMSNotificationTypes.REMOVED_FROM_ROOM:
|
132
|
-
case HMSNotificationTypes.ROOM_ENDED:
|
133
|
-
ToastManager.addToast({
|
134
|
-
title: `${notification.message}.
|
135
|
-
${notification.data.reason && `Reason: ${notification.data.reason}`}`,
|
136
|
-
});
|
137
|
-
break;
|
138
|
-
case HMSNotificationTypes.DEVICE_CHANGE_UPDATE:
|
139
|
-
ToastManager.addToast({
|
140
|
-
title: notification.message,
|
141
|
-
});
|
142
|
-
break;
|
143
|
-
|
144
|
-
case HMSNotificationTypes.POLL_STARTED:
|
145
|
-
if (notification.data.startedBy !== localPeerID && screenProps.screenType !== 'hls_live_streaming') {
|
146
|
-
const pollStartedBy = vanillaStore.getState(selectPeerNameByID(notification.data.startedBy)) || 'Participant';
|
147
|
-
|
148
|
-
const pollToastID = ToastManager.addToast({
|
149
|
-
title: `${pollStartedBy} started a ${notification.data.type}: ${notification.data.title}`,
|
150
|
-
action: (
|
151
|
-
<Button
|
152
|
-
onClick={() => togglePollView(notification.data.id)}
|
153
|
-
variant="standard"
|
154
|
-
css={{
|
155
|
-
backgroundColor: '$surface_bright',
|
156
|
-
fontWeight: '$semiBold',
|
157
|
-
color: '$on_surface_high',
|
158
|
-
p: '$xs $md',
|
159
|
-
}}
|
160
|
-
>
|
161
|
-
{notification.data.type === 'quiz' ? 'Answer' : 'Vote'}
|
162
|
-
</Button>
|
163
|
-
),
|
164
|
-
duration: Infinity,
|
165
|
-
});
|
166
|
-
pollToastKey[notification.data.id] = pollToastID;
|
167
|
-
}
|
168
|
-
break;
|
169
|
-
case HMSNotificationTypes.POLL_STOPPED:
|
170
|
-
const pollID = notification?.data.id;
|
171
|
-
if (pollID && pollToastKey?.[pollID]) {
|
172
|
-
ToastManager.removeToast(pollToastKey?.[notification.data.id]);
|
173
|
-
delete pollToastKey[notification?.data.id];
|
174
|
-
}
|
175
|
-
break;
|
176
|
-
case HMSNotificationTypes.NEW_MESSAGE:
|
177
|
-
if (amIScreenSharing && !notification.data?.ignored && !pipWindow) {
|
178
|
-
showNotification(`New message from ${notification.data.senderName}`, {
|
179
|
-
body: notification.data.message,
|
180
|
-
icon: logoURL,
|
181
|
-
});
|
182
|
-
}
|
183
|
-
break;
|
184
|
-
default:
|
185
|
-
break;
|
186
|
-
}
|
187
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
188
|
-
}, [notification, subscribedNotifications.ERROR, subscribedNotifications.METADATA_UPDATED]);
|
189
|
-
|
190
39
|
if (isNotificationDisabled) {
|
191
40
|
return null;
|
192
41
|
}
|
@@ -197,13 +46,18 @@ export function Notifications() {
|
|
197
46
|
<TrackBulkUnmuteModal />
|
198
47
|
<TrackNotifications />
|
199
48
|
{roomState === HMSRoomState.Connected ? <PeerNotifications /> : null}
|
49
|
+
<PollNotificationModal />
|
50
|
+
<MessageNotifications />
|
51
|
+
<DeviceChangeNotifications />
|
200
52
|
<ReconnectNotifications />
|
53
|
+
<ErrorNotifications />
|
201
54
|
<AutoplayBlockedModal />
|
202
55
|
<PermissionErrorNotificationModal />
|
203
56
|
<InitErrorModal />
|
204
57
|
<ChatNotifications />
|
205
58
|
<HandRaisedNotifications />
|
206
59
|
<TranscriptionNotifications />
|
60
|
+
<DeviceInUseError />
|
207
61
|
</>
|
208
62
|
);
|
209
63
|
}
|
@@ -1,19 +1,28 @@
|
|
1
1
|
import { useEffect } from 'react';
|
2
2
|
import { HMSNotificationTypes, useHMSNotifications } from '@100mslive/react-sdk';
|
3
|
+
import { useUpdateRoomLayout } from '../../provider/roomLayoutProvider';
|
3
4
|
// @ts-ignore: No implicit Any
|
4
5
|
import { ToastBatcher } from '../Toast/ToastBatcher';
|
5
6
|
// @ts-ignore: No implicit Any
|
7
|
+
import { ToastManager } from '../Toast/ToastManager';
|
8
|
+
// @ts-ignore: No implicit Any
|
6
9
|
import { useSetSubscribedChatSelector, useSubscribedNotifications } from '../AppData/useUISettings';
|
7
10
|
// @ts-ignore: No implicit Any
|
8
11
|
import { CHAT_SELECTOR, SUBSCRIBED_NOTIFICATIONS } from '../../common/constants';
|
9
12
|
|
10
|
-
const notificationTypes = [
|
13
|
+
const notificationTypes = [
|
14
|
+
HMSNotificationTypes.PEER_JOINED,
|
15
|
+
HMSNotificationTypes.PEER_LEFT,
|
16
|
+
HMSNotificationTypes.NAME_UPDATED,
|
17
|
+
HMSNotificationTypes.ROLE_UPDATED,
|
18
|
+
];
|
11
19
|
|
12
20
|
export const PeerNotifications = () => {
|
13
21
|
const notification = useHMSNotifications(notificationTypes);
|
14
22
|
const isPeerJoinSubscribed = useSubscribedNotifications(SUBSCRIBED_NOTIFICATIONS.PEER_JOINED);
|
15
23
|
const isPeerLeftSubscribed = useSubscribedNotifications(SUBSCRIBED_NOTIFICATIONS.PEER_LEFT);
|
16
24
|
const [selectedPeer, setPeerSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.PEER);
|
25
|
+
const updateRoomLayoutForRole = useUpdateRoomLayout();
|
17
26
|
|
18
27
|
useEffect(() => {
|
19
28
|
if (!notification?.data) {
|
@@ -35,11 +44,23 @@ export const PeerNotifications = () => {
|
|
35
44
|
return;
|
36
45
|
}
|
37
46
|
break;
|
47
|
+
case HMSNotificationTypes.NAME_UPDATED:
|
48
|
+
console.log(notification.data.id + ' changed their name to ' + notification.data.name);
|
49
|
+
return;
|
50
|
+
case HMSNotificationTypes.ROLE_UPDATED: {
|
51
|
+
if (notification.data?.isLocal && notification.data?.roleName) {
|
52
|
+
ToastManager.addToast({
|
53
|
+
title: `You are now a ${notification.data.roleName}`,
|
54
|
+
});
|
55
|
+
updateRoomLayoutForRole?.(notification.data.roleName);
|
56
|
+
}
|
57
|
+
return;
|
58
|
+
}
|
38
59
|
default:
|
39
60
|
return;
|
40
61
|
}
|
41
62
|
ToastBatcher.showToast({ notification });
|
42
|
-
}, [notification
|
63
|
+
}, [notification]);
|
43
64
|
|
44
65
|
return null;
|
45
66
|
};
|
@@ -0,0 +1,71 @@
|
|
1
|
+
import React, { useEffect } from 'react';
|
2
|
+
import {
|
3
|
+
HMSNotificationTypes,
|
4
|
+
selectLocalPeerID,
|
5
|
+
selectPeerNameByID,
|
6
|
+
useHMSNotifications,
|
7
|
+
useHMSStore,
|
8
|
+
useHMSVanillaStore,
|
9
|
+
} from '@100mslive/react-sdk';
|
10
|
+
import { Button } from '../../../Button';
|
11
|
+
// @ts-ignore: No implicit Any
|
12
|
+
import { ToastManager } from '../Toast/ToastManager';
|
13
|
+
import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen';
|
14
|
+
// @ts-ignore: No implicit Any
|
15
|
+
import { usePollViewToggle } from '../AppData/useSidepane';
|
16
|
+
|
17
|
+
const notificationTypes = [HMSNotificationTypes.POLL_STARTED, HMSNotificationTypes.POLL_STOPPED];
|
18
|
+
|
19
|
+
const pollToastKey: Record<string, string> = {};
|
20
|
+
|
21
|
+
export const PollNotificationModal = () => {
|
22
|
+
const togglePollView = usePollViewToggle();
|
23
|
+
const localPeerID = useHMSStore(selectLocalPeerID);
|
24
|
+
const vanillaStore = useHMSVanillaStore();
|
25
|
+
const screenProps = useRoomLayoutConferencingScreen();
|
26
|
+
|
27
|
+
const notification = useHMSNotifications(notificationTypes);
|
28
|
+
|
29
|
+
useEffect(() => {
|
30
|
+
switch (notification?.type) {
|
31
|
+
case HMSNotificationTypes.POLL_STARTED:
|
32
|
+
if (notification.data.startedBy !== localPeerID && screenProps.screenType !== 'hls_live_streaming') {
|
33
|
+
const pollStartedBy = vanillaStore.getState(selectPeerNameByID(notification.data.startedBy)) || 'Participant';
|
34
|
+
|
35
|
+
const pollToastID = ToastManager.addToast({
|
36
|
+
title: `${pollStartedBy} started a ${notification.data.type}: ${notification.data.title}`,
|
37
|
+
action: (
|
38
|
+
<Button
|
39
|
+
onClick={() => togglePollView(notification.data.id)}
|
40
|
+
variant="standard"
|
41
|
+
css={{
|
42
|
+
backgroundColor: '$surface_bright',
|
43
|
+
fontWeight: '$semiBold',
|
44
|
+
color: '$on_surface_high',
|
45
|
+
p: '$xs $md',
|
46
|
+
}}
|
47
|
+
>
|
48
|
+
{notification.data.type === 'quiz' ? 'Answer' : 'Vote'}
|
49
|
+
</Button>
|
50
|
+
),
|
51
|
+
duration: Infinity,
|
52
|
+
});
|
53
|
+
pollToastKey[notification.data.id] = pollToastID;
|
54
|
+
}
|
55
|
+
break;
|
56
|
+
case HMSNotificationTypes.POLL_STOPPED:
|
57
|
+
{
|
58
|
+
const pollID = notification?.data.id;
|
59
|
+
if (pollID && pollToastKey?.[pollID]) {
|
60
|
+
ToastManager.removeToast(pollToastKey?.[notification.data.id]);
|
61
|
+
delete pollToastKey[notification?.data.id];
|
62
|
+
}
|
63
|
+
}
|
64
|
+
break;
|
65
|
+
default:
|
66
|
+
break;
|
67
|
+
}
|
68
|
+
}, [notification]);
|
69
|
+
|
70
|
+
return null;
|
71
|
+
};
|
@@ -5,11 +5,7 @@ import { ToastConfig } from '../Toast/ToastConfig';
|
|
5
5
|
// @ts-ignore: No implicit Any
|
6
6
|
import { ToastManager } from '../Toast/ToastManager';
|
7
7
|
|
8
|
-
const notificationTypes = [
|
9
|
-
HMSNotificationTypes.RECONNECTED,
|
10
|
-
HMSNotificationTypes.RECONNECTING,
|
11
|
-
HMSNotificationTypes.ERROR,
|
12
|
-
];
|
8
|
+
const notificationTypes = [HMSNotificationTypes.RECONNECTED, HMSNotificationTypes.RECONNECTING];
|
13
9
|
let notificationId: string | null = null;
|
14
10
|
|
15
11
|
export const ReconnectNotifications = () => {
|
@@ -9,14 +9,16 @@ import { MicOnIcon } from '@100mslive/react-icons';
|
|
9
9
|
// @ts-ignore: No implicit Any
|
10
10
|
import { RequestDialog } from '../../primitives/DialogContent';
|
11
11
|
|
12
|
+
const notificationTypes = [
|
13
|
+
HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST,
|
14
|
+
HMSNotificationTypes.ROOM_ENDED,
|
15
|
+
HMSNotificationTypes.REMOVED_FROM_ROOM,
|
16
|
+
];
|
17
|
+
|
12
18
|
export const TrackBulkUnmuteModal = () => {
|
13
19
|
const hmsActions = useHMSActions();
|
14
20
|
const [muteNotification, setMuteNotification] = useState<HMSChangeMultiTrackStateRequest | null>(null);
|
15
|
-
const notification = useHMSNotifications(
|
16
|
-
HMSNotificationTypes.CHANGE_MULTI_TRACK_STATE_REQUEST,
|
17
|
-
HMSNotificationTypes.ROOM_ENDED,
|
18
|
-
HMSNotificationTypes.REMOVED_FROM_ROOM,
|
19
|
-
]);
|
21
|
+
const notification = useHMSNotifications(notificationTypes);
|
20
22
|
|
21
23
|
useEffect(() => {
|
22
24
|
switch (notification?.type) {
|