Files
NewSzxcn-Email/apps/web/src/lib/display-mode.ts
T

37 lines
1.2 KiB
TypeScript
Raw Normal View History

import * as React from "react"
export type DisplayMode = "detailed" | "compact"
const DISPLAY_MODE_KEY = "lanqin:display-mode"
export function getInitialDisplayMode(): DisplayMode {
if (typeof window === "undefined") return "detailed"
return window.localStorage.getItem(DISPLAY_MODE_KEY) === "compact" ? "compact" : "detailed"
}
export function setStoredDisplayMode(mode: DisplayMode) {
window.localStorage.setItem(DISPLAY_MODE_KEY, mode)
window.dispatchEvent(new CustomEvent("lanqin:display-mode", { detail: mode }))
}
export function useDisplayMode() {
const [displayMode, setDisplayModeState] = React.useState<DisplayMode>(getInitialDisplayMode)
React.useEffect(() => {
function sync() {
setDisplayModeState(getInitialDisplayMode())
}
window.addEventListener("storage", sync)
window.addEventListener("lanqin:display-mode", sync)
return () => {
window.removeEventListener("storage", sync)
window.removeEventListener("lanqin:display-mode", sync)
}
}, [])
const setDisplayMode = React.useCallback((mode: DisplayMode) => {
setStoredDisplayMode(mode)
setDisplayModeState(mode)
}, [])
return [displayMode, setDisplayMode] as const
}