editor-providers.jsx 5.6 KB

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