user-settings-context.tsx 1.5 KB

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