project-settings-context.tsx 5.4 KB

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