17 lines
617 B
TypeScript
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];
|
|
}
|