project-settings-context.tsx 4.5 KB

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