vignette/apps/web/src/lib/useTheme.ts
2026-07-15 21:31:30 +09:00

17 lines
617 B
TypeScript

import { useCallback, useSyncExternalStore } from "react";
import {
applyTheme,
readAppliedTheme,
subscribeTheme,
type AppTheme,
} from "./theme";
/**
* 전역 테마 hook. Topbar와 Settings가 같은 external store를 구독한다.
* 반환 형태는 기존 Settings 계약([dark, setDark])을 유지한다.
*/
export function useTheme(): [boolean, (next: boolean) => void] {
const theme = useSyncExternalStore(subscribeTheme, readAppliedTheme, (): AppTheme => "dark");
const setDark = useCallback((next: boolean) => applyTheme(next ? "dark" : "light"), []);
return [theme === "dark", setDark];
}