project-settings-context.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { createContext, FC, useContext, useMemo } from 'react'
  2. import useProjectWideSettings from '../hooks/use-project-wide-settings'
  3. import useUserWideSettings from '../hooks/use-user-wide-settings'
  4. import useProjectWideSettingsSocketListener from '../hooks/use-project-wide-settings-socket-listener'
  5. import type { ProjectSettings } from '../utils/api'
  6. import { UserSettings } from '../../../../../types/user-settings'
  7. type ProjectSettingsSetterContextValue = {
  8. setCompiler: (compiler: ProjectSettings['compiler']) => void
  9. setImageName: (imageName: ProjectSettings['imageName']) => void
  10. setRootDocId: (rootDocId: ProjectSettings['rootDocId']) => void
  11. setSpellCheckLanguage: (
  12. spellCheckLanguage: ProjectSettings['spellCheckLanguage']
  13. ) => void
  14. setAutoComplete: (autoComplete: UserSettings['autoComplete']) => void
  15. setAutoPairDelimiters: (
  16. autoPairDelimiters: UserSettings['autoPairDelimiters']
  17. ) => void
  18. setSyntaxValidation: (
  19. syntaxValidation: UserSettings['syntaxValidation']
  20. ) => void
  21. setMode: (mode: UserSettings['mode']) => void
  22. setEditorTheme: (editorTheme: UserSettings['editorTheme']) => void
  23. setOverallTheme: (overallTheme: UserSettings['overallTheme']) => void
  24. setFontSize: (fontSize: UserSettings['fontSize']) => void
  25. setFontFamily: (fontFamily: UserSettings['fontFamily']) => void
  26. setLineHeight: (lineHeight: UserSettings['lineHeight']) => void
  27. setPdfViewer: (pdfViewer: UserSettings['pdfViewer']) => void
  28. setMathPreview: (mathPreview: UserSettings['mathPreview']) => void
  29. }
  30. type ProjectSettingsContextValue = Partial<ProjectSettings> &
  31. Partial<UserSettings> &
  32. ProjectSettingsSetterContextValue
  33. export const ProjectSettingsContext = createContext<
  34. ProjectSettingsContextValue | undefined
  35. >(undefined)
  36. export const ProjectSettingsProvider: FC<React.PropsWithChildren> = ({
  37. children,
  38. }) => {
  39. const {
  40. compiler,
  41. setCompiler,
  42. imageName,
  43. setImageName,
  44. rootDocId,
  45. setRootDocId,
  46. spellCheckLanguage,
  47. setSpellCheckLanguage,
  48. } = useProjectWideSettings()
  49. const {
  50. autoComplete,
  51. setAutoComplete,
  52. autoPairDelimiters,
  53. setAutoPairDelimiters,
  54. syntaxValidation,
  55. setSyntaxValidation,
  56. editorTheme,
  57. setEditorTheme,
  58. overallTheme,
  59. setOverallTheme,
  60. mode,
  61. setMode,
  62. fontSize,
  63. setFontSize,
  64. fontFamily,
  65. setFontFamily,
  66. lineHeight,
  67. setLineHeight,
  68. pdfViewer,
  69. setPdfViewer,
  70. mathPreview,
  71. setMathPreview,
  72. } = useUserWideSettings()
  73. useProjectWideSettingsSocketListener()
  74. const value: ProjectSettingsContextValue = useMemo(
  75. () => ({
  76. compiler,
  77. setCompiler,
  78. imageName,
  79. setImageName,
  80. rootDocId,
  81. setRootDocId,
  82. spellCheckLanguage,
  83. setSpellCheckLanguage,
  84. autoComplete,
  85. setAutoComplete,
  86. autoPairDelimiters,
  87. setAutoPairDelimiters,
  88. syntaxValidation,
  89. setSyntaxValidation,
  90. editorTheme,
  91. setEditorTheme,
  92. overallTheme,
  93. setOverallTheme,
  94. mode,
  95. setMode,
  96. fontSize,
  97. setFontSize,
  98. fontFamily,
  99. setFontFamily,
  100. lineHeight,
  101. setLineHeight,
  102. pdfViewer,
  103. setPdfViewer,
  104. mathPreview,
  105. setMathPreview,
  106. }),
  107. [
  108. compiler,
  109. setCompiler,
  110. imageName,
  111. setImageName,
  112. rootDocId,
  113. setRootDocId,
  114. spellCheckLanguage,
  115. setSpellCheckLanguage,
  116. autoComplete,
  117. setAutoComplete,
  118. autoPairDelimiters,
  119. setAutoPairDelimiters,
  120. syntaxValidation,
  121. setSyntaxValidation,
  122. editorTheme,
  123. setEditorTheme,
  124. overallTheme,
  125. setOverallTheme,
  126. mode,
  127. setMode,
  128. fontSize,
  129. setFontSize,
  130. fontFamily,
  131. setFontFamily,
  132. lineHeight,
  133. setLineHeight,
  134. pdfViewer,
  135. setPdfViewer,
  136. mathPreview,
  137. setMathPreview,
  138. ]
  139. )
  140. return (
  141. <ProjectSettingsContext.Provider value={value}>
  142. {children}
  143. </ProjectSettingsContext.Provider>
  144. )
  145. }
  146. export function useProjectSettingsContext() {
  147. const context = useContext(ProjectSettingsContext)
  148. if (!context) {
  149. throw new Error(
  150. 'useProjectSettingsContext is only available inside ProjectSettingsProvider'
  151. )
  152. }
  153. return context
  154. }