project-settings-context.tsx 4.1 KB

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