teamAccessRequestModal.tsx 2.2 KB

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