project-settings-context.tsx 6.0 KB

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