project-settings-context.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  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']) => Promise<void>
  9. setImageName: (imageName: ProjectSettings['imageName']) => Promise<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. setPreviewTabs: (previewTabs: UserSettings['previewTabs']) => void
  22. setMode: (mode: UserSettings['mode']) => void
  23. setEditorTheme: (editorTheme: UserSettings['editorTheme']) => void
  24. setEditorLightTheme: (
  25. editorLightTheme: UserSettings['editorLightTheme']
  26. ) => void
  27. setEditorDarkTheme: (editorDarkTheme: UserSettings['editorDarkTheme']) => void
  28. setOverallTheme: (overallTheme: UserSettings['overallTheme']) => void
  29. setFontSize: (fontSize: UserSettings['fontSize']) => void
  30. setFontFamily: (fontFamily: UserSettings['fontFamily']) => void
  31. setLineHeight: (lineHeight: UserSettings['lineHeight']) => void
  32. setPdfViewer: (pdfViewer: UserSettings['pdfViewer']) => void
  33. setMathPreview: (mathPreview: UserSettings['mathPreview']) => void
  34. setBreadcrumbs: (breadcrumbs: UserSettings['breadcrumbs']) => void
  35. setNonBlinkingCursor: (
  36. nonBlinkingCursor: UserSettings['nonBlinkingCursor']
  37. ) => void
  38. setDarkModePdf: (darkModePdf: UserSettings['darkModePdf']) => void
  39. setZotero: (zotero: UserSettings['zotero']) => void
  40. setMendeley: (mendeley: UserSettings['mendeley']) => void
  41. setPapers: (papers: UserSettings['papers']) => void
  42. }
  43. type ProjectSettingsContextValue = Partial<ProjectSettings> &
  44. Partial<UserSettings> &
  45. ProjectSettingsSetterContextValue
  46. export const ProjectSettingsContext = createContext<
  47. ProjectSettingsContextValue | undefined
  48. >(undefined)
  49. export const ProjectSettingsProvider: FC<React.PropsWithChildren> = ({
  50. children,
  51. }) => {
  52. const {
  53. compiler,
  54. setCompiler,
  55. imageName,
  56. setImageName,
  57. rootDocId,
  58. setRootDocId,
  59. spellCheckLanguage,
  60. setSpellCheckLanguage,
  61. } = useProjectWideSettings()
  62. const {
  63. autoComplete,
  64. setAutoComplete,
  65. autoPairDelimiters,
  66. setAutoPairDelimiters,
  67. syntaxValidation,
  68. setSyntaxValidation,
  69. previewTabs,
  70. setPreviewTabs,
  71. editorTheme,
  72. setEditorTheme,
  73. editorLightTheme,
  74. setEditorLightTheme,
  75. editorDarkTheme,
  76. setEditorDarkTheme,
  77. overallTheme,
  78. setOverallTheme,
  79. mode,
  80. setMode,
  81. fontSize,
  82. setFontSize,
  83. fontFamily,
  84. setFontFamily,
  85. lineHeight,
  86. setLineHeight,
  87. pdfViewer,
  88. setPdfViewer,
  89. mathPreview,
  90. setMathPreview,
  91. breadcrumbs,
  92. setBreadcrumbs,
  93. nonBlinkingCursor,
  94. setNonBlinkingCursor,
  95. darkModePdf,
  96. setDarkModePdf,
  97. zotero,
  98. setZotero,
  99. mendeley,
  100. setMendeley,
  101. papers,
  102. setPapers,
  103. } = useUserWideSettings()
  104. useProjectWideSettingsSocketListener()
  105. const value: ProjectSettingsContextValue = useMemo(
  106. () => ({
  107. compiler,
  108. setCompiler,
  109. imageName,
  110. setImageName,
  111. rootDocId,
  112. setRootDocId,
  113. spellCheckLanguage,
  114. setSpellCheckLanguage,
  115. autoComplete,
  116. setAutoComplete,
  117. autoPairDelimiters,
  118. setAutoPairDelimiters,
  119. syntaxValidation,
  120. setSyntaxValidation,
  121. previewTabs,
  122. setPreviewTabs,
  123. editorTheme,
  124. setEditorTheme,
  125. editorLightTheme,
  126. setEditorLightTheme,
  127. editorDarkTheme,
  128. setEditorDarkTheme,
  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. nonBlinkingCursor,
  146. setNonBlinkingCursor,
  147. darkModePdf,
  148. setDarkModePdf,
  149. zotero,
  150. setZotero,
  151. mendeley,
  152. setMendeley,
  153. papers,
  154. setPapers,
  155. }),
  156. [
  157. compiler,
  158. setCompiler,
  159. imageName,
  160. setImageName,
  161. rootDocId,
  162. setRootDocId,
  163. spellCheckLanguage,
  164. setSpellCheckLanguage,
  165. autoComplete,
  166. setAutoComplete,
  167. autoPairDelimiters,
  168. setAutoPairDelimiters,
  169. syntaxValidation,
  170. setSyntaxValidation,
  171. previewTabs,
  172. setPreviewTabs,
  173. editorTheme,
  174. setEditorTheme,
  175. editorLightTheme,
  176. setEditorLightTheme,
  177. editorDarkTheme,
  178. setEditorDarkTheme,
  179. overallTheme,
  180. setOverallTheme,
  181. mode,
  182. setMode,
  183. fontSize,
  184. setFontSize,
  185. fontFamily,
  186. setFontFamily,
  187. lineHeight,
  188. setLineHeight,
  189. pdfViewer,
  190. setPdfViewer,
  191. mathPreview,
  192. setMathPreview,
  193. breadcrumbs,
  194. setBreadcrumbs,
  195. nonBlinkingCursor,
  196. setNonBlinkingCursor,
  197. darkModePdf,
  198. setDarkModePdf,
  199. zotero,
  200. setZotero,
  201. mendeley,
  202. setMendeley,
  203. papers,
  204. setPapers,
  205. ]
  206. )
  207. return (
  208. <ProjectSettingsContext.Provider value={value}>
  209. {children}
  210. </ProjectSettingsContext.Provider>
  211. )
  212. }
  213. export function useProjectSettingsContext() {
  214. const context = useContext(ProjectSettingsContext)
  215. if (!context) {
  216. throw new Error(
  217. 'useProjectSettingsContext is only available inside ProjectSettingsProvider'
  218. )
  219. }
  220. return context
  221. }