teamAccessRequestModal.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import {Component, Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import {addErrorMessage, addSuccessMessage} from 'app/actionCreators/indicator';
  4. import {ModalRenderProps, TeamAccessRequestModalOptions} from 'app/actionCreators/modal';
  5. import {Client} from 'app/api';
  6. import Button from 'app/components/button';
  7. import {t, tct} from 'app/locale';
  8. import space from 'app/styles/space';
  9. import withApi from 'app/utils/withApi';
  10. type Props = ModalRenderProps &
  11. TeamAccessRequestModalOptions & {
  12. api: Client;
  13. memberId: string;
  14. teamId: string;
  15. orgId: string;
  16. };
  17. type State = {
  18. createBusy: boolean;
  19. };
  20. class CreateTeamAccessRequest extends Component<Props, State> {
  21. state: State = {
  22. createBusy: false,
  23. };
  24. handleClick = async () => {
  25. const {api, memberId, orgId, teamId, closeModal} = this.props;
  26. this.setState({createBusy: true});
  27. try {
  28. await api.requestPromise(
  29. `/organizations/${orgId}/members/${memberId}/teams/${teamId}/`,
  30. {
  31. method: 'POST',
  32. }
  33. );
  34. addSuccessMessage(t('Team request sent for approval'));
  35. } catch (err) {
  36. addErrorMessage(t('Unable to send team request'));
  37. }
  38. this.setState({createBusy: false});
  39. closeModal();
  40. };
  41. render() {
  42. const {Body, Footer, closeModal, teamId} = this.props;
  43. return (
  44. <Fragment>
  45. <Body>
  46. {tct(
  47. 'You do not have permission to add members to the #[team] team, but we will send a request to your organization admins for approval.',
  48. {team: teamId}
  49. )}
  50. </Body>
  51. <Footer>
  52. <ButtonGroup>
  53. <Button onClick={closeModal}>{t('Cancel')}</Button>
  54. <Button
  55. priority="primary"
  56. onClick={this.handleClick}
  57. busy={this.state.createBusy}
  58. autoFocus
  59. >
  60. {t('Continue')}
  61. </Button>
  62. </ButtonGroup>
  63. </Footer>
  64. </Fragment>
  65. );
  66. }
  67. }
  68. const ButtonGroup = styled('div')`
  69. display: grid;
  70. grid-template-columns: max-content max-content;
  71. grid-gap: ${space(1)};
  72. `;
  73. export default withApi(CreateTeamAccessRequest);