react-context-root.tsx 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import React, { ElementType, FC, PropsWithChildren } from 'react'
  2. import { ChatProvider } from '@/features/chat/context/chat-context'
  3. import { ConnectionProvider } from './connection-context'
  4. import { DetachCompileProvider } from '@/shared/context/detach-compile-context'
  5. import { DetachProvider } from '@/shared/context/detach-context'
  6. import { EditorManagerProvider } from '@/features/ide-react/context/editor-manager-context'
  7. import { EditorOpenDocProvider } from '@/features/ide-react/context/editor-open-doc-context'
  8. import { EditorPropertiesProvider } from '@/features/ide-react/context/editor-properties-context'
  9. import { EditorProvider } from '@/shared/context/editor-context'
  10. import { EditorViewProvider } from '@/features/ide-react/context/editor-view-context'
  11. import { FileTreeDataProvider } from '@/shared/context/file-tree-data-context'
  12. import { FileTreeOpenProvider } from '@/features/ide-react/context/file-tree-open-context'
  13. import { FileTreePathProvider } from '@/features/file-tree/contexts/file-tree-path'
  14. import { IdeReactProvider } from '@/features/ide-react/context/ide-react-context'
  15. import { LayoutProvider } from '@/shared/context/layout-context'
  16. import { LocalCompileProvider } from '@/shared/context/local-compile-context'
  17. import { MetadataProvider } from '@/features/ide-react/context/metadata-context'
  18. import { ModalsContextProvider } from '@/features/ide-react/context/modals-context'
  19. import { OnlineUsersProvider } from '@/features/ide-react/context/online-users-context'
  20. import { OutlineProvider } from '@/features/ide-react/context/outline-context'
  21. import { PermissionsProvider } from '@/features/ide-react/context/permissions-context'
  22. import { ProjectProvider } from '@/shared/context/project-context'
  23. import { RailProvider } from '@/features/ide-redesign/contexts/rail-context'
  24. import { ProjectSettingsProvider } from '@/features/editor-left-menu/context/project-settings-context'
  25. import { ReferencesProvider } from '@/features/ide-react/context/references-context'
  26. import { SnapshotProvider } from '@/features/ide-react/context/snapshot-context'
  27. import { SplitTestProvider } from '@/shared/context/split-test-context'
  28. import { UserProvider } from '@/shared/context/user-context'
  29. import { UserFeaturesProvider } from '@/shared/context/user-features-context'
  30. import { UserSettingsProvider } from '@/shared/context/user-settings-context'
  31. import { CommandRegistryProvider } from './command-registry-context'
  32. import { NewEditorTourProvider } from '@/features/ide-redesign/contexts/new-editor-tour-context'
  33. import { EditorSelectionProvider } from '@/shared/context/editor-selection-context'
  34. import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
  35. const rootContextProviders = importOverleafModules('rootContextProviders') as {
  36. import: { default: ElementType }
  37. path: string
  38. }[]
  39. export const ReactContextRoot: FC<
  40. React.PropsWithChildren<{
  41. providers?: Record<string, FC<PropsWithChildren>>
  42. }>
  43. > = ({ children, providers = {} }) => {
  44. const Providers = {
  45. ChatProvider,
  46. ConnectionProvider,
  47. DetachCompileProvider,
  48. DetachProvider,
  49. EditorManagerProvider,
  50. EditorOpenDocProvider,
  51. EditorPropertiesProvider,
  52. EditorProvider,
  53. EditorViewProvider,
  54. FileTreeDataProvider,
  55. FileTreeOpenProvider,
  56. FileTreePathProvider,
  57. IdeReactProvider,
  58. LayoutProvider,
  59. LocalCompileProvider,
  60. MetadataProvider,
  61. ModalsContextProvider,
  62. OnlineUsersProvider,
  63. OutlineProvider,
  64. PermissionsProvider,
  65. ProjectProvider,
  66. ProjectSettingsProvider,
  67. RailProvider,
  68. ReferencesProvider,
  69. SnapshotProvider,
  70. SplitTestProvider,
  71. UserProvider,
  72. UserSettingsProvider,
  73. CommandRegistryProvider,
  74. UserFeaturesProvider,
  75. NewEditorTourProvider,
  76. EditorSelectionProvider,
  77. ...providers,
  78. }
  79. // Extract dynamic providers from modules
  80. const dynamicProviders = rootContextProviders.map(
  81. module => module.import.default
  82. )
  83. // Wrap children with all dynamic providers from outside to inside
  84. const childrenWrappedWithDynamicProviders =
  85. dynamicProviders.reduceRight<React.ReactElement>(
  86. (acc, Provider) => <Provider>{acc}</Provider>,
  87. <>{children}</>
  88. )
  89. return (
  90. <Providers.SplitTestProvider>
  91. <Providers.ModalsContextProvider>
  92. <Providers.ConnectionProvider>
  93. <Providers.ProjectProvider>
  94. <Providers.UserSettingsProvider>
  95. <Providers.IdeReactProvider>
  96. <Providers.UserProvider>
  97. <Providers.SnapshotProvider>
  98. <Providers.DetachProvider>
  99. <Providers.EditorPropertiesProvider>
  100. <Providers.EditorViewProvider>
  101. <Providers.EditorOpenDocProvider>
  102. <Providers.EditorProvider>
  103. <Providers.FileTreeDataProvider>
  104. <Providers.FileTreePathProvider>
  105. <Providers.UserFeaturesProvider>
  106. <Providers.PermissionsProvider>
  107. <Providers.RailProvider>
  108. <Providers.LayoutProvider>
  109. <Providers.NewEditorTourProvider>
  110. <Providers.ProjectSettingsProvider>
  111. <Providers.EditorManagerProvider>
  112. <Providers.ReferencesProvider>
  113. <Providers.LocalCompileProvider>
  114. <Providers.DetachCompileProvider>
  115. <Providers.ChatProvider>
  116. <Providers.FileTreeOpenProvider>
  117. <Providers.OnlineUsersProvider>
  118. <Providers.MetadataProvider>
  119. <Providers.OutlineProvider>
  120. <Providers.CommandRegistryProvider>
  121. <Providers.EditorSelectionProvider>
  122. {
  123. childrenWrappedWithDynamicProviders
  124. }
  125. </Providers.EditorSelectionProvider>
  126. </Providers.CommandRegistryProvider>
  127. </Providers.OutlineProvider>
  128. </Providers.MetadataProvider>
  129. </Providers.OnlineUsersProvider>
  130. </Providers.FileTreeOpenProvider>
  131. </Providers.ChatProvider>
  132. </Providers.DetachCompileProvider>
  133. </Providers.LocalCompileProvider>
  134. </Providers.ReferencesProvider>
  135. </Providers.EditorManagerProvider>
  136. </Providers.ProjectSettingsProvider>
  137. </Providers.NewEditorTourProvider>
  138. </Providers.LayoutProvider>
  139. </Providers.RailProvider>
  140. </Providers.PermissionsProvider>
  141. </Providers.UserFeaturesProvider>
  142. </Providers.FileTreePathProvider>
  143. </Providers.FileTreeDataProvider>
  144. </Providers.EditorProvider>
  145. </Providers.EditorOpenDocProvider>
  146. </Providers.EditorViewProvider>
  147. </Providers.EditorPropertiesProvider>
  148. </Providers.DetachProvider>
  149. </Providers.SnapshotProvider>
  150. </Providers.UserProvider>
  151. </Providers.IdeReactProvider>
  152. </Providers.UserSettingsProvider>
  153. </Providers.ProjectProvider>
  154. </Providers.ConnectionProvider>
  155. </Providers.ModalsContextProvider>
  156. </Providers.SplitTestProvider>
  157. )
  158. }