overleaf-cep/services/web/frontend/js/shared/hooks/use-active-overall-theme.tsx
Mathias Jakobsen 39b4581e1d Merge pull request #26735 from overleaf/mj-system-theme
[web] Add new system theme to the editor

GitOrigin-RevId: b65083c5e96abc493556e901c861689cb7e3bbf7
2025-07-14 08:05:37 +00:00

54 lines
1.5 KiB
TypeScript

import { useUserSettingsContext } from '@/shared/context/user-settings-context'
import { OverallTheme } from '@/shared/utils/styles'
import { isIEEEBranded } from '@/utils/is-ieee-branded'
import { useEffect, useMemo, useState } from 'react'
export type ActiveOverallTheme = 'dark' | 'light'
const mediaWatcher = window.matchMedia?.('(prefers-color-scheme: dark)') ?? {
// If matchMedia is not supported, use the default (dark) theme
matches: true,
addEventListener: () => {},
removeEventListener: () => {},
}
function getTheme(
overallTheme: OverallTheme,
prefersDark: boolean
): ActiveOverallTheme {
if (isIEEEBranded()) {
return 'dark'
}
if (overallTheme === 'light-') {
return 'light'
}
if (overallTheme === 'system') {
return prefersDark ? 'dark' : 'light'
}
return 'dark'
}
export const useActiveOverallTheme = (): ActiveOverallTheme => {
const [browserPrefersDarkMode, setBrowserPrefersDarkMode] = useState(
mediaWatcher.matches
)
const {
userSettings: { overallTheme },
} = useUserSettingsContext()
const activeOverallTheme = useMemo<ActiveOverallTheme>(() => {
return getTheme(overallTheme, browserPrefersDarkMode)
}, [overallTheme, browserPrefersDarkMode])
useEffect(() => {
const listener = (e: MediaQueryListEvent) => {
setBrowserPrefersDarkMode(e.matches)
}
mediaWatcher.addEventListener('change', listener)
return () => {
mediaWatcher.removeEventListener('change', listener)
}
}, [])
return activeOverallTheme
}