share-project-modal-content.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { Button, Modal, Grid } from 'react-bootstrap'
  2. import { Trans } from 'react-i18next'
  3. import ShareModalBody from './share-modal-body'
  4. import Icon from '../../../shared/components/icon'
  5. import AccessibleModal from '../../../shared/components/accessible-modal'
  6. import PropTypes from 'prop-types'
  7. import { ReadOnlyTokenLink } from './link-sharing'
  8. import { useEditorContext } from '../../../shared/context/editor-context'
  9. export default function ShareProjectModalContent({
  10. show,
  11. cancel,
  12. animation,
  13. inFlight,
  14. error,
  15. }) {
  16. const { isRestrictedTokenMember } = useEditorContext({
  17. isRestrictedTokenMember: PropTypes.bool,
  18. })
  19. return (
  20. <AccessibleModal show={show} onHide={cancel} animation={animation}>
  21. <Modal.Header closeButton>
  22. <Modal.Title>
  23. <Trans i18nKey="share_project" />
  24. </Modal.Title>
  25. </Modal.Header>
  26. <Modal.Body className="modal-body-share">
  27. <Grid fluid>
  28. {isRestrictedTokenMember ? <ReadOnlyTokenLink /> : <ShareModalBody />}
  29. </Grid>
  30. </Modal.Body>
  31. <Modal.Footer className="modal-footer-share">
  32. <div className="modal-footer-left">
  33. {inFlight && <Icon type="refresh" spin />}
  34. {error && (
  35. <span className="text-danger error">
  36. <ErrorMessage error={error} />
  37. </span>
  38. )}
  39. </div>
  40. <div className="modal-footer-right">
  41. <Button
  42. type="button"
  43. onClick={cancel}
  44. bsStyle="default"
  45. disabled={inFlight}
  46. >
  47. <Trans i18nKey="close" />
  48. </Button>
  49. </div>
  50. </Modal.Footer>
  51. </AccessibleModal>
  52. )
  53. }
  54. ShareProjectModalContent.propTypes = {
  55. cancel: PropTypes.func.isRequired,
  56. show: PropTypes.bool,
  57. animation: PropTypes.bool,
  58. inFlight: PropTypes.bool,
  59. error: PropTypes.string,
  60. }
  61. function ErrorMessage({ error }) {
  62. switch (error) {
  63. case 'cannot_invite_non_user':
  64. return <Trans i18nKey="cannot_invite_non_user" />
  65. case 'cannot_verify_user_not_robot':
  66. return <Trans i18nKey="cannot_verify_user_not_robot" />
  67. case 'cannot_invite_self':
  68. return <Trans i18nKey="cannot_invite_self" />
  69. case 'invalid_email':
  70. return <Trans i18nKey="invalid_email" />
  71. case 'too_many_requests':
  72. return <Trans i18nKey="too_many_requests" />
  73. default:
  74. return <Trans i18nKey="generic_something_went_wrong" />
  75. }
  76. }
  77. ErrorMessage.propTypes = {
  78. error: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]).isRequired,
  79. }