mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-27 05:24:22 -04:00
51 lines
1.9 KiB
TypeScript
51 lines
1.9 KiB
TypeScript
/*
|
|
* SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file)
|
|
*
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
import { DarkModePreference } from '../../redux/dark-mode/types'
|
|
import { isClientSideRendering } from '../../utils/is-client-side-rendering'
|
|
import { Logger } from '../../utils/logger'
|
|
import { useApplicationState } from './use-application-state'
|
|
import useMediaQuery from '@restart/hooks/useMediaQuery'
|
|
import { useEffect } from 'react'
|
|
|
|
const logger = new Logger('useApplyDarkMode')
|
|
|
|
export const DARK_MODE_LOCAL_STORAGE_KEY = 'forcedDarkMode'
|
|
|
|
/**
|
|
* Applies the `dark` css class to the body tag according to the dark mode state.
|
|
*/
|
|
export const useApplyDarkMode = (): void => {
|
|
const preference = useApplicationState((state) => state.darkMode.darkModePreference)
|
|
const isBrowserPreferringDark = useMediaQuery('(prefers-color-scheme: dark)')
|
|
|
|
useEffect(() => saveToLocalStorage(preference), [preference])
|
|
useEffect(() => {
|
|
if (preference === DarkModePreference.DARK || (preference === DarkModePreference.AUTO && isBrowserPreferringDark)) {
|
|
window.document.body.classList.add('dark')
|
|
} else {
|
|
window.document.body.classList.remove('dark')
|
|
}
|
|
}, [isBrowserPreferringDark, preference])
|
|
|
|
useEffect(() => () => window.document.body.classList.remove('dark'), [])
|
|
}
|
|
|
|
export const saveToLocalStorage = (preference: DarkModePreference): void => {
|
|
if (!isClientSideRendering()) {
|
|
return
|
|
}
|
|
try {
|
|
if (preference === DarkModePreference.DARK) {
|
|
window.localStorage.setItem(DARK_MODE_LOCAL_STORAGE_KEY, 'dark')
|
|
} else if (preference === DarkModePreference.LIGHT) {
|
|
window.localStorage.setItem(DARK_MODE_LOCAL_STORAGE_KEY, 'light')
|
|
} else if (preference === DarkModePreference.AUTO) {
|
|
window.localStorage.removeItem(DARK_MODE_LOCAL_STORAGE_KEY)
|
|
}
|
|
} catch (error) {
|
|
logger.error('Saving to local storage failed', error)
|
|
}
|
|
}
|