project-settings-context.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import { createContext, useContext, useMemo } from 'react'
  2. import type { PropsWithChildren } from 'react'
  3. import useProjectWideSettings from '../hooks/use-project-wide-settings'
  4. import useUserWideSettings from '../hooks/use-user-wide-settings'
  5. import useProjectWideSettingsSocketListener from '../hooks/use-project-wide-settings-socket-listener'
  6. import type { ProjectSettings, UserSettings } from '../utils/api'
  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 function ProjectSettingsProvider({
  36. children,
  37. }: PropsWithChildren<Record<string, never>>) {
  38. const {
  39. compiler,
  40. setCompiler,
  41. imageName,
  42. setImageName,
  43. rootDocId,
  44. setRootDocId,
  45. spellCheckLanguage,
  46. setSpellCheckLanguage,
  47. } = useProjectWideSettings()
  48. const {
  49. autoComplete,
  50. setAutoComplete,
  51. autoPairDelimiters,
  52. setAutoPairDelimiters,
  53. syntaxValidation,
  54. setSyntaxValidation,
  55. editorTheme,
  56. setEditorTheme,
  57. overallTheme,
  58. setOverallTheme,
  59. mode,
  60. setMode,
  61. fontSize,
  62. setFontSize,
  63. fontFamily,
  64. setFontFamily,
  65. lineHeight,
  66. setLineHeight,
  67. pdfViewer,
  68. setPdfViewer,
  69. } = useUserWideSettings()
  70. useProjectWideSettingsSocketListener()
  71. const value: ProjectSettingsContextValue = useMemo(
  72. () => ({
  73. compiler,
  74. setCompiler,
  75. imageName,
  76. setImageName,
  77. rootDocId,
  78. setRootDocId,
  79. spellCheckLanguage,
  80. setSpellCheckLanguage,
  81. autoComplete,
  82. setAutoComplete,
  83. autoPairDelimiters,
  84. setAutoPairDelimiters,
  85. syntaxValidation,
  86. setSyntaxValidation,
  87. editorTheme,
  88. setEditorTheme,
  89. overallTheme,
  90. setOverallTheme,
  91. mode,
  92. setMode,
  93. fontSize,
  94. setFontSize,
  95. fontFamily,
  96. setFontFamily,
  97. lineHeight,
  98. setLineHeight,
  99. pdfViewer,
  100. setPdfViewer,
  101. }),
  102. [
  103. compiler,
  104. setCompiler,
  105. imageName,
  106. setImageName,
  107. rootDocId,
  108. setRootDocId,
  109. spellCheckLanguage,
  110. setSpellCheckLanguage,
  111. autoComplete,
  112. setAutoComplete,
  113. autoPairDelimiters,
  114. setAutoPairDelimiters,
  115. syntaxValidation,
  116. setSyntaxValidation,
  117. editorTheme,
  118. setEditorTheme,
  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. ]
  132. )
  133. return (
  134. <ProjectSettingsContext.Provider value={value}>
  135. {children}
  136. </ProjectSettingsContext.Provider>
  137. )
  138. }
  139. export function useProjectSettingsContext() {
  140. const context = useContext(ProjectSettingsContext)
  141. if (!context) {
  142. throw new Error(
  143. 'useProjectSettingsContext is only available inside ProjectSettingsProvider'
  144. )
  145. }
  146. return context
  147. }