user-settings-context.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. darkModePdf: false,
  28. }
  29. type UserSettingsContextValue = {
  30. userSettings: UserSettings
  31. setUserSettings: Dispatch<
  32. SetStateAction<UserSettingsContextValue['userSettings']>
  33. >
  34. }
  35. export const UserSettingsContext = createContext<
  36. UserSettingsContextValue | undefined
  37. >(undefined)
  38. export const UserSettingsProvider: FC<React.PropsWithChildren> = ({
  39. children,
  40. }) => {
  41. const [userSettings, setUserSettings] = useState<UserSettings>(
  42. () => getMeta('ol-userSettings') || defaultSettings
  43. )
  44. const value = useMemo<UserSettingsContextValue>(
  45. () => ({
  46. userSettings,
  47. setUserSettings,
  48. }),
  49. [userSettings, setUserSettings]
  50. )
  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. }