Files
simple-react-app-kit/packages/appearance/src/use-resolved-theme.ts
T

33 lines
947 B
TypeScript
Raw Normal View History

import React from "react"
import { usePreference } from "@workspace/preferences"
import type { ThemeMode } from "./preferences"
import type { ThemeScheme } from "./theme"
const systemThemeQuery = "(prefers-color-scheme: dark)"
function subscribeToSystemTheme(listener: VoidFunction) {
const mediaQuery = window.matchMedia(systemThemeQuery)
mediaQuery.addEventListener("change", listener)
return () => mediaQuery.removeEventListener("change", listener)
}
function getSystemTheme(): ThemeScheme {
return window.matchMedia(systemThemeQuery).matches ? "dark" : "light"
}
function getServerSystemTheme(): ThemeScheme {
return "light"
}
export function useResolvedTheme(): ThemeScheme {
const themeMode: ThemeMode = usePreference("theme-mode")[0]
const systemTheme = React.useSyncExternalStore(
subscribeToSystemTheme,
getSystemTheme,
getServerSystemTheme
)
return themeMode === "system" ? systemTheme : themeMode
}