import React, { useState } from 'react';
import { ConnectivityCheckResult, ConnectivityState, DiagnosticsRTCStats } from '@100mslive/react-sdk';
import { CheckCircleIcon, CrossCircleIcon, EyeCloseIcon, EyeOpenIcon, LinkIcon } from '@100mslive/react-icons';
import { TestContainer, TestFooter } from './components';
import { Button } from '../Button';
import { Box, Flex } from '../Layout';
import { Loading } from '../Loading';
import { formatBytes } from '../Stats';
import { Text } from '../Text';
import { DiagnosticsStep, useDiagnostics } from './DiagnosticsContext';
const Regions = {
in: 'India',
us: 'United States',
};
const ConnectivityStateMessage = {
[ConnectivityState.STARTING]: 'Fetching Init',
[ConnectivityState.INIT_FETCHED]: 'Connecting to signal server',
[ConnectivityState.SIGNAL_CONNECTED]: 'Establishing ICE connection',
[ConnectivityState.ICE_ESTABLISHED]: 'Capturing Media',
[ConnectivityState.MEDIA_CAPTURED]: 'Publishing Media',
[ConnectivityState.MEDIA_PUBLISHED]: 'Finishing Up',
[ConnectivityState.COMPLETED]: 'Completed',
};
export const ConnectivityTestStepResult = ({
title,
status = 'Connected',
success,
children,
}: {
title: string;
status?: string;
success?: boolean;
children: React.ReactNode;
}) => {
const [hideDetails, setHideDetails] = useState(true);
return (
{title}
{success ? (
{status}
) : (
Failed
)}
setHideDetails(!hideDetails)}
align="center"
gap="2"
css={{
color: '$primary_bright',
}}
>
{hideDetails ? : }
{hideDetails ? 'View' : 'Hide'} detailed information
{!hideDetails ? {children} : null}
);
};
const DetailedInfo = ({
title,
value,
Icon,
}: {
title: string;
value: string;
Icon?: (props: React.SVGProps) => React.JSX.Element;
}) => {
return (
{title}
{Icon && (
)}
{value}
);
};
const MediaServerResult = ({ result }: { result?: ConnectivityCheckResult['mediaServerReport'] }) => {
return (
{result?.connectionQualityScore ? (
) : null}
);
};
const SignallingResult = ({ result }: { result?: ConnectivityCheckResult['signallingReport'] }) => {
return (
);
};
const AudioStats = ({ stats }: { stats: DiagnosticsRTCStats | undefined }) => {
return (
{stats && (
)}
);
};
const VideoStats = ({ stats }: { stats: DiagnosticsRTCStats | undefined }) => {
return (
{stats && (
)}
);
};
const Footer = ({
error,
result,
restart,
}: {
result?: ConnectivityCheckResult;
restart: () => void;
error?: Error;
}) => {
return (
);
};
const ConnectivityTestReport = ({
error,
result,
progress,
startTest,
}: {
error?: Error;
result?: ConnectivityCheckResult;
progress?: ConnectivityState;
startTest: () => void;
}) => {
if (error) {
return (
<>
Connectivity Test Failed
{error.message}
>
);
}
if (result) {
// for debugging and quick view of results
console.log(result);
return (
<>
Connectivity test has been completed.
>
);
}
if (progress !== undefined) {
return (
Checking your connection...
{`${ConnectivityStateMessage[progress]}...`}
);
}
return null;
};
const RegionSelector = ({
region,
setRegion,
startTest,
}: {
region?: string;
startTest?: () => void;
setRegion: (region: string) => void;
}) => {
return (
Select a region
Select the closest region for best results
{Object.entries(Regions).map(([key, value]) => (
))}
);
};
export const ConnectivityTest = () => {
const { hmsDiagnostics, updateStep } = useDiagnostics();
const [region, setRegion] = useState(Object.keys(Regions)[0]);
const [error, setError] = useState();
const [progress, setProgress] = useState();
const [result, setResult] = useState();
const startTest = () => {
updateStep(DiagnosticsStep.CONNECTIVITY, { hasFailed: false, isCompleted: false });
setError(undefined);
setResult(undefined);
hmsDiagnostics
?.startConnectivityCheck(
state => {
setProgress(state);
},
result => {
updateStep(DiagnosticsStep.CONNECTIVITY, { isCompleted: true });
setResult(result);
},
region,
)
.catch(error => {
updateStep(DiagnosticsStep.CONNECTIVITY, { hasFailed: true });
setError(error);
});
};
return (
<>
>
);
};
const downloadJson = (obj: object, fileName: string) => {
const a = document.createElement('a');
const file = new Blob([JSON.stringify(obj, null, 2)], {
type: 'application/json',
});
a.href = URL.createObjectURL(file);
a.download = `${fileName}.json`;
a.click();
};