export default function PrePromise()

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>;
}