file-tree.stories.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import MockedSocket from 'socket.io-mock'
  2. import { ContextRoot } from '../js/shared/context/root-context'
  3. import { rootFolderBase } from './fixtures/file-tree-base'
  4. import { rootFolderLimit } from './fixtures/file-tree-limit'
  5. import FileTreeRoot from '../js/features/file-tree/components/file-tree-root'
  6. import FileTreeError from '../js/features/file-tree/components/file-tree-error'
  7. import useFetchMock from './hooks/use-fetch-mock'
  8. const MOCK_DELAY = 2000
  9. window._ide = {
  10. socket: new MockedSocket(),
  11. }
  12. function defaultSetupMocks(fetchMock) {
  13. fetchMock
  14. .post(
  15. /\/project\/\w+\/(file|doc|folder)\/\w+\/rename/,
  16. (path, req) => {
  17. const body = JSON.parse(req.body)
  18. const entityId = path.match(/([^/]+)\/rename$/)[1]
  19. window._ide.socket.socketClient.emit(
  20. 'reciveEntityRename',
  21. entityId,
  22. body.name
  23. )
  24. return 204
  25. },
  26. {
  27. delay: MOCK_DELAY,
  28. }
  29. )
  30. .post(
  31. /\/project\/\w+\/folder/,
  32. (_path, req) => {
  33. const body = JSON.parse(req.body)
  34. const newFolder = {
  35. folders: [],
  36. fileRefs: [],
  37. docs: [],
  38. _id: Math.random().toString(16).replace(/0\./, 'random-test-id-'),
  39. name: body.name,
  40. }
  41. window._ide.socket.socketClient.emit(
  42. 'reciveNewFolder',
  43. body.parent_folder_id,
  44. newFolder
  45. )
  46. return newFolder
  47. },
  48. {
  49. delay: MOCK_DELAY,
  50. }
  51. )
  52. .delete(
  53. /\/project\/\w+\/(file|doc|folder)\/\w+/,
  54. path => {
  55. const entityId = path.match(/[^/]+$/)[0]
  56. window._ide.socket.socketClient.emit('removeEntity', entityId)
  57. return 204
  58. },
  59. {
  60. delay: MOCK_DELAY,
  61. }
  62. )
  63. .post(/\/project\/\w+\/(file|doc|folder)\/\w+\/move/, (path, req) => {
  64. const body = JSON.parse(req.body)
  65. const entityId = path.match(/([^/]+)\/move/)[1]
  66. window._ide.socket.socketClient.emit(
  67. 'reciveEntityMove',
  68. entityId,
  69. body.folder_id
  70. )
  71. return 204
  72. })
  73. }
  74. export const FullTree = args => {
  75. useFetchMock(defaultSetupMocks)
  76. return <FileTreeRoot {...args} />
  77. }
  78. export const ReadOnly = args => <FileTreeRoot {...args} />
  79. ReadOnly.args = { hasWritePermissions: false }
  80. export const Disconnected = args => <FileTreeRoot {...args} />
  81. Disconnected.args = { isConnected: false }
  82. export const NetworkErrors = args => {
  83. useFetchMock(fetchMock => {
  84. fetchMock
  85. .post(/\/project\/\w+\/folder/, 500, {
  86. delay: MOCK_DELAY,
  87. })
  88. .post(/\/project\/\w+\/(file|doc|folder)\/\w+\/rename/, 500, {
  89. delay: MOCK_DELAY,
  90. })
  91. .post(/\/project\/\w+\/(file|doc|folder)\/\w+\/move/, 500, {
  92. delay: MOCK_DELAY,
  93. })
  94. .delete(/\/project\/\w+\/(file|doc|folder)\/\w+/, 500, {
  95. delay: MOCK_DELAY,
  96. })
  97. })
  98. return <FileTreeRoot {...args} />
  99. }
  100. export const FallbackError = args => <FileTreeError {...args} />
  101. export const FilesLimit = args => {
  102. useFetchMock(defaultSetupMocks)
  103. return <FileTreeRoot {...args} />
  104. }
  105. FilesLimit.args = { rootFolder: rootFolderLimit }
  106. export default {
  107. title: 'File Tree',
  108. component: FileTreeRoot,
  109. args: {
  110. rootFolder: rootFolderBase,
  111. hasWritePermissions: true,
  112. setStartedFreeTrial: () => {
  113. console.log('started free trial')
  114. },
  115. refProviders: {},
  116. reindexReferences: () => {
  117. console.log('reindex references')
  118. },
  119. userHasFeature: () => true,
  120. setRefProviderEnabled: provider => {
  121. console.log(`ref provider ${provider} enabled`)
  122. },
  123. projectId: '123abc',
  124. rootDocId: '5e74f1a7ce17ae0041dfd056',
  125. isConnected: true,
  126. },
  127. argTypes: {
  128. onInit: { action: 'onInit' },
  129. onSelect: { action: 'onSelect' },
  130. },
  131. decorators: [
  132. Story => (
  133. <>
  134. <style>{'html, body, .file-tree { height: 100%; width: 100%; }'}</style>
  135. <div className="editor-sidebar full-size">
  136. <div className="file-tree">
  137. <ContextRoot ide={window._ide} settings={{}}>
  138. <Story />
  139. </ContextRoot>
  140. </div>
  141. </div>
  142. </>
  143. ),
  144. ],
  145. }