Files
myeasycms-v2/apps/web/components/root-providers.tsx
gbuomprisco 6b48778753 Add version updater feature
Added a version updater component that frequently checks for updates to the app and alerts the user if necessary. This requires a new route, config changes, and additional UI resources. A new feature flag 'enableVersionUpdater' has been added in the feature-flags.config.ts file to toggle this feature.
2024-06-22 20:21:08 +08:00

87 lines
2.5 KiB
TypeScript

'use client';
import dynamic from 'next/dynamic';
import { ReactQueryStreamedHydration } from '@tanstack/react-query-next-experimental';
import { ThemeProvider } from 'next-themes';
import { CaptchaProvider } from '@kit/auth/captcha/client';
import { I18nProvider } from '@kit/i18n/provider';
import { MonitoringProvider } from '@kit/monitoring/components';
import { useAuthChangeListener } from '@kit/supabase/hooks/use-auth-change-listener';
import { If } from '@kit/ui/if';
import { VersionUpdater } from '@kit/ui/version-updater';
import appConfig from '~/config/app.config';
import authConfig from '~/config/auth.config';
import featuresFlagConfig from '~/config/feature-flags.config';
import pathsConfig from '~/config/paths.config';
import { i18nResolver } from '~/lib/i18n/i18n.resolver';
import { getI18nSettings } from '~/lib/i18n/i18n.settings';
import { ReactQueryProvider } from './react-query-provider';
const captchaSiteKey = authConfig.captchaTokenSiteKey;
const CaptchaTokenSetter = dynamic(async () => {
if (!captchaSiteKey) {
return Promise.resolve(() => null);
}
const { CaptchaTokenSetter } = await import('@kit/auth/captcha/client');
return {
default: CaptchaTokenSetter,
};
});
export function RootProviders({
lang,
theme = appConfig.theme,
children,
}: React.PropsWithChildren<{
lang: string;
theme?: string;
}>) {
const i18nSettings = getI18nSettings(lang);
return (
<MonitoringProvider>
<ReactQueryProvider>
<ReactQueryStreamedHydration>
<I18nProvider settings={i18nSettings} resolver={i18nResolver}>
<CaptchaProvider>
<CaptchaTokenSetter siteKey={captchaSiteKey} />
<AuthProvider>
<ThemeProvider
attribute="class"
enableSystem
disableTransitionOnChange
defaultTheme={theme}
enableColorScheme={false}
>
{children}
</ThemeProvider>
</AuthProvider>
</CaptchaProvider>
<If condition={featuresFlagConfig.enableVersionUpdater}>
<VersionUpdater />
</If>
</I18nProvider>
</ReactQueryStreamedHydration>
</ReactQueryProvider>
</MonitoringProvider>
);
}
// we place this below React Query since it uses the QueryClient
function AuthProvider(props: React.PropsWithChildren) {
useAuthChangeListener({
appHomePath: pathsConfig.app.home,
});
return props.children;
}