@100mslive/roomkit-react 0.3.15-alpha.2 → 0.3.15-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Diagnostics/DiagnosticsContext.d.ts +42 -0
- package/dist/Diagnostics/components.d.ts +0 -9
- package/dist/{HLSView-IBBAZRGB.js → HLSView-HMRFCBTS.js} +2 -2
- package/dist/{HLSView-PFCSCJTH.css → HLSView-UZREPPDA.css} +3 -3
- package/dist/{HLSView-PFCSCJTH.css.map → HLSView-UZREPPDA.css.map} +1 -1
- package/dist/{chunk-25Y7QR25.js → chunk-3RS665CV.js} +188 -139
- package/dist/{chunk-25Y7QR25.js.map → chunk-3RS665CV.js.map} +4 -4
- package/dist/index.cjs.css +2 -2
- package/dist/index.cjs.css.map +1 -1
- package/dist/index.cjs.js +207 -156
- 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 +90 -31
- package/dist/meta.esbuild.json +104 -45
- package/package.json +7 -7
- package/src/Diagnostics/AudioTest.tsx +17 -7
- package/src/Diagnostics/BrowserTest.tsx +6 -4
- package/src/Diagnostics/ConnectivityTest.tsx +8 -6
- package/src/Diagnostics/Diagnostics.tsx +77 -51
- package/src/Diagnostics/DiagnosticsContext.ts +46 -0
- package/src/Diagnostics/VideoTest.tsx +9 -5
- package/src/Diagnostics/components.tsx +7 -32
- /package/dist/{HLSView-IBBAZRGB.js.map → HLSView-HMRFCBTS.js.map} +0 -0
|
@@ -1,20 +1,33 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useCallback, useRef, useState } from 'react';
|
|
2
2
|
import { HMSRoomProvider, useHMSActions } from '@100mslive/react-sdk';
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
CheckCircleIcon,
|
|
5
|
+
ConnectivityIcon,
|
|
6
|
+
CrossCircleIcon,
|
|
7
|
+
GlobeIcon,
|
|
8
|
+
MicOnIcon,
|
|
9
|
+
VideoOnIcon,
|
|
10
|
+
} from '@100mslive/react-icons';
|
|
5
11
|
import { Box, Flex } from '../Layout';
|
|
6
12
|
import { Text } from '../Text';
|
|
7
13
|
import { HMSThemeProvider } from '../Theme';
|
|
8
14
|
import { AudioTest } from './AudioTest';
|
|
9
15
|
import { BrowserTest } from './BrowserTest';
|
|
10
16
|
import { ConnectivityTest } from './ConnectivityTest';
|
|
17
|
+
import {
|
|
18
|
+
DiagnosticsContext,
|
|
19
|
+
DiagnosticsStep,
|
|
20
|
+
DiagnosticsStepInfo,
|
|
21
|
+
initialSteps,
|
|
22
|
+
useDiagnostics,
|
|
23
|
+
} from './DiagnosticsContext';
|
|
11
24
|
import { VideoTest } from './VideoTest';
|
|
12
25
|
|
|
13
|
-
const DiagnosticsStepIcon: Record<
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
26
|
+
const DiagnosticsStepIcon: Record<DiagnosticsStep, React.ReactNode> = {
|
|
27
|
+
[DiagnosticsStep.VIDEO]: <VideoOnIcon width="2rem" height="2rem" />,
|
|
28
|
+
[DiagnosticsStep.AUDIO]: <MicOnIcon width="2rem" height="2rem" />,
|
|
29
|
+
[DiagnosticsStep.BROWSER]: <GlobeIcon width="2rem" height="2rem" />,
|
|
30
|
+
[DiagnosticsStep.CONNECTIVITY]: <ConnectivityIcon width="2rem" height="2rem" />,
|
|
18
31
|
};
|
|
19
32
|
|
|
20
33
|
const Container = ({ children }: { children: React.ReactNode }) => (
|
|
@@ -27,11 +40,15 @@ const Container = ({ children }: { children: React.ReactNode }) => (
|
|
|
27
40
|
lineHeight: '1.5',
|
|
28
41
|
'-webkit-text-size-adjust': '100%',
|
|
29
42
|
position: 'relative',
|
|
30
|
-
h:
|
|
43
|
+
h: '100%',
|
|
31
44
|
'@lg': {
|
|
32
45
|
p: '$12',
|
|
33
46
|
},
|
|
34
47
|
overflowY: 'auto',
|
|
48
|
+
boxSizing: 'border-box',
|
|
49
|
+
'& *': {
|
|
50
|
+
boxSizing: 'border-box',
|
|
51
|
+
},
|
|
35
52
|
'::-webkit-scrollbar-track': {
|
|
36
53
|
WebkitBoxShadow: 'inset 0 0 6px rgba(0, 0, 0, 0.3)',
|
|
37
54
|
boxShadow: 'inset 0 0 6px rgba(0, 0, 0, 0.3)',
|
|
@@ -53,34 +70,34 @@ const Container = ({ children }: { children: React.ReactNode }) => (
|
|
|
53
70
|
);
|
|
54
71
|
|
|
55
72
|
const DiagnosticsStepTest = () => {
|
|
56
|
-
const {
|
|
73
|
+
const { activeStepIndex } = useDiagnostics();
|
|
57
74
|
|
|
58
75
|
let TestComponent = () => <></>;
|
|
59
76
|
|
|
60
|
-
if (
|
|
77
|
+
if (activeStepIndex === DiagnosticsStep.AUDIO) {
|
|
61
78
|
TestComponent = AudioTest;
|
|
62
|
-
} else if (
|
|
79
|
+
} else if (activeStepIndex === DiagnosticsStep.VIDEO) {
|
|
63
80
|
TestComponent = VideoTest;
|
|
64
|
-
} else if (
|
|
81
|
+
} else if (activeStepIndex === DiagnosticsStep.BROWSER) {
|
|
65
82
|
TestComponent = BrowserTest;
|
|
66
|
-
} else if (
|
|
83
|
+
} else if (activeStepIndex === DiagnosticsStep.CONNECTIVITY) {
|
|
67
84
|
TestComponent = ConnectivityTest;
|
|
68
85
|
}
|
|
69
86
|
|
|
70
|
-
return <TestComponent key={
|
|
87
|
+
return <TestComponent key={activeStepIndex} />;
|
|
71
88
|
};
|
|
72
89
|
|
|
73
90
|
const DiagnosticsStepHeader = () => {
|
|
74
|
-
const { activeStep } =
|
|
91
|
+
const { activeStepIndex, activeStep } = useDiagnostics();
|
|
75
92
|
return (
|
|
76
93
|
<Flex css={{ py: '$8', px: '$10', alignItems: 'center', borderBottom: '1px solid $border_default' }}>
|
|
77
|
-
<Text css={{ c: '$primary_bright', mt: '$xs' }}>{DiagnosticsStepIcon[
|
|
78
|
-
<Text css={{ fontSize: '$h6', ml: '$9' }}>{
|
|
94
|
+
<Text css={{ c: '$primary_bright', mt: '$xs' }}>{DiagnosticsStepIcon[activeStepIndex]}</Text>
|
|
95
|
+
<Text css={{ fontSize: '$h6', ml: '$9' }}>{activeStep.name}</Text>
|
|
79
96
|
</Flex>
|
|
80
97
|
);
|
|
81
98
|
};
|
|
82
99
|
|
|
83
|
-
const
|
|
100
|
+
const DiagnosticsStepContainer = () => {
|
|
84
101
|
return (
|
|
85
102
|
<Box css={{ border: '1px solid $border_default', r: '$1', w: '75%', maxWidth: '65rem', '@lg': { w: '100%' } }}>
|
|
86
103
|
<DiagnosticsStepHeader />
|
|
@@ -90,53 +107,62 @@ const DiagnosticsStep = () => {
|
|
|
90
107
|
};
|
|
91
108
|
|
|
92
109
|
const DiagnosticsStepsList = () => {
|
|
93
|
-
const { activeStep,
|
|
110
|
+
const { activeStepIndex, activeStep, steps } = useDiagnostics();
|
|
94
111
|
|
|
95
112
|
return (
|
|
96
113
|
<Box css={{ w: '25%', '@lg': { display: 'none' } }}>
|
|
97
|
-
{Object.keys(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
114
|
+
{Object.keys(DiagnosticsStep)
|
|
115
|
+
.filter(key => !isNaN(Number(key)))
|
|
116
|
+
.map(key => {
|
|
117
|
+
const keyIndex = Number(key);
|
|
118
|
+
const step = steps[keyIndex as DiagnosticsStep];
|
|
119
|
+
const isStepCompleted = activeStepIndex > keyIndex || activeStep.isCompleted;
|
|
120
|
+
|
|
121
|
+
let color = '$on_primary_low';
|
|
122
|
+
let icon = <Text css={{ c: color, fontSize: '1.75rem' }}>•</Text>;
|
|
123
|
+
|
|
124
|
+
if (activeStepIndex === keyIndex) {
|
|
125
|
+
color = '$on_primary_high';
|
|
126
|
+
icon = <Text css={{ c: color, fontSize: '1.75rem' }}>•</Text>;
|
|
127
|
+
}
|
|
128
|
+
if (isStepCompleted) {
|
|
129
|
+
color = '$primary_bright';
|
|
130
|
+
icon = <CheckCircleIcon width="1rem" height="1rem" />;
|
|
131
|
+
}
|
|
132
|
+
if (step.hasFailed) {
|
|
133
|
+
color = '$alert_error_default';
|
|
134
|
+
icon = <CrossCircleIcon width="1rem" height="1rem" />;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return (
|
|
138
|
+
<Flex key={key} css={{ mb: '$10', c: color, gap: '$4', alignItems: 'center' }}>
|
|
139
|
+
{icon}
|
|
140
|
+
<Text css={{ c: color }}>{step.name}</Text>
|
|
141
|
+
</Flex>
|
|
142
|
+
);
|
|
143
|
+
})}
|
|
122
144
|
</Box>
|
|
123
145
|
);
|
|
124
146
|
};
|
|
125
147
|
|
|
126
148
|
const DiagnosticsProvider = () => {
|
|
127
149
|
const actions = useHMSActions();
|
|
128
|
-
const [activeStep, setActiveStep] = useState(
|
|
129
|
-
const [
|
|
150
|
+
const [activeStep, setActiveStep] = useState(0);
|
|
151
|
+
const [steps, setSteps] = useState(initialSteps);
|
|
130
152
|
const diagnosticsRef = useRef(actions.initDiagnostics());
|
|
131
153
|
|
|
154
|
+
const updateStep = useCallback((step: DiagnosticsStep, value: Omit<DiagnosticsStepInfo, 'name'>) => {
|
|
155
|
+
setSteps(prevSteps => ({ ...prevSteps, [step]: { ...prevSteps[step], ...value } }));
|
|
156
|
+
}, []);
|
|
157
|
+
|
|
132
158
|
return (
|
|
133
159
|
<DiagnosticsContext.Provider
|
|
134
160
|
value={{
|
|
135
161
|
hmsDiagnostics: diagnosticsRef.current,
|
|
136
|
-
activeStep,
|
|
162
|
+
activeStepIndex: activeStep,
|
|
137
163
|
setActiveStep,
|
|
138
|
-
|
|
139
|
-
|
|
164
|
+
steps,
|
|
165
|
+
updateStep,
|
|
140
166
|
}}
|
|
141
167
|
>
|
|
142
168
|
<Container>
|
|
@@ -146,7 +172,7 @@ const DiagnosticsProvider = () => {
|
|
|
146
172
|
</Text>
|
|
147
173
|
<Flex css={{ direction: 'column', mt: '$12', justifyItems: 'center' }}>
|
|
148
174
|
<DiagnosticsStepsList />
|
|
149
|
-
<
|
|
175
|
+
<DiagnosticsStepContainer />
|
|
150
176
|
</Flex>
|
|
151
177
|
</Container>
|
|
152
178
|
</DiagnosticsContext.Provider>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import { HMSDiagnosticsInterface } from '@100mslive/react-sdk';
|
|
3
|
+
|
|
4
|
+
export enum DiagnosticsStep {
|
|
5
|
+
BROWSER,
|
|
6
|
+
VIDEO,
|
|
7
|
+
AUDIO,
|
|
8
|
+
CONNECTIVITY,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const initialSteps = {
|
|
12
|
+
[DiagnosticsStep.BROWSER]: { name: 'Browser Support' },
|
|
13
|
+
[DiagnosticsStep.VIDEO]: { name: 'Test Video' },
|
|
14
|
+
[DiagnosticsStep.AUDIO]: { name: 'Test Audio' },
|
|
15
|
+
[DiagnosticsStep.CONNECTIVITY]: { name: 'Connection Quality' },
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export interface DiagnosticsStepInfo {
|
|
19
|
+
name: string;
|
|
20
|
+
hasFailed?: boolean;
|
|
21
|
+
isCompleted?: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const DiagnosticsContext = React.createContext<{
|
|
25
|
+
hmsDiagnostics?: HMSDiagnosticsInterface;
|
|
26
|
+
activeStepIndex: DiagnosticsStep;
|
|
27
|
+
setActiveStep: React.Dispatch<React.SetStateAction<DiagnosticsStep>>;
|
|
28
|
+
steps: Record<DiagnosticsStep, DiagnosticsStepInfo>;
|
|
29
|
+
updateStep: (step: DiagnosticsStep, value: Omit<DiagnosticsStepInfo, 'name'>) => void;
|
|
30
|
+
}>({
|
|
31
|
+
activeStepIndex: 0,
|
|
32
|
+
setActiveStep: () => {
|
|
33
|
+
return;
|
|
34
|
+
},
|
|
35
|
+
steps: initialSteps,
|
|
36
|
+
updateStep: () => {
|
|
37
|
+
return;
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
export const useDiagnostics = () => {
|
|
42
|
+
const context = useContext(DiagnosticsContext);
|
|
43
|
+
const activeStep = context.steps[context.activeStepIndex];
|
|
44
|
+
|
|
45
|
+
return { ...context, activeStep };
|
|
46
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
HMSException,
|
|
4
4
|
selectDevices,
|
|
@@ -8,16 +8,17 @@ import {
|
|
|
8
8
|
} from '@100mslive/react-sdk';
|
|
9
9
|
import { VideoOnIcon } from '@100mslive/react-icons';
|
|
10
10
|
import { PermissionErrorModal } from '../Prebuilt/components/Notifications/PermissionErrorModal';
|
|
11
|
-
import {
|
|
11
|
+
import { TestContainer, TestFooter } from './components';
|
|
12
12
|
import { Flex } from '../Layout';
|
|
13
13
|
import { Text } from '../Text';
|
|
14
14
|
import { Video } from '../Video';
|
|
15
15
|
import { StyledVideoTile } from '../VideoTile';
|
|
16
16
|
// @ts-ignore: No implicit any
|
|
17
17
|
import { DeviceSelector } from './DeviceSelector';
|
|
18
|
+
import { DiagnosticsStep, useDiagnostics } from './DiagnosticsContext';
|
|
18
19
|
|
|
19
20
|
export const VideoTest = () => {
|
|
20
|
-
const { hmsDiagnostics } =
|
|
21
|
+
const { hmsDiagnostics, updateStep } = useDiagnostics();
|
|
21
22
|
const allDevices = useHMSStore(selectDevices);
|
|
22
23
|
const { videoInput } = allDevices;
|
|
23
24
|
const trackID = useHMSStore(selectLocalVideoTrackID);
|
|
@@ -25,8 +26,11 @@ export const VideoTest = () => {
|
|
|
25
26
|
const [error, setError] = useState<HMSException | undefined>();
|
|
26
27
|
|
|
27
28
|
useEffect(() => {
|
|
28
|
-
hmsDiagnostics?.startCameraCheck().catch(err =>
|
|
29
|
-
|
|
29
|
+
hmsDiagnostics?.startCameraCheck().catch(err => {
|
|
30
|
+
updateStep(DiagnosticsStep.VIDEO, { hasFailed: true });
|
|
31
|
+
setError(err);
|
|
32
|
+
});
|
|
33
|
+
}, [hmsDiagnostics, updateStep]);
|
|
30
34
|
|
|
31
35
|
return (
|
|
32
36
|
<>
|
|
@@ -1,33 +1,9 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import { HMSDiagnosticsInterface } from '@100mslive/react-sdk';
|
|
1
|
+
import React from 'react';
|
|
3
2
|
import { Button } from '../Button';
|
|
4
3
|
import { Box, Flex } from '../Layout';
|
|
5
4
|
import { Text } from '../Text';
|
|
6
5
|
import { CSS } from '../Theme';
|
|
7
|
-
|
|
8
|
-
export const DiagnosticsSteps: Record<string, string> = {
|
|
9
|
-
browser: 'Browser Support',
|
|
10
|
-
video: 'Test Video',
|
|
11
|
-
audio: 'Test Audio',
|
|
12
|
-
connectivity: 'Connection Quality',
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export const DiagnosticsContext = React.createContext<{
|
|
16
|
-
hmsDiagnostics?: HMSDiagnosticsInterface;
|
|
17
|
-
activeStep: string;
|
|
18
|
-
setActiveStep: React.Dispatch<React.SetStateAction<string>>;
|
|
19
|
-
connectivityTested: boolean;
|
|
20
|
-
setConnectivityTested: React.Dispatch<React.SetStateAction<boolean>>;
|
|
21
|
-
}>({
|
|
22
|
-
activeStep: 'video',
|
|
23
|
-
setActiveStep: () => {
|
|
24
|
-
return;
|
|
25
|
-
},
|
|
26
|
-
connectivityTested: false,
|
|
27
|
-
setConnectivityTested: () => {
|
|
28
|
-
return;
|
|
29
|
-
},
|
|
30
|
-
});
|
|
6
|
+
import { DiagnosticsStep, useDiagnostics } from './DiagnosticsContext';
|
|
31
7
|
|
|
32
8
|
export const TestContainer = ({ css, children }: { css?: CSS; children: React.ReactNode }) => {
|
|
33
9
|
return <Box css={{ p: '$10', ...css }}>{children}</Box>;
|
|
@@ -42,19 +18,18 @@ export const TestFooter = ({
|
|
|
42
18
|
error?: Error;
|
|
43
19
|
children?: React.ReactNode;
|
|
44
20
|
}) => {
|
|
45
|
-
const { hmsDiagnostics, activeStep, setActiveStep } =
|
|
21
|
+
const { hmsDiagnostics, activeStepIndex: activeStep, setActiveStep } = useDiagnostics();
|
|
46
22
|
|
|
47
23
|
const onNextStep = () => {
|
|
48
|
-
if (activeStep ===
|
|
24
|
+
if (activeStep === DiagnosticsStep.AUDIO) {
|
|
49
25
|
hmsDiagnostics?.stopMicCheck();
|
|
50
|
-
} else if (activeStep ===
|
|
26
|
+
} else if (activeStep === DiagnosticsStep.VIDEO) {
|
|
51
27
|
hmsDiagnostics?.stopCameraCheck();
|
|
52
|
-
} else if (activeStep ===
|
|
28
|
+
} else if (activeStep === DiagnosticsStep.CONNECTIVITY) {
|
|
53
29
|
hmsDiagnostics?.stopConnectivityCheck();
|
|
54
30
|
}
|
|
55
31
|
|
|
56
|
-
|
|
57
|
-
setActiveStep(step => keys[keys.indexOf(step) + 1]);
|
|
32
|
+
setActiveStep(step => step + 1);
|
|
58
33
|
};
|
|
59
34
|
|
|
60
35
|
return (
|
|
File without changes
|