|
@@ -1,31 +1,32 @@
|
|
|
import React, { createContext, useContext, useState, useEffect } from 'react';
|
|
import React, { createContext, useContext, useState, useEffect } from 'react';
|
|
|
|
|
+import { Theme } from './theme-provider.js';
|
|
|
|
|
|
|
|
export interface UserSettings {
|
|
export interface UserSettings {
|
|
|
- displayLanguage: string;
|
|
|
|
|
- displayLocale: string | null;
|
|
|
|
|
- contentLanguage: string;
|
|
|
|
|
- theme: string;
|
|
|
|
|
- displayUiExtensionPoints: boolean;
|
|
|
|
|
- mainNavExpanded: boolean;
|
|
|
|
|
|
|
+ displayLanguage: string;
|
|
|
|
|
+ displayLocale?: string;
|
|
|
|
|
+ contentLanguage: string;
|
|
|
|
|
+ theme: Theme;
|
|
|
|
|
+ displayUiExtensionPoints: boolean;
|
|
|
|
|
+ mainNavExpanded: boolean;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const defaultSettings: UserSettings = {
|
|
const defaultSettings: UserSettings = {
|
|
|
- displayLanguage: 'en',
|
|
|
|
|
- displayLocale: null,
|
|
|
|
|
- contentLanguage: 'en',
|
|
|
|
|
- theme: 'default',
|
|
|
|
|
- displayUiExtensionPoints: false,
|
|
|
|
|
- mainNavExpanded: true,
|
|
|
|
|
|
|
+ displayLanguage: 'en',
|
|
|
|
|
+ displayLocale: undefined,
|
|
|
|
|
+ contentLanguage: 'en',
|
|
|
|
|
+ theme: 'system',
|
|
|
|
|
+ displayUiExtensionPoints: false,
|
|
|
|
|
+ mainNavExpanded: true,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
interface UserSettingsContextType {
|
|
interface UserSettingsContextType {
|
|
|
- settings: UserSettings;
|
|
|
|
|
- setDisplayLanguage: (language: string) => void;
|
|
|
|
|
- setDisplayLocale: (locale: string | null) => void;
|
|
|
|
|
- setContentLanguage: (language: string) => void;
|
|
|
|
|
- setTheme: (theme: string) => void;
|
|
|
|
|
- setDisplayUiExtensionPoints: (display: boolean) => void;
|
|
|
|
|
- setMainNavExpanded: (expanded: boolean) => void;
|
|
|
|
|
|
|
+ settings: UserSettings;
|
|
|
|
|
+ setDisplayLanguage: (language: string) => void;
|
|
|
|
|
+ setDisplayLocale: (locale: string | null) => void;
|
|
|
|
|
+ setContentLanguage: (language: string) => void;
|
|
|
|
|
+ setTheme: (theme: string) => void;
|
|
|
|
|
+ setDisplayUiExtensionPoints: (display: boolean) => void;
|
|
|
|
|
+ setMainNavExpanded: (expanded: boolean) => void;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const UserSettingsContext = createContext<UserSettingsContextType | undefined>(undefined);
|
|
const UserSettingsContext = createContext<UserSettingsContextType | undefined>(undefined);
|
|
@@ -33,57 +34,53 @@ const UserSettingsContext = createContext<UserSettingsContextType | undefined>(u
|
|
|
const STORAGE_KEY = 'vendure-user-settings';
|
|
const STORAGE_KEY = 'vendure-user-settings';
|
|
|
|
|
|
|
|
export const UserSettingsProvider: React.FC<React.PropsWithChildren<{}>> = ({ children }) => {
|
|
export const UserSettingsProvider: React.FC<React.PropsWithChildren<{}>> = ({ children }) => {
|
|
|
- // Load settings from localStorage or use defaults
|
|
|
|
|
- const loadSettings = (): UserSettings => {
|
|
|
|
|
- try {
|
|
|
|
|
- const storedSettings = localStorage.getItem(STORAGE_KEY);
|
|
|
|
|
- if (storedSettings) {
|
|
|
|
|
- return { ...defaultSettings, ...JSON.parse(storedSettings) };
|
|
|
|
|
- }
|
|
|
|
|
- } catch (e) {
|
|
|
|
|
- console.error('Failed to load user settings from localStorage', e);
|
|
|
|
|
- }
|
|
|
|
|
- return { ...defaultSettings };
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ // Load settings from localStorage or use defaults
|
|
|
|
|
+ const loadSettings = (): UserSettings => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const storedSettings = localStorage.getItem(STORAGE_KEY);
|
|
|
|
|
+ if (storedSettings) {
|
|
|
|
|
+ return { ...defaultSettings, ...JSON.parse(storedSettings) };
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('Failed to load user settings from localStorage', e);
|
|
|
|
|
+ }
|
|
|
|
|
+ return { ...defaultSettings };
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- const [settings, setSettings] = useState<UserSettings>(loadSettings);
|
|
|
|
|
|
|
+ const [settings, setSettings] = useState<UserSettings>(loadSettings);
|
|
|
|
|
|
|
|
- // Save settings to localStorage whenever they change
|
|
|
|
|
- useEffect(() => {
|
|
|
|
|
- try {
|
|
|
|
|
- localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
|
|
|
|
|
- } catch (e) {
|
|
|
|
|
- console.error('Failed to save user settings to localStorage', e);
|
|
|
|
|
- }
|
|
|
|
|
- }, [settings]);
|
|
|
|
|
|
|
+ // Save settings to localStorage whenever they change
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('Failed to save user settings to localStorage', e);
|
|
|
|
|
+ }
|
|
|
|
|
+ }, [settings]);
|
|
|
|
|
|
|
|
- // Settings updaters
|
|
|
|
|
- const updateSetting = <K extends keyof UserSettings>(key: K, value: UserSettings[K]) => {
|
|
|
|
|
- setSettings(prev => ({ ...prev, [key]: value }));
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ // Settings updaters
|
|
|
|
|
+ const updateSetting = <K extends keyof UserSettings>(key: K, value: UserSettings[K]) => {
|
|
|
|
|
+ setSettings(prev => ({ ...prev, [key]: value }));
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- const contextValue: UserSettingsContextType = {
|
|
|
|
|
- settings,
|
|
|
|
|
- setDisplayLanguage: (language) => updateSetting('displayLanguage', language),
|
|
|
|
|
- setDisplayLocale: (locale) => updateSetting('displayLocale', locale),
|
|
|
|
|
- setContentLanguage: (language) => updateSetting('contentLanguage', language),
|
|
|
|
|
- setTheme: (theme) => updateSetting('theme', theme),
|
|
|
|
|
- setDisplayUiExtensionPoints: (display) => updateSetting('displayUiExtensionPoints', display),
|
|
|
|
|
- setMainNavExpanded: (expanded) => updateSetting('mainNavExpanded', expanded),
|
|
|
|
|
- };
|
|
|
|
|
|
|
+ const contextValue: UserSettingsContextType = {
|
|
|
|
|
+ settings,
|
|
|
|
|
+ setDisplayLanguage: language => updateSetting('displayLanguage', language),
|
|
|
|
|
+ setDisplayLocale: locale => updateSetting('displayLocale', locale),
|
|
|
|
|
+ setContentLanguage: language => updateSetting('contentLanguage', language),
|
|
|
|
|
+ setTheme: theme => updateSetting('theme', theme),
|
|
|
|
|
+ setDisplayUiExtensionPoints: display => updateSetting('displayUiExtensionPoints', display),
|
|
|
|
|
+ setMainNavExpanded: expanded => updateSetting('mainNavExpanded', expanded),
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
- return (
|
|
|
|
|
- <UserSettingsContext.Provider value={contextValue}>
|
|
|
|
|
- {children}
|
|
|
|
|
- </UserSettingsContext.Provider>
|
|
|
|
|
- );
|
|
|
|
|
|
|
+ return <UserSettingsContext.Provider value={contextValue}>{children}</UserSettingsContext.Provider>;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
// Hook to use the user settings
|
|
// Hook to use the user settings
|
|
|
export const useUserSettings = () => {
|
|
export const useUserSettings = () => {
|
|
|
- const context = useContext(UserSettingsContext);
|
|
|
|
|
- if (context === undefined) {
|
|
|
|
|
- throw new Error('useUserSettings must be used within a UserSettingsProvider');
|
|
|
|
|
- }
|
|
|
|
|
- return context;
|
|
|
|
|
-};
|
|
|
|
|
|
|
+ const context = useContext(UserSettingsContext);
|
|
|
|
|
+ if (context === undefined) {
|
|
|
|
|
+ throw new Error('useUserSettings must be used within a UserSettingsProvider');
|
|
|
|
|
+ }
|
|
|
|
|
+ return context;
|
|
|
|
|
+};
|