1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Backport pull request #5589 from jellyfin-web/release-10.9.z

Add support for user themes for mui components

Original-merge: 61976b8101

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: Joshua M. Boniface <joshua@boniface.me>
This commit is contained in:
thornbill 2024-05-26 10:27:08 -04:00 committed by Joshua M. Boniface
parent 669784bde5
commit 1929ba8eb2
16 changed files with 298 additions and 62 deletions

16
src/hooks/useThemes.ts Normal file
View file

@ -0,0 +1,16 @@
import { useMemo } from 'react';
import { useWebConfig } from './useWebConfig';
export function useThemes() {
const { themes } = useWebConfig();
const defaultTheme = useMemo(() => {
return themes?.find(theme => theme.default);
}, [ themes ]);
return {
themes: themes || [],
defaultTheme
};
}

57
src/hooks/useUserTheme.ts Normal file
View file

@ -0,0 +1,57 @@
import { useCallback, useEffect, useState } from 'react';
import { currentSettings as userSettings } from 'scripts/settings/userSettings';
import Events from 'utils/events';
import { useApi } from './useApi';
import { useThemes } from './useThemes';
const THEME_FIELD_NAMES = [ 'appTheme', 'dashboardTheme' ];
export function useUserTheme() {
const [ theme, setTheme ] = useState<string>();
const [ dashboardTheme, setDashboardTheme ] = useState<string>();
const { user } = useApi();
const { defaultTheme } = useThemes();
useEffect(() => {
if (defaultTheme) {
if (!theme) setTheme(defaultTheme.id);
if (!dashboardTheme) setDashboardTheme(defaultTheme.id);
}
}, [ dashboardTheme, defaultTheme, theme ]);
// Update the current themes with values from user settings
const updateThemesFromSettings = useCallback(() => {
const userTheme = userSettings.theme();
if (userTheme) setTheme(userTheme);
const userDashboardTheme = userSettings.dashboardTheme();
if (userDashboardTheme) setDashboardTheme(userDashboardTheme);
}, []);
const onUserSettingsChange = useCallback((_e, name?: string) => {
if (name && THEME_FIELD_NAMES.includes(name)) {
updateThemesFromSettings();
}
}, [ updateThemesFromSettings ]);
// Handle user settings changes
useEffect(() => {
Events.on(userSettings, 'change', onUserSettingsChange);
return () => {
Events.off(userSettings, 'change', onUserSettingsChange);
};
}, [ onUserSettingsChange ]);
// Update the theme if the user changes
useEffect(() => {
updateThemesFromSettings();
}, [ updateThemesFromSettings, user ]);
return {
theme,
dashboardTheme
};
}