user-settings-context.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import {
  2. createContext,
  3. useContext,
  4. useMemo,
  5. Dispatch,
  6. SetStateAction,
  7. FC,
  8. useState,
  9. useEffect,
  10. } from 'react'
  11. import { UserSettings } from '../../../../types/user-settings'
  12. import getMeta from '@/utils/meta'
  13. const defaultSettings: UserSettings = {
  14. pdfViewer: 'pdfjs',
  15. autoComplete: true,
  16. autoPairDelimiters: true,
  17. syntaxValidation: false,
  18. editorTheme: 'textmate',
  19. overallTheme: '',
  20. mode: 'default',
  21. fontSize: 12,
  22. fontFamily: 'monaco',
  23. lineHeight: 'normal',
  24. }
  25. type UserSettingsContextValue = {
  26. userSettings: UserSettings
  27. setUserSettings: Dispatch<
  28. SetStateAction<UserSettingsContextValue['userSettings']>
  29. >
  30. }
  31. export const UserSettingsContext = createContext<
  32. UserSettingsContextValue | undefined
  33. >(undefined)
  34. export const UserSettingsProvider: FC = ({ children }) => {
  35. const [userSettings, setUserSettings] = useState<
  36. UserSettingsContextValue['userSettings']
  37. >(() => getMeta('ol-userSettings') || defaultSettings)
  38. const value = useMemo<UserSettingsContextValue>(
  39. () => ({
  40. userSettings,
  41. setUserSettings,
  42. }),
  43. [userSettings, setUserSettings]
  44. )
  45. // Fire an event to inform non-React code of settings changes
  46. useEffect(() => {
  47. window.dispatchEvent(
  48. new CustomEvent('settings:change', { detail: userSettings })
  49. )
  50. }, [userSettings])
  51. return (
  52. <UserSettingsContext.Provider value={value}>
  53. {children}
  54. </UserSettingsContext.Provider>
  55. )
  56. }
  57. export function useUserSettingsContext() {
  58. const context = useContext(UserSettingsContext)
  59. if (!context) {
  60. throw new Error(
  61. 'useUserSettingsContext is only available inside UserSettingsProvider'
  62. )
  63. }
  64. return context
  65. }