user-settings-context.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. editorDarkTheme: 'overleaf_dark',
  19. editorLightTheme: 'textmate',
  20. overallTheme: '',
  21. mode: 'default',
  22. fontSize: 12,
  23. fontFamily: 'monaco',
  24. lineHeight: 'normal',
  25. mathPreview: true,
  26. referencesSearchMode: 'advanced',
  27. enableNewEditor: true,
  28. enableNewEditorLegacy: true,
  29. breadcrumbs: true,
  30. darkModePdf: false,
  31. }
  32. type UserSettingsContextValue = {
  33. userSettings: UserSettings
  34. setUserSettings: Dispatch<
  35. SetStateAction<UserSettingsContextValue['userSettings']>
  36. >
  37. }
  38. export const UserSettingsContext = createContext<
  39. UserSettingsContextValue | undefined
  40. >(undefined)
  41. export const UserSettingsProvider: FC<React.PropsWithChildren> = ({
  42. children,
  43. }) => {
  44. const [userSettings, setUserSettings] = useState<UserSettings>(
  45. () => getMeta('ol-userSettings') || defaultSettings
  46. )
  47. const value = useMemo<UserSettingsContextValue>(
  48. () => ({
  49. userSettings,
  50. setUserSettings,
  51. }),
  52. [userSettings, setUserSettings]
  53. )
  54. return (
  55. <UserSettingsContext.Provider value={value}>
  56. {children}
  57. </UserSettingsContext.Provider>
  58. )
  59. }
  60. export function useUserSettingsContext() {
  61. const context = useContext(UserSettingsContext)
  62. if (!context) {
  63. throw new Error(
  64. 'useUserSettingsContext is only available inside UserSettingsProvider'
  65. )
  66. }
  67. return context
  68. }