user-settings-context.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. enableNewEditorLegacy: true,
  27. breadcrumbs: true,
  28. darkModePdf: false,
  29. }
  30. type UserSettingsContextValue = {
  31. userSettings: UserSettings
  32. setUserSettings: Dispatch<
  33. SetStateAction<UserSettingsContextValue['userSettings']>
  34. >
  35. }
  36. export const UserSettingsContext = createContext<
  37. UserSettingsContextValue | undefined
  38. >(undefined)
  39. export const UserSettingsProvider: FC<React.PropsWithChildren> = ({
  40. children,
  41. }) => {
  42. const [userSettings, setUserSettings] = useState<UserSettings>(
  43. () => getMeta('ol-userSettings') || defaultSettings
  44. )
  45. const value = useMemo<UserSettingsContextValue>(
  46. () => ({
  47. userSettings,
  48. setUserSettings,
  49. }),
  50. [userSettings, setUserSettings]
  51. )
  52. return (
  53. <UserSettingsContext.Provider value={value}>
  54. {children}
  55. </UserSettingsContext.Provider>
  56. )
  57. }
  58. export function useUserSettingsContext() {
  59. const context = useContext(UserSettingsContext)
  60. if (!context) {
  61. throw new Error(
  62. 'useUserSettingsContext is only available inside UserSettingsProvider'
  63. )
  64. }
  65. return context
  66. }