share-modal-body.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import EditMember from './edit-member'
  2. import LinkSharing from './link-sharing'
  3. import Invite from './invite'
  4. import SendInvites from './send-invites'
  5. import ViewMember from './view-member'
  6. import OwnerInfo from './owner-info'
  7. import SendInvitesNotice from './send-invites-notice'
  8. import { useEditorContext } from '../../../shared/context/editor-context'
  9. import { useProjectContext } from '../../../shared/context/project-context'
  10. import { useSplitTestContext } from '../../../shared/context/split-test-context'
  11. import { useMemo } from 'react'
  12. import { Row } from 'react-bootstrap'
  13. import PropTypes from 'prop-types'
  14. import RecaptchaConditions from '../../../shared/components/recaptcha-conditions'
  15. export default function ShareModalBody() {
  16. const { splitTestVariants } = useSplitTestContext({
  17. splitTestVariants: PropTypes.object,
  18. })
  19. const { members, invites, features } = useProjectContext()
  20. const { isProjectOwner } = useEditorContext()
  21. // whether the project has not reached the collaborator limit
  22. const canAddCollaborators = useMemo(() => {
  23. if (!isProjectOwner || !features) {
  24. return false
  25. }
  26. if (features.collaborators === -1) {
  27. // infinite collaborators
  28. return true
  29. }
  30. return members.length + invites.length < features.collaborators
  31. }, [members, invites, features, isProjectOwner])
  32. switch (splitTestVariants['project-share-modal-paywall']) {
  33. case 'new-copy-top':
  34. return (
  35. <>
  36. {isProjectOwner ? (
  37. <>
  38. <SendInvites canAddCollaborators={canAddCollaborators} />
  39. <Row className="public-access-level" />
  40. </>
  41. ) : (
  42. <SendInvitesNotice />
  43. )}
  44. <OwnerInfo />
  45. {members.map(member =>
  46. isProjectOwner ? (
  47. <EditMember key={member._id} member={member} />
  48. ) : (
  49. <ViewMember key={member._id} member={member} />
  50. )
  51. )}
  52. {invites.map(invite => (
  53. <Invite
  54. key={invite._id}
  55. invite={invite}
  56. isProjectOwner={isProjectOwner}
  57. />
  58. ))}
  59. {isProjectOwner && (
  60. <>
  61. <br />
  62. <LinkSharing canAddCollaborators={canAddCollaborators} />
  63. </>
  64. )}
  65. {!window.ExposedSettings.recaptchaDisabled?.invite && (
  66. <RecaptchaConditions />
  67. )}
  68. </>
  69. )
  70. case 'new-copy-middle':
  71. return (
  72. <>
  73. <OwnerInfo />
  74. {members.map(member =>
  75. isProjectOwner ? (
  76. <EditMember key={member._id} member={member} />
  77. ) : (
  78. <ViewMember key={member._id} member={member} />
  79. )
  80. )}
  81. {invites.map(invite => (
  82. <Invite
  83. key={invite._id}
  84. invite={invite}
  85. isProjectOwner={isProjectOwner}
  86. />
  87. ))}
  88. {isProjectOwner ? (
  89. <SendInvites canAddCollaborators={canAddCollaborators} />
  90. ) : (
  91. <SendInvitesNotice />
  92. )}
  93. {isProjectOwner && (
  94. <>
  95. <br />
  96. <LinkSharing canAddCollaborators={canAddCollaborators} />
  97. </>
  98. )}
  99. {!window.ExposedSettings.recaptchaDisabled?.invite && (
  100. <RecaptchaConditions />
  101. )}
  102. </>
  103. )
  104. case 'new-copy-bottom':
  105. case 'default':
  106. default:
  107. return (
  108. <>
  109. {isProjectOwner && (
  110. <LinkSharing canAddCollaborators={canAddCollaborators} />
  111. )}
  112. <OwnerInfo />
  113. {members.map(member =>
  114. isProjectOwner ? (
  115. <EditMember key={member._id} member={member} />
  116. ) : (
  117. <ViewMember key={member._id} member={member} />
  118. )
  119. )}
  120. {invites.map(invite => (
  121. <Invite
  122. key={invite._id}
  123. invite={invite}
  124. isProjectOwner={isProjectOwner}
  125. />
  126. ))}
  127. {isProjectOwner ? (
  128. <SendInvites canAddCollaborators={canAddCollaborators} />
  129. ) : (
  130. <SendInvitesNotice />
  131. )}
  132. {!window.ExposedSettings.recaptchaDisabled?.invite && (
  133. <RecaptchaConditions />
  134. )}
  135. </>
  136. )
  137. }
  138. }