project-settings-context.tsx 5.0 KB

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