file-tree.stories.js 4.0 KB

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