use-set-overall-theme.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { useCallback, useEffect } from 'react'
  2. import _ from 'lodash'
  3. import { saveUserSettings } from '../utils/api'
  4. import { UserSettings } from '../../../../../types/user-settings'
  5. import { useUserSettingsContext } from '@/shared/context/user-settings-context'
  6. import getMeta from '@/utils/meta'
  7. import { useActiveOverallTheme } from '@/shared/hooks/use-active-overall-theme'
  8. export default function useSetOverallTheme() {
  9. const { userSettings, setUserSettings } = useUserSettingsContext()
  10. const { overallTheme } = userSettings
  11. const setOverallTheme = useCallback(
  12. (overallTheme: UserSettings['overallTheme']) => {
  13. setUserSettings(settings => ({ ...settings, overallTheme }))
  14. },
  15. [setUserSettings]
  16. )
  17. const activeOverallTheme = useActiveOverallTheme()
  18. useEffect(() => {
  19. // Sets the body's data-theme attribute for theming
  20. document.body.dataset.theme =
  21. activeOverallTheme === 'dark' ? 'default' : 'light'
  22. }, [activeOverallTheme])
  23. return useCallback(
  24. (newOverallTheme: UserSettings['overallTheme']) => {
  25. if (overallTheme !== newOverallTheme) {
  26. const chosenTheme = _.find(
  27. getMeta('ol-overallThemes'),
  28. theme => theme.val === newOverallTheme
  29. )
  30. if (chosenTheme) {
  31. setOverallTheme(newOverallTheme)
  32. saveUserSettings('overallTheme', newOverallTheme)
  33. }
  34. }
  35. },
  36. [overallTheme, setOverallTheme]
  37. )
  38. }