overleaf-cep/services/web/frontend/js/features/editor-left-menu/hooks/use-set-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

43 lines
1.4 KiB
TypeScript

import { useCallback, useEffect } from 'react'
import _ from 'lodash'
import { saveUserSettings } from '../utils/api'
import { UserSettings } from '../../../../../types/user-settings'
import { useUserSettingsContext } from '@/shared/context/user-settings-context'
import getMeta from '@/utils/meta'
import { useActiveOverallTheme } from '@/shared/hooks/use-active-overall-theme'
export default function useSetOverallTheme() {
const { userSettings, setUserSettings } = useUserSettingsContext()
const { overallTheme } = userSettings
const setOverallTheme = useCallback(
(overallTheme: UserSettings['overallTheme']) => {
setUserSettings(settings => ({ ...settings, overallTheme }))
},
[setUserSettings]
)
const activeOverallTheme = useActiveOverallTheme()
useEffect(() => {
// Sets the body's data-theme attribute for theming
document.body.dataset.theme =
activeOverallTheme === 'dark' ? 'default' : 'light'
}, [activeOverallTheme])
return useCallback(
(newOverallTheme: UserSettings['overallTheme']) => {
if (overallTheme !== newOverallTheme) {
const chosenTheme = _.find(
getMeta('ol-overallThemes'),
theme => theme.val === newOverallTheme
)
if (chosenTheme) {
setOverallTheme(newOverallTheme)
saveUserSettings('overallTheme', newOverallTheme)
}
}
},
[overallTheme, setOverallTheme]
)
}