in packages-demo/demo-rc-elements/src/rc/pre-promise/index.tsx [81:126]
export default function PrePromise({
promise
}: IPropsPrePromise): JSX.Element {
const [stateResult, setStateResult] = useState<IPromiseResult>(DEFAULT_RESULT);
useEffect(() => {
if (!promise) {
setStateResult(DEFAULT_RESULT);
return;
}
setStateResult({
loading: ELoading.LOADING,
result: null
});
const start = Date.now();
promise.then(result => setStateResult({
loading: ELoading.RESOLVED,
result,
duration: Date.now() - start
})).catch(err => setStateResult({
loading: ELoading.REJECTED,
result: err,
duration: Date.now() - start
}));
}, [promise]);
return <ScPrePromise>
{((): JSX.Element => {
switch (stateResult.loading) {
case ELoading.LOADING:
return <ScInfoLoading>Loading...</ScInfoLoading>;
case ELoading.RESOLVED:
return <ScInfoResolved>Success, time: {stateResult.duration}ms</ScInfoResolved>;
case ELoading.REJECTED:
return <ScInfoRejected>Failed, time: {stateResult.duration}ms</ScInfoRejected>;
default:
return <ScInfoIdle>Idle</ScInfoIdle>;
}
})()}
<PreJson o={stateResult.loading === ELoading.REJECTED ? normalizeError(stateResult.result as Error) : stateResult.result} />
</ScPrePromise>;
}