project-settings-context.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. setBreadcrumbs: (breadcrumbs: UserSettings['breadcrumbs']) => void
  30. }
  31. type ProjectSettingsContextValue = Partial<ProjectSettings> &
  32. Partial<UserSettings> &
  33. ProjectSettingsSetterContextValue
  34. export const ProjectSettingsContext = createContext<
  35. ProjectSettingsContextValue | undefined
  36. >(undefined)
  37. export const ProjectSettingsProvider: FC<React.PropsWithChildren> = ({
  38. children,
  39. }) => {
  40. const {
  41. compiler,
  42. setCompiler,
  43. imageName,
  44. setImageName,
  45. rootDocId,
  46. setRootDocId,
  47. spellCheckLanguage,
  48. setSpellCheckLanguage,
  49. } = useProjectWideSettings()
  50. const {
  51. autoComplete,
  52. setAutoComplete,
  53. autoPairDelimiters,
  54. setAutoPairDelimiters,
  55. syntaxValidation,
  56. setSyntaxValidation,
  57. editorTheme,
  58. setEditorTheme,
  59. overallTheme,
  60. setOverallTheme,
  61. mode,
  62. setMode,
  63. fontSize,
  64. setFontSize,
  65. fontFamily,
  66. setFontFamily,
  67. lineHeight,
  68. setLineHeight,
  69. pdfViewer,
  70. setPdfViewer,
  71. mathPreview,
  72. setMathPreview,
  73. breadcrumbs,
  74. setBreadcrumbs,
  75. } = useUserWideSettings()
  76. useProjectWideSettingsSocketListener()
  77. const value: ProjectSettingsContextValue = useMemo(
  78. () => ({
  79. compiler,
  80. setCompiler,
  81. imageName,
  82. setImageName,
  83. rootDocId,
  84. setRootDocId,
  85. spellCheckLanguage,
  86. setSpellCheckLanguage,
  87. autoComplete,
  88. setAutoComplete,
  89. autoPairDelimiters,
  90. setAutoPairDelimiters,
  91. syntaxValidation,
  92. setSyntaxValidation,
  93. editorTheme,
  94. setEditorTheme,
  95. overallTheme,
  96. setOverallTheme,
  97. mode,
  98. setMode,
  99. fontSize,
  100. setFontSize,
  101. fontFamily,
  102. setFontFamily,
  103. lineHeight,
  104. setLineHeight,
  105. pdfViewer,
  106. setPdfViewer,
  107. mathPreview,
  108. setMathPreview,
  109. breadcrumbs,
  110. setBreadcrumbs,
  111. }),
  112. [
  113. compiler,
  114. setCompiler,
  115. imageName,
  116. setImageName,
  117. rootDocId,
  118. setRootDocId,
  119. spellCheckLanguage,
  120. setSpellCheckLanguage,
  121. autoComplete,
  122. setAutoComplete,
  123. autoPairDelimiters,
  124. setAutoPairDelimiters,
  125. syntaxValidation,
  126. setSyntaxValidation,
  127. editorTheme,
  128. setEditorTheme,
  129. overallTheme,
  130. setOverallTheme,
  131. mode,
  132. setMode,
  133. fontSize,
  134. setFontSize,
  135. fontFamily,
  136. setFontFamily,
  137. lineHeight,
  138. setLineHeight,
  139. pdfViewer,
  140. setPdfViewer,
  141. mathPreview,
  142. setMathPreview,
  143. breadcrumbs,
  144. setBreadcrumbs,
  145. ]
  146. )
  147. return (
  148. <ProjectSettingsContext.Provider value={value}>
  149. {children}
  150. </ProjectSettingsContext.Provider>
  151. )
  152. }
  153. export function useProjectSettingsContext() {
  154. const context = useContext(ProjectSettingsContext)
  155. if (!context) {
  156. throw new Error(
  157. 'useProjectSettingsContext is only available inside ProjectSettingsProvider'
  158. )
  159. }
  160. return context
  161. }