editor-providers.jsx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // Disable prop type checks for test harnesses
  2. /* eslint-disable react/prop-types */
  3. import sinon from 'sinon'
  4. import { get, merge } from 'lodash'
  5. import { SplitTestProvider } from '@/shared/context/split-test-context'
  6. import { IdeAngularProvider } from '@/shared/context/ide-angular-provider'
  7. import { UserProvider } from '@/shared/context/user-context'
  8. import { ProjectProvider } from '@/shared/context/project-context'
  9. import { FileTreeDataProvider } from '@/shared/context/file-tree-data-context'
  10. import { EditorProvider } from '@/shared/context/editor-context'
  11. import { DetachProvider } from '@/shared/context/detach-context'
  12. import { LayoutProvider } from '@/shared/context/layout-context'
  13. import { LocalCompileProvider } from '@/shared/context/local-compile-context'
  14. import { DetachCompileProvider } from '@/shared/context/detach-compile-context'
  15. import { ProjectSettingsProvider } from '@/features/editor-left-menu/context/project-settings-context'
  16. import { FileTreePathProvider } from '@/features/file-tree/contexts/file-tree-path'
  17. import { UserSettingsProvider } from '@/shared/context/user-settings-context'
  18. import { OutlineProvider } from '@/features/ide-react/context/outline-context'
  19. import { SocketIOMock } from '@/ide/connection/SocketIoShim'
  20. // these constants can be imported in tests instead of
  21. // using magic strings
  22. export const PROJECT_ID = 'project123'
  23. export const PROJECT_NAME = 'project-name'
  24. export const USER_ID = '123abd'
  25. export const USER_EMAIL = 'testuser@example.com'
  26. const defaultUserSettings = {
  27. pdfViewer: 'pdfjs',
  28. fontSize: 12,
  29. fontFamily: 'monaco',
  30. lineHeight: 'normal',
  31. editorTheme: 'textmate',
  32. overallTheme: '',
  33. mode: 'default',
  34. autoComplete: true,
  35. autoPairDelimiters: true,
  36. trackChanges: true,
  37. syntaxValidation: false,
  38. }
  39. export function EditorProviders({
  40. user = { id: USER_ID, email: USER_EMAIL },
  41. projectId = PROJECT_ID,
  42. projectOwner = {
  43. _id: '124abd',
  44. email: 'owner@example.com',
  45. },
  46. rootDocId = '_root_doc_id',
  47. socket = new SocketIOMock(),
  48. isRestrictedTokenMember = false,
  49. clsiServerId = '1234',
  50. scope = {},
  51. features = {
  52. referencesSearch: true,
  53. },
  54. permissionsLevel = 'owner',
  55. children,
  56. rootFolder = [
  57. {
  58. _id: 'root-folder-id',
  59. name: 'rootFolder',
  60. docs: [],
  61. folders: [],
  62. fileRefs: [],
  63. },
  64. ],
  65. ui = { view: 'editor', pdfLayout: 'sideBySide', chatOpen: true },
  66. fileTreeManager = {
  67. findEntityById: () => null,
  68. findEntityByPath: () => null,
  69. getEntityPath: () => '',
  70. getRootDocDirname: () => '',
  71. getPreviewByPath: path => ({ url: path, extension: 'png' }),
  72. },
  73. editorManager = {
  74. getCurrentDocId: () => 'foo',
  75. getCurrentDocValue: () => {},
  76. openDoc: sinon.stub(),
  77. },
  78. metadataManager = {
  79. metadata: {
  80. state: {
  81. documents: {},
  82. },
  83. },
  84. },
  85. userSettings = {},
  86. providers = {},
  87. }) {
  88. window.user = user || window.user
  89. window.gitBridgePublicBaseUrl = 'https://git.overleaf.test'
  90. window.project_id = projectId != null ? projectId : window.project_id
  91. window.isRestrictedTokenMember = isRestrictedTokenMember
  92. window.metaAttributesCache.set(
  93. 'ol-userSettings',
  94. merge({}, defaultUserSettings, userSettings)
  95. )
  96. const $scope = merge(
  97. {
  98. user: window.user,
  99. project: {
  100. _id: window.project_id,
  101. name: PROJECT_NAME,
  102. owner: projectOwner,
  103. features,
  104. rootDoc_id: rootDocId,
  105. rootFolder,
  106. },
  107. ui,
  108. $watch: (path, callback) => {
  109. callback(get($scope, path))
  110. return () => null
  111. },
  112. $on: sinon.stub(),
  113. $applyAsync: sinon.stub(),
  114. permissionsLevel,
  115. },
  116. scope
  117. )
  118. window._ide = {
  119. $scope,
  120. socket,
  121. clsiServerId,
  122. editorManager,
  123. fileTreeManager,
  124. metadataManager,
  125. }
  126. // Add details for useUserContext
  127. window.metaAttributesCache.set('ol-user', { ...user, features })
  128. const Providers = {
  129. DetachCompileProvider,
  130. DetachProvider,
  131. EditorProvider,
  132. FileTreeDataProvider,
  133. FileTreePathProvider,
  134. IdeAngularProvider,
  135. LayoutProvider,
  136. LocalCompileProvider,
  137. OutlineProvider,
  138. ProjectProvider,
  139. ProjectSettingsProvider,
  140. SplitTestProvider,
  141. UserProvider,
  142. UserSettingsProvider,
  143. ...providers,
  144. }
  145. return (
  146. <Providers.SplitTestProvider>
  147. <Providers.IdeAngularProvider ide={window._ide}>
  148. <Providers.UserProvider>
  149. <Providers.UserSettingsProvider>
  150. <Providers.ProjectProvider>
  151. <Providers.FileTreeDataProvider>
  152. <Providers.FileTreePathProvider>
  153. <Providers.DetachProvider>
  154. <Providers.EditorProvider>
  155. <Providers.ProjectSettingsProvider>
  156. <Providers.LayoutProvider>
  157. <Providers.LocalCompileProvider>
  158. <Providers.DetachCompileProvider>
  159. <Providers.OutlineProvider>
  160. {children}
  161. </Providers.OutlineProvider>
  162. </Providers.DetachCompileProvider>
  163. </Providers.LocalCompileProvider>
  164. </Providers.LayoutProvider>
  165. </Providers.ProjectSettingsProvider>
  166. </Providers.EditorProvider>
  167. </Providers.DetachProvider>
  168. </Providers.FileTreePathProvider>
  169. </Providers.FileTreeDataProvider>
  170. </Providers.ProjectProvider>
  171. </Providers.UserSettingsProvider>
  172. </Providers.UserProvider>
  173. </Providers.IdeAngularProvider>
  174. </Providers.SplitTestProvider>
  175. )
  176. }