project-settings-context.tsx 3.9 KB

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