share-project-modal-content.js 2.7 KB

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