project-settings-context.tsx 6.2 KB

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