user-settings-context.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import {
  2. createContext,
  3. useContext,
  4. useMemo,
  5. Dispatch,
  6. SetStateAction,
  7. FC,
  8. useState,
  9. useEffect,
  10. } from 'react'
  11. import { UserSettings } from '../../../../types/user-settings'
  12. import getMeta from '@/utils/meta'
  13. import { userStyles } from '../utils/styles'
  14. import { canUseNewEditor } from '@/features/ide-redesign/utils/new-editor-utils'
  15. import { useIdeContext } from '@/shared/context/ide-context'
  16. const defaultSettings: UserSettings = {
  17. pdfViewer: 'pdfjs',
  18. autoComplete: true,
  19. autoPairDelimiters: true,
  20. syntaxValidation: false,
  21. editorTheme: 'textmate',
  22. overallTheme: '',
  23. mode: 'default',
  24. fontSize: 12,
  25. fontFamily: 'monaco',
  26. lineHeight: 'normal',
  27. mathPreview: true,
  28. referencesSearchMode: 'advanced',
  29. enableNewEditor: true,
  30. breadcrumbs: true,
  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. // update the global scope 'settings' value, for extensions
  48. const { unstableStore } = useIdeContext()
  49. useEffect(() => {
  50. const { fontFamily, lineHeight } = userStyles(userSettings)
  51. unstableStore.set('settings', {
  52. overallTheme: userSettings.overallTheme === 'light-' ? 'light' : 'dark',
  53. keybindings: userSettings.mode === 'none' ? 'default' : userSettings.mode,
  54. fontFamily,
  55. lineHeight,
  56. fontSize: userSettings.fontSize,
  57. isNewEditor: canUseNewEditor() && userSettings.enableNewEditor,
  58. })
  59. }, [unstableStore, userSettings])
  60. const value = useMemo<UserSettingsContextValue>(
  61. () => ({
  62. userSettings,
  63. setUserSettings,
  64. }),
  65. [userSettings, setUserSettings]
  66. )
  67. return (
  68. <UserSettingsContext.Provider value={value}>
  69. {children}
  70. </UserSettingsContext.Provider>
  71. )
  72. }
  73. export function useUserSettingsContext() {
  74. const context = useContext(UserSettingsContext)
  75. if (!context) {
  76. throw new Error(
  77. 'useUserSettingsContext is only available inside UserSettingsProvider'
  78. )
  79. }
  80. return context
  81. }