mirror of
https://github.com/Sonarr/Sonarr.git
synced 2026-04-18 21:35:27 -04:00
57 lines
1.4 KiB
TypeScript
57 lines
1.4 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import { useUiSettingsValues } from 'Settings/UI/useUiSettings';
|
|
import themes from 'Styles/Themes';
|
|
|
|
const useTheme = (): 'dark' | 'light' => {
|
|
const { theme } = useUiSettingsValues();
|
|
const selectedTheme = theme ?? window.Sonarr.theme;
|
|
const [resolvedTheme, setResolvedTheme] = useState(() => {
|
|
if (selectedTheme === 'auto') {
|
|
return window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
? 'dark'
|
|
: 'light';
|
|
}
|
|
|
|
return selectedTheme;
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (selectedTheme !== 'auto') {
|
|
setResolvedTheme(selectedTheme);
|
|
return;
|
|
}
|
|
|
|
const applySystemTheme = () => {
|
|
setResolvedTheme(
|
|
window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
? 'dark'
|
|
: 'light'
|
|
);
|
|
};
|
|
|
|
applySystemTheme();
|
|
|
|
window
|
|
.matchMedia('(prefers-color-scheme: dark)')
|
|
.addEventListener('change', applySystemTheme);
|
|
|
|
return () => {
|
|
window
|
|
.matchMedia('(prefers-color-scheme: dark)')
|
|
.removeEventListener('change', applySystemTheme);
|
|
};
|
|
}, [selectedTheme]);
|
|
|
|
return resolvedTheme;
|
|
};
|
|
|
|
export default useTheme;
|
|
|
|
export const useThemeColor = (color: string) => {
|
|
const theme = useTheme();
|
|
const themeVariables = themes[theme];
|
|
|
|
// @ts-expect-error - themeVariables is a string indexable type
|
|
return themeVariables[color];
|
|
};
|