Advertisement
Guest User

SuspenseTrigger (doesn't work)

a guest
Jun 24th, 2020
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import React, {Suspense, PropsWithChildren, useState, useEffect} from 'react'
  2.  
  3. async function waitOneTick() {
  4.   await new Promise(r => setTimeout(r, 100))
  5. }
  6.  
  7. export default function SuspenseTrigger(props) {
  8.   const [onLoadCalled, setOnLoadCalled] = useState(false)
  9.   const [onCompleteCalled, setOnCompleteCalled] = useState(false)
  10.   const [fallbackLoaded, setFallbackLoaded] = useState(false)
  11.   const [useOtherFallback, setUseOtherFallback] = useState(false)
  12.  
  13.   useEffect(() => {
  14.     waitOneTick().then(() => {
  15.       if (!fallbackLoaded) {
  16.         console.log('using other fallback')
  17.         setUseOtherFallback(true)
  18.       }
  19.     })
  20.   }, [])
  21.  
  22.   function onLoad(fallback: boolean) {
  23.     if (fallback) {
  24.       setFallbackLoaded(true)
  25.     }
  26.  
  27.     setOnLoadCalled(true)
  28.  
  29.     if (props.onLoad) {
  30.       props.onLoad()
  31.     }
  32.   }
  33.  
  34.   function onComplete() {
  35.     setOnCompleteCalled(true)
  36.  
  37.     if (props.onComplete) {
  38.       props.onComplete()
  39.     }
  40.   }
  41.  
  42.   async function ensureLoadCompleteCalled() {
  43.     if (!onLoadCalled) {
  44.       onLoad(false)
  45.     }
  46.  
  47.     if (!onCompleteCalled) {
  48.       onComplete()
  49.     }
  50.   }
  51.  
  52.   return (
  53.     <Suspense
  54.       fallback={
  55.         <>
  56.           {props.fallback}
  57.           <Trigger
  58.             onComplete={onComplete}
  59.             onLoad={() => onLoad(true)}
  60.           />
  61.         </>
  62.       }
  63.     >
  64.       {props.children}
  65.       {useOtherFallback ? <Trigger onLoad={ensureLoadCompleteCalled} /> : null}
  66.     </Suspense>
  67.   )
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement