user-settings-context.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. export const defaultSettings: UserSettings = {
  13. pdfViewer: 'pdfjs',
  14. autoComplete: true,
  15. autoPairDelimiters: true,
  16. syntaxValidation: false,
  17. previewTabs: false,
  18. editorTheme: 'textmate',
  19. editorDarkTheme: 'overleaf_dark',
  20. editorLightTheme: 'textmate',
  21. overallTheme: '',
  22. mode: 'default',
  23. fontSize: 12,
  24. fontFamily: 'monaco',
  25. lineHeight: 'normal',
  26. mathPreview: true,
  27. editorTabs: true,
  28. referencesSearchMode: 'advanced',
  29. breadcrumbs: true,
  30. nonBlinkingCursor: false,
  31. darkModePdf: false,
  32. floatingMenu: true,
  33. zotero: {
  34. enabled: true,
  35. groups: [],
  36. disablePersonalLibrary: false,
  37. },
  38. mendeley: {
  39. enabled: true,
  40. groups: [],
  41. disablePersonalLibrary: false,
  42. },
  43. papers: {
  44. enabled: true,
  45. groups: [],
  46. disablePersonalLibrary: false,
  47. },
  48. }
  49. type UserSettingsContextValue = {
  50. userSettings: UserSettings
  51. setUserSettings: Dispatch<
  52. SetStateAction<UserSettingsContextValue['userSettings']>
  53. >
  54. }
  55. export const UserSettingsContext = createContext<
  56. UserSettingsContextValue | undefined
  57. >(undefined)
  58. export const UserSettingsProvider: FC<React.PropsWithChildren> = ({
  59. children,
  60. }) => {
  61. const [userSettings, setUserSettings] = useState<UserSettings>(
  62. () => getMeta('ol-userSettings') || defaultSettings
  63. )
  64. const value = useMemo<UserSettingsContextValue>(
  65. () => ({
  66. userSettings,
  67. setUserSettings,
  68. }),
  69. [userSettings, setUserSettings]
  70. )
  71. return (
  72. <UserSettingsContext.Provider value={value}>
  73. {children}
  74. </UserSettingsContext.Provider>
  75. )
  76. }
  77. export function useUserSettingsContext() {
  78. const context = useContext(UserSettingsContext)
  79. if (!context) {
  80. throw new Error(
  81. 'useUserSettingsContext is only available inside UserSettingsProvider'
  82. )
  83. }
  84. return context
  85. }