2024-08-28 16:24:12 -04:00
|
|
|
import React, { type FC, type PropsWithChildren, createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
|
|
|
|
|
|
|
|
import { FALLBACK_CULTURE } from 'lib/globalize';
|
|
|
|
import { currentSettings as userSettings } from 'scripts/settings/userSettings';
|
|
|
|
import Events, { type Event } from 'utils/events';
|
|
|
|
|
|
|
|
import { useApi } from './useApi';
|
|
|
|
|
|
|
|
interface UserSettings {
|
2025-03-24 01:07:51 -04:00
|
|
|
customCss?: string
|
|
|
|
disableCustomCss: boolean
|
2024-08-28 16:24:12 -04:00
|
|
|
theme?: string
|
|
|
|
dashboardTheme?: string
|
|
|
|
dateTimeLocale?: string
|
|
|
|
language?: string
|
|
|
|
}
|
|
|
|
|
|
|
|
// NOTE: This is an incomplete list of only the settings that are currently being used
|
|
|
|
const UserSettingField = {
|
2025-03-24 01:07:51 -04:00
|
|
|
// Custom CSS
|
|
|
|
CustomCss: 'customCss',
|
|
|
|
DisableCustomCss: 'disableCustomCss',
|
2024-08-28 16:24:12 -04:00
|
|
|
// Theme settings
|
|
|
|
Theme: 'appTheme',
|
|
|
|
DashboardTheme: 'dashboardTheme',
|
|
|
|
// Locale settings
|
|
|
|
DateTimeLocale: 'datetimelocale',
|
|
|
|
Language: 'language'
|
|
|
|
};
|
|
|
|
|
2025-03-24 01:07:51 -04:00
|
|
|
const UserSettingsContext = createContext<UserSettings>({
|
|
|
|
disableCustomCss: false
|
|
|
|
});
|
2024-08-28 16:24:12 -04:00
|
|
|
|
|
|
|
export const useUserSettings = () => useContext(UserSettingsContext);
|
|
|
|
|
|
|
|
export const UserSettingsProvider: FC<PropsWithChildren<unknown>> = ({ children }) => {
|
2025-03-24 01:07:51 -04:00
|
|
|
const [ customCss, setCustomCss ] = useState<string>();
|
|
|
|
const [ disableCustomCss, setDisableCustomCss ] = useState(false);
|
2024-08-28 16:24:12 -04:00
|
|
|
const [ theme, setTheme ] = useState<string>();
|
|
|
|
const [ dashboardTheme, setDashboardTheme ] = useState<string>();
|
|
|
|
const [ dateTimeLocale, setDateTimeLocale ] = useState<string>();
|
|
|
|
const [ language, setLanguage ] = useState<string | undefined>(FALLBACK_CULTURE);
|
|
|
|
|
|
|
|
const { user } = useApi();
|
|
|
|
|
|
|
|
const context = useMemo<UserSettings>(() => ({
|
2025-03-24 01:07:51 -04:00
|
|
|
customCss,
|
|
|
|
disableCustomCss,
|
2024-08-28 16:24:12 -04:00
|
|
|
theme,
|
|
|
|
dashboardTheme,
|
|
|
|
dateTimeLocale,
|
|
|
|
locale: language
|
2025-03-24 01:07:51 -04:00
|
|
|
}), [
|
|
|
|
customCss,
|
|
|
|
disableCustomCss,
|
|
|
|
theme,
|
|
|
|
dashboardTheme,
|
|
|
|
dateTimeLocale,
|
|
|
|
language
|
|
|
|
]);
|
2024-08-28 16:24:12 -04:00
|
|
|
|
|
|
|
// Update the values of the user settings
|
|
|
|
const updateUserSettings = useCallback(() => {
|
2025-03-24 01:07:51 -04:00
|
|
|
setCustomCss(userSettings.customCss());
|
|
|
|
setDisableCustomCss(userSettings.disableCustomCss());
|
2024-08-28 16:24:12 -04:00
|
|
|
setTheme(userSettings.theme());
|
|
|
|
setDashboardTheme(userSettings.dashboardTheme());
|
|
|
|
setDateTimeLocale(userSettings.dateTimeLocale());
|
|
|
|
setLanguage(userSettings.language());
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
const onUserSettingsChange = useCallback((_e: Event, name?: string) => {
|
|
|
|
if (name && Object.values(UserSettingField).includes(name)) {
|
|
|
|
updateUserSettings();
|
|
|
|
}
|
|
|
|
}, [ updateUserSettings ]);
|
|
|
|
|
|
|
|
// Handle user settings changes
|
|
|
|
useEffect(() => {
|
|
|
|
Events.on(userSettings, 'change', onUserSettingsChange);
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
Events.off(userSettings, 'change', onUserSettingsChange);
|
|
|
|
};
|
|
|
|
}, [ onUserSettingsChange ]);
|
|
|
|
|
|
|
|
// Update the settings if the user changes
|
|
|
|
useEffect(() => {
|
|
|
|
updateUserSettings();
|
|
|
|
}, [ updateUserSettings, user ]);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<UserSettingsContext.Provider value={context}>
|
|
|
|
{children}
|
|
|
|
</UserSettingsContext.Provider>
|
|
|
|
);
|
|
|
|
};
|