Files
yaak/src-web/hooks/useTheme.ts
2023-03-15 09:06:56 -07:00

39 lines
993 B
TypeScript

import { useQuery, useQueryClient } from '@tanstack/react-query';
import { useEffect } from 'react';
import type { Appearance } from '../lib/theme/window';
import {
getAppearance,
setAppearance,
subscribeToPreferredAppearanceChange,
toggleAppearance,
} from '../lib/theme/window';
export function appearanceQueryKey() {
return ['theme', 'appearance'];
}
export function useTheme() {
const queryClient = useQueryClient();
const appearance = useQuery({
queryKey: appearanceQueryKey(),
queryFn: getAppearance,
initialData: getAppearance(),
}).data;
const themeChange = (appearance: Appearance) => {
setAppearance(appearance);
};
const handleToggleAppearance = async () => {
const newAppearance = toggleAppearance();
await queryClient.setQueryData(appearanceQueryKey(), newAppearance);
};
useEffect(() => subscribeToPreferredAppearanceChange(themeChange), []);
return {
appearance,
toggleAppearance: handleToggleAppearance,
};
}