Skip to content

Instantly share code, notes, and snippets.

@nixjs
Created March 26, 2025 00:39
Show Gist options
  • Save nixjs/afd3f53a3061279bb1a7b1565f44c703 to your computer and use it in GitHub Desktop.
Save nixjs/afd3f53a3061279bb1a7b1565f44c703 to your computer and use it in GitHub Desktop.
Build providers tree in react
import { ComponentType, ReactNode, FC } from 'react';
type ProviderWithProps<P = any> = [ComponentType<P>, P?];
const buildProvidersTree = <P extends ProviderWithProps[]>(
providers: [...P]
): FC<{ children: ReactNode }> => {
return ({ children }) =>
providers.reduceRight<ReactNode>((acc, [Provider, props]) => {
return props ? (
<Provider {...props}>{acc}</Provider>
) : (
<Provider>{acc}</Provider>
);
}, children);
};
interface ThemeProps {
theme: 'light' | 'dark';
}
const ThemeProvider = ({ theme, children }: ThemeProps & { children: ReactNode }) => (
<div className={theme}>{children}</div>
);
interface ValueProps {
value: number;
}
const ValueProvider = ({ value, children }: ValueProps & { children: ReactNode }) => (
<div data-value={value}>{children}</div>
);
const AuthProvider = ({ children }: { children: ReactNode }) => (
<>{children}</>
);
const ProviderTree = buildProvidersTree([
[AuthProvider],
[ThemeProvider, { theme: 'dark' }],
[ValueProvider, { value: 10 }],
]);
// Component App
const App: FC = () => (
<ProviderTree>
<div>Your app content here</div>
</ProviderTree>
);
export default App;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment