share-project-modal.stories.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. import { useEffect } from 'react'
  2. import ShareProjectModal from '../js/features/share-project-modal/components/share-project-modal'
  3. import useFetchMock from './hooks/use-fetch-mock'
  4. import { withContextRoot } from './utils/with-context-root'
  5. export const LinkSharingOff = args => {
  6. useFetchMock(setupFetchMock)
  7. const project = {
  8. ...args.project,
  9. publicAccesLevel: 'private',
  10. }
  11. return withContextRoot(<ShareProjectModal {...args} />, { project })
  12. }
  13. export const LinkSharingOn = args => {
  14. useFetchMock(setupFetchMock)
  15. const project = {
  16. ...args.project,
  17. publicAccesLevel: 'tokenBased',
  18. }
  19. return withContextRoot(<ShareProjectModal {...args} />, { project })
  20. }
  21. export const LinkSharingLoading = args => {
  22. useFetchMock(setupFetchMock)
  23. const project = {
  24. ...args.project,
  25. publicAccesLevel: 'tokenBased',
  26. tokens: undefined,
  27. }
  28. return withContextRoot(<ShareProjectModal {...args} />, { project })
  29. }
  30. export const NonAdminLinkSharingOff = args => {
  31. const project = {
  32. ...args.project,
  33. publicAccesLevel: 'private',
  34. }
  35. return withContextRoot(<ShareProjectModal {...args} isAdmin={false} />, {
  36. project,
  37. })
  38. }
  39. export const NonAdminLinkSharingOn = args => {
  40. const project = {
  41. ...args.project,
  42. publicAccesLevel: 'tokenBased',
  43. }
  44. return withContextRoot(<ShareProjectModal {...args} isAdmin={false} />, {
  45. project,
  46. })
  47. }
  48. export const RestrictedTokenMember = args => {
  49. // Override isRestrictedTokenMember to be true, then revert it back to the
  50. // original value on unmount
  51. // Currently this is necessary because the context value is set from window,
  52. // however in the future we should change this to set via props
  53. const originalIsRestrictedTokenMember = window.isRestrictedTokenMember
  54. window.isRestrictedTokenMember = true
  55. useEffect(() => {
  56. return () => {
  57. window.isRestrictedTokenMember = originalIsRestrictedTokenMember
  58. }
  59. })
  60. const project = {
  61. ...args.project,
  62. publicAccesLevel: 'tokenBased',
  63. }
  64. return withContextRoot(<ShareProjectModal {...args} />, { project })
  65. }
  66. export const LegacyLinkSharingReadAndWrite = args => {
  67. useFetchMock(setupFetchMock)
  68. const project = {
  69. ...args.project,
  70. publicAccesLevel: 'readAndWrite',
  71. }
  72. return withContextRoot(<ShareProjectModal {...args} />, { project })
  73. }
  74. export const LegacyLinkSharingReadOnly = args => {
  75. useFetchMock(setupFetchMock)
  76. const project = {
  77. ...args.project,
  78. publicAccesLevel: 'readOnly',
  79. }
  80. return withContextRoot(<ShareProjectModal {...args} />, { project })
  81. }
  82. export const LimitedCollaborators = args => {
  83. useFetchMock(setupFetchMock)
  84. const project = {
  85. ...args.project,
  86. features: {
  87. ...args.project.features,
  88. collaborators: 3,
  89. },
  90. }
  91. return withContextRoot(<ShareProjectModal {...args} />, { project })
  92. }
  93. const project = {
  94. _id: 'a-project',
  95. name: 'A Project',
  96. features: {
  97. collaborators: -1, // unlimited
  98. },
  99. publicAccesLevel: 'private',
  100. tokens: {
  101. readOnly: 'ro-token',
  102. readAndWrite: 'rw-token',
  103. },
  104. owner: {
  105. email: 'stories@overleaf.com',
  106. },
  107. members: [
  108. {
  109. _id: 'viewer-member',
  110. type: 'user',
  111. privileges: 'readOnly',
  112. name: 'Viewer User',
  113. email: 'viewer@example.com',
  114. },
  115. {
  116. _id: 'author-member',
  117. type: 'user',
  118. privileges: 'readAndWrite',
  119. name: 'Author User',
  120. email: 'author@example.com',
  121. },
  122. ],
  123. invites: [
  124. {
  125. _id: 'test-invite-1',
  126. privileges: 'readOnly',
  127. name: 'Invited Viewer',
  128. email: 'invited-viewer@example.com',
  129. },
  130. {
  131. _id: 'test-invite-2',
  132. privileges: 'readAndWrite',
  133. name: 'Invited Author',
  134. email: 'invited-author@example.com',
  135. },
  136. ],
  137. }
  138. export default {
  139. title: 'Modals / Share Project',
  140. component: ShareProjectModal,
  141. args: {
  142. show: true,
  143. animation: false,
  144. isAdmin: true,
  145. user: {},
  146. project,
  147. },
  148. argTypes: {
  149. handleHide: { action: 'hide' },
  150. },
  151. }
  152. const contacts = [
  153. // user with edited name
  154. {
  155. type: 'user',
  156. email: 'test-user@example.com',
  157. first_name: 'Test',
  158. last_name: 'User',
  159. name: 'Test User',
  160. },
  161. // user with default name (email prefix)
  162. {
  163. type: 'user',
  164. email: 'test@example.com',
  165. first_name: 'test',
  166. },
  167. // no last name
  168. {
  169. type: 'user',
  170. first_name: 'Eratosthenes',
  171. email: 'eratosthenes@example.com',
  172. },
  173. // more users
  174. {
  175. type: 'user',
  176. first_name: 'Claudius',
  177. last_name: 'Ptolemy',
  178. email: 'ptolemy@example.com',
  179. },
  180. {
  181. type: 'user',
  182. first_name: 'Abd al-Rahman',
  183. last_name: 'Al-Sufi',
  184. email: 'al-sufi@example.com',
  185. },
  186. {
  187. type: 'user',
  188. first_name: 'Nicolaus',
  189. last_name: 'Copernicus',
  190. email: 'copernicus@example.com',
  191. },
  192. ]
  193. function setupFetchMock(fetchMock) {
  194. const delay = 1000
  195. fetchMock
  196. // list contacts
  197. .get('express:/user/contacts', { contacts }, { delay })
  198. // change privacy setting
  199. .post('express:/project/:projectId/settings/admin', 200, { delay })
  200. // update project member (e.g. set privilege level)
  201. .put('express:/project/:projectId/users/:userId', 200, { delay })
  202. // remove project member
  203. .delete('express:/project/:projectId/users/:userId', 200, { delay })
  204. // transfer ownership
  205. .post('express:/project/:projectId/transfer-ownership', 200, {
  206. delay,
  207. })
  208. // send invite
  209. .post('express:/project/:projectId/invite', 200, { delay })
  210. // delete invite
  211. .delete('express:/project/:projectId/invite/:inviteId', 204, {
  212. delay,
  213. })
  214. // resend invite
  215. .post('express:/project/:projectId/invite/:inviteId/resend', 200, {
  216. delay,
  217. })
  218. // send analytics event
  219. .post('express:/event/:key', 200)
  220. }