spacedrive/interface/hooks/useTheme.ts
Oscar Beaumont f7cd96732f
@sd/client SolidJS support - Part 1 (#1920)
* `createSolid` + `createPersistedMutable`

* Move all Valtio stores to SolidJS

* Remove Valtio from `@sd/client`

* Missed auth store

* wip

* `useSolidStore` allow mutable setting

* Restructure `@sd/client` a bit

* Add `WithSolid` + custom `useObserver`

* Parse props both ways

* Universal Context

* Solid to React context working

* Working universal context

* context inheritance

* whoops

* Make it clearer how the demo works

* wip: `useUniversalQuery`
2024-01-09 08:05:01 +00:00

58 lines
1.6 KiB
TypeScript

import { useEffect } from 'react';
import { useThemeStore } from '@sd/client';
import { usePlatform } from '..';
export function useTheme() {
const themeStore = useThemeStore();
const { lockAppTheme } = usePlatform();
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)');
useEffect(() => {
const handleThemeChange = () => {
if (themeStore.syncThemeWithSystem) {
lockAppTheme?.('Auto');
if (systemTheme.matches) {
document.documentElement.classList.remove('vanilla-theme');
document.documentElement.style.setProperty(
'--dark-hue',
themeStore.hueValue.toString()
);
themeStore.theme = 'dark';
} else {
document.documentElement.classList.add('vanilla-theme');
document.documentElement.style.setProperty(
'--light-hue',
themeStore.hueValue.toString()
);
themeStore.theme = 'vanilla';
}
} else {
if (themeStore.theme === 'dark') {
document.documentElement.classList.remove('vanilla-theme');
document.documentElement.style.setProperty(
'--dark-hue',
themeStore.hueValue.toString()
);
lockAppTheme?.('Dark');
} else if (themeStore.theme === 'vanilla') {
document.documentElement.classList.add('vanilla-theme');
document.documentElement.style.setProperty(
'--light-hue',
themeStore.hueValue.toString()
);
lockAppTheme?.('Light');
}
}
};
handleThemeChange();
systemTheme.addEventListener('change', handleThemeChange);
return () => {
systemTheme.removeEventListener('change', handleThemeChange);
};
}, [themeStore, lockAppTheme, systemTheme]);
}