Newer
Older
Phoomparin Mano
committed
import { type ReactNode, type JSX, useEffect, useMemo } from "react";
import { memo } from "react";
import { Provider } from "react-redux";
import { AppInitializeController } from "embedding-sdk/components/private/AppInitializeController";
import {} from "embedding-sdk/components/private/PublicComponentWrapper";
import type { SdkPluginsConfig } from "embedding-sdk/lib/plugins";
Phoomparin Mano
committed
import { getEmbeddingThemeOverride } from "embedding-sdk/lib/theme/get-embedding-theme";
import { store } from "embedding-sdk/store";
import {
setErrorComponent,
setLoaderComponent,
setPlugins,
} from "embedding-sdk/store/reducer";
import type { SDKConfig } from "embedding-sdk/types";
import type { MetabaseTheme } from "embedding-sdk/types/theme";
import { EmotionCacheProvider } from "metabase/styled-components/components/EmotionCacheProvider";
import { ThemeProvider } from "metabase/ui/components/theme/ThemeProvider";
import "metabase/css/vendor.css";
import "metabase/css/index.module.css";
interface MetabaseProviderProps {
children: ReactNode;
theme?: MetabaseTheme;
const MetabaseProviderInternal = ({
children,
config,
theme,
}: MetabaseProviderProps): JSX.Element => {
Phoomparin Mano
committed
const themeOverride = useMemo(() => {
return theme && getEmbeddingThemeOverride(theme);
}, [theme]);
useEffect(() => {
store.dispatch(setPlugins(pluginsConfig || null));
}, [pluginsConfig]);
useEffect(() => {
store.dispatch(setLoaderComponent(config.loaderComponent ?? null));
}, [config.loaderComponent]);
useEffect(() => {
store.dispatch(setErrorComponent(config.errorComponent ?? null));
}, [config.errorComponent]);
return (
<Provider store={store}>
<EmotionCacheProvider>
Phoomparin Mano
committed
<ThemeProvider theme={themeOverride}>
<AppInitializeController config={config}>
{children}
</AppInitializeController>
</ThemeProvider>
</EmotionCacheProvider>
</Provider>
);
};
export const MetabaseProvider = memo(MetabaseProviderInternal);