project-settings-context.tsx 3.9 KB

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