diff --git a/apps/frontend/src/ui/App.tsx b/apps/frontend/src/ui/App.tsx index 2ded5981..f605a19f 100644 --- a/apps/frontend/src/ui/App.tsx +++ b/apps/frontend/src/ui/App.tsx @@ -7,6 +7,7 @@ import AnimatedRoutes from './components/AnimatedRoutes'; import NotificationOverlay from './components/overlay/notifications/NotificationOverlay'; import { SettingsProvider } from './hooks/useSettings'; import { ClusterModalController } from './components/overlay/cluster/ClusterCreationModal'; +import { MultiProvider } from './components/MultiProvider'; import { AppInfo } from '~utils/program-info'; function App(props: ParentProps) { @@ -44,12 +45,14 @@ function App(props: ParentProps) { export default App; function GlobalContexts(props: ParentProps) { - // TODO(refactor): Something something lots of nesting will look awful soon return ( - - - {props.children} - - + + {props.children} + ); } diff --git a/apps/frontend/src/ui/components/MultiProvider.tsx b/apps/frontend/src/ui/components/MultiProvider.tsx new file mode 100644 index 00000000..f454159f --- /dev/null +++ b/apps/frontend/src/ui/components/MultiProvider.tsx @@ -0,0 +1,41 @@ +/** + * Taken from https://github.com/solidjs-community/solid-primitives/blob/main/packages/context/src/index.ts + * MIT LICENSE + */ +/* eslint-disable solid/reactivity -- . */ +import { type Context, type ContextProviderComponent, type FlowComponent, type JSX, createComponent } from 'solid-js'; + +export function MultiProvider(props: { + values: { + [K in keyof T]: + | readonly [ + Context | ContextProviderComponent, + [T[K]][T extends unknown ? 0 : never], + ] + | FlowComponent; + }; + children: JSX.Element; +}): JSX.Element { + const { values } = props; + const fn = (i: number) => { + let item: any = values[i]; + + if (!item) + return props.children; + + const ctxProps: { value?: any; children: JSX.Element } = { + get children() { + return fn(i + 1); + }, + }; + if (Array.isArray(item)) { + ctxProps.value = item[1]; + item = item[0]; + if (typeof item !== 'function') + item = item.Provider; + } + + return createComponent(item, ctxProps); + }; + return fn(0); +}