Skip to content

Preact Example: Ssr Streaming

import { Suspense } from 'preact/compat'
import { useSuspenseQuery } from '@tanstack/preact-query'
import ErrorBoundary from './ErrorBoundary'
import { waitQueries } from './services/wait/queries'

export const waits = [100, 200, 300, 400, 500, 600, 700]
export const combinedWaits = [800, 900, 1000]

function MyComponent(props: { wait: number }) {
  const { data } = useSuspenseQuery(waitQueries.detail(props.wait))

  return <div>result: {data}</div>
}

export default function App() {
  return (
    <>
      {waits.map((wait) => (
        <ErrorBoundary
          key={wait}
          fallback={(error) => <div>error: {error.message}</div>}
        >
          <Suspense fallback={<div>waiting {wait}....</div>}>
            <MyComponent wait={wait} />
          </Suspense>
        </ErrorBoundary>
      ))}

      <fieldset>
        <legend>
          combined <code>Suspense</code>-container
        </legend>
        <ErrorBoundary fallback={(error) => <div>error: {error.message}</div>}>
          <Suspense
            fallback={
              <>
                {combinedWaits.map((wait) => (
                  <div key={wait}>waiting {wait}....</div>
                ))}
              </>
            }
          >
            {combinedWaits.map((wait) => (
              <MyComponent key={wait} wait={wait} />
            ))}
          </Suspense>
        </ErrorBoundary>
      </fieldset>
    </>
  )
}