Files
yaak-mountain-loop/src-web/hooks/useTheme.ts
Gregory Schier 452a0c3ed5 A few fixes
2023-04-04 13:31:48 -07:00

40 lines
1.1 KiB
TypeScript

import { useEffect } from 'react';
import { getKeyValue } from '../lib/keyValueStore';
import type { Appearance } from '../lib/theme/window';
import {
getAppearance,
getPreferredAppearance,
setAppearance,
subscribeToPreferredAppearanceChange,
} from '../lib/theme/window';
import { useKeyValue } from './useKeyValue';
export function useTheme() {
const appearanceKv = useKeyValue<Appearance>({
key: 'appearance',
defaultValue: getAppearance(),
});
const handleToggleAppearance = async () => {
appearanceKv.set(appearanceKv.value === 'dark' ? 'light' : 'dark');
};
// Set appearance when preferred theme changes
useEffect(() => subscribeToPreferredAppearanceChange(appearanceKv.set), [appearanceKv.set]);
// Sync appearance when k/v changes
useEffect(() => setAppearance(appearanceKv.value), [appearanceKv.value]);
return {
appearance: appearanceKv.value ?? getAppearance(),
toggleAppearance: handleToggleAppearance,
};
}
export async function getAppearanceKv() {
return getKeyValue<Appearance>({
key: 'appearance',
fallback: getPreferredAppearance(),
});
}