summaryrefslogtreecommitdiff
path: root/frontend/src/components/WithSuspense.tsx
blob: 7460aa3d3259a06e129de0cb8648284db6a466eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import { SteamSpinner } from 'decky-frontend-lib';
import { FunctionComponent, ReactElement, ReactNode, Suspense } from 'react';

interface WithSuspenseProps {
  children: ReactNode;
}

// Nice little wrapper around Suspense so we don't have to duplicate the styles and code for the loading spinner
const WithSuspense: FunctionComponent<WithSuspenseProps> = (props) => {
  const propsCopy = { ...props };
  delete propsCopy.children;
  (props.children as ReactElement)?.props && Object.assign((props.children as ReactElement).props, propsCopy); // There is probably a better way to do this but valve does it this way so ¯\_(ツ)_/¯
  return (
    <Suspense
      fallback={
        <div
          style={{
            marginTop: '40px',
            height: 'calc( 100% - 40px )',
            overflowY: 'scroll',
          }}
        >
          <SteamSpinner />
        </div>
      }
    >
      {props.children}
    </Suspense>
  );
};

export default WithSuspense;