forked from akai/readest
a52d9e3a2b
* feat: enable linking to settings items * feat: integrate command palette with global state and styles * feat: add command pallete ui and fuzzy search * feat: add command palette with global state and styles * feat: add command registry and search dependencies * fix: open command palette with shortcuts in reader page --------- Co-authored-by: Huang Xin <chrox.huang@gmail.com>
84 lines
2.9 KiB
TypeScript
84 lines
2.9 KiB
TypeScript
'use client';
|
|
|
|
import '@/utils/polyfill';
|
|
import i18n from '@/i18n/i18n';
|
|
import { useEffect } from 'react';
|
|
import { IconContext } from 'react-icons';
|
|
import { AuthProvider } from '@/context/AuthContext';
|
|
import { useEnv } from '@/context/EnvContext';
|
|
import { CSPostHogProvider } from '@/context/PHContext';
|
|
import { SyncProvider } from '@/context/SyncContext';
|
|
import { initSystemThemeListener, loadDataTheme } from '@/store/themeStore';
|
|
import { useSettingsStore } from '@/store/settingsStore';
|
|
import { useSafeAreaInsets } from '@/hooks/useSafeAreaInsets';
|
|
import { useDefaultIconSize } from '@/hooks/useResponsiveSize';
|
|
import { useBackgroundTexture } from '@/hooks/useBackgroundTexture';
|
|
import { useEinkMode } from '@/hooks/useEinkMode';
|
|
import { getLocale } from '@/utils/misc';
|
|
import { getDirFromUILanguage } from '@/utils/rtl';
|
|
import { CommandPaletteProvider, CommandPalette } from '@/components/command-palette';
|
|
|
|
const Providers = ({ children }: { children: React.ReactNode }) => {
|
|
const { envConfig, appService } = useEnv();
|
|
const { applyUILanguage } = useSettingsStore();
|
|
const { applyBackgroundTexture } = useBackgroundTexture();
|
|
const { applyEinkMode } = useEinkMode();
|
|
const iconSize = useDefaultIconSize();
|
|
useSafeAreaInsets(); // Initialize safe area insets
|
|
|
|
useEffect(() => {
|
|
const handlerLanguageChanged = (lng: string) => {
|
|
document.documentElement.lang = lng;
|
|
// Set RTL class on document for targeted styling without affecting layout
|
|
const dir = getDirFromUILanguage();
|
|
if (dir === 'rtl') {
|
|
document.documentElement.classList.add('ui-rtl');
|
|
} else {
|
|
document.documentElement.classList.remove('ui-rtl');
|
|
}
|
|
};
|
|
|
|
const locale = getLocale();
|
|
handlerLanguageChanged(locale);
|
|
i18n.on('languageChanged', handlerLanguageChanged);
|
|
return () => {
|
|
i18n.off('languageChanged', handlerLanguageChanged);
|
|
};
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
loadDataTheme();
|
|
if (appService) {
|
|
initSystemThemeListener(appService);
|
|
appService.loadSettings().then((settings) => {
|
|
const globalViewSettings = settings.globalViewSettings;
|
|
applyUILanguage(globalViewSettings.uiLanguage);
|
|
applyBackgroundTexture(envConfig, globalViewSettings);
|
|
if (globalViewSettings.isEink) {
|
|
applyEinkMode(true);
|
|
}
|
|
});
|
|
}
|
|
}, [envConfig, appService, applyUILanguage, applyBackgroundTexture, applyEinkMode]);
|
|
|
|
// Make sure appService is available in all children components
|
|
if (!appService) return;
|
|
|
|
return (
|
|
<CSPostHogProvider>
|
|
<AuthProvider>
|
|
<IconContext.Provider value={{ size: `${iconSize}px` }}>
|
|
<SyncProvider>
|
|
<CommandPaletteProvider>
|
|
{children}
|
|
<CommandPalette />
|
|
</CommandPaletteProvider>
|
|
</SyncProvider>
|
|
</IconContext.Provider>
|
|
</AuthProvider>
|
|
</CSPostHogProvider>
|
|
);
|
|
};
|
|
|
|
export default Providers;
|