changeGoogleDomainAction.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import {Component, Fragment} from 'react';
  2. import {addLoadingMessage, clearIndicators} from 'sentry/actionCreators/indicator';
  3. import type {ModalRenderProps} from 'sentry/actionCreators/modal';
  4. import {openModal} from 'sentry/actionCreators/modal';
  5. import type {Client} from 'sentry/api';
  6. import SelectField from 'sentry/components/forms/fields/selectField';
  7. import TextField from 'sentry/components/forms/fields/textField';
  8. import Form from 'sentry/components/forms/form';
  9. import withApi from 'sentry/utils/withApi';
  10. type Props = {
  11. api: Client;
  12. onUpdated: (data: any) => void;
  13. orgId: string;
  14. };
  15. const CHANGE_CHOICES = [
  16. ['swap', 'Swap'],
  17. ['add', 'Add'],
  18. ] as const;
  19. type ModalProps = Props & ModalRenderProps;
  20. type ModalState = {
  21. append: string | null;
  22. dryRun: boolean | null;
  23. dryRunInfo: any[];
  24. loading: boolean;
  25. };
  26. class ChangeGoogleDomainModal extends Component<ModalProps, ModalState> {
  27. state: ModalState = {
  28. loading: false,
  29. append: null,
  30. dryRun: true,
  31. dryRunInfo: [],
  32. };
  33. onActionSuccess(domain: string) {
  34. this.props.closeModal();
  35. this.props.onUpdated({newDomain: domain});
  36. }
  37. onActionError(error: string) {
  38. this.props.closeModal();
  39. this.props.onUpdated({error});
  40. }
  41. onSubmit = async (obj: any) => {
  42. const {orgId} = this.props;
  43. const {dryRun} = this.state;
  44. const {newDomain, append} = obj;
  45. const data = {append, newDomain, dryRun};
  46. addLoadingMessage();
  47. try {
  48. const result = await this.props.api.requestPromise(
  49. `/customers/${orgId}/migrate-google-domain/`,
  50. {method: 'POST', data}
  51. );
  52. if (dryRun) {
  53. this.setState({dryRunInfo: result.dryrun_info, dryRun: false});
  54. } else {
  55. this.onActionSuccess(result.new_domain);
  56. }
  57. } catch (error) {
  58. this.onActionError(error);
  59. }
  60. clearIndicators();
  61. };
  62. renderDryRunInfo() {
  63. return this.state.dryRunInfo.map(i => (
  64. <li style={{listStyle: 'none'}} key={i}>
  65. {i}
  66. </li>
  67. ));
  68. }
  69. render() {
  70. const {Header, Body} = this.props;
  71. const {loading, dryRun, dryRunInfo} = this.state;
  72. if (loading) {
  73. return null;
  74. }
  75. return (
  76. <Fragment>
  77. <Header>Change Google Domain</Header>
  78. <Body>
  79. <Form
  80. onSubmit={this.onSubmit}
  81. submitLabel={dryRun ? 'Do Dry Run' : 'Update Google Domain(s)'}
  82. >
  83. <TextField
  84. inline={false}
  85. stacked
  86. label="New Domain"
  87. name="newDomain"
  88. placeholder="new domain"
  89. flexibleControlStateSize
  90. required
  91. />
  92. <SelectField
  93. inline={false}
  94. stacked
  95. label="Change Option"
  96. name="append"
  97. choices={CHANGE_CHOICES}
  98. required
  99. flexibleControlStateSize
  100. onChange={(v: string) => this.setState({append: v})}
  101. />
  102. </Form>
  103. {dryRunInfo.length > 0 && (
  104. <pre>
  105. <p>Test Run</p>
  106. {this.renderDryRunInfo()}
  107. </pre>
  108. )}
  109. </Body>
  110. </Fragment>
  111. );
  112. }
  113. }
  114. const Modal = withApi(ChangeGoogleDomainModal);
  115. type Options = Pick<Props, 'orgId' | 'onUpdated'>;
  116. const triggerGoogleDomainModal = (opts: Options) =>
  117. openModal(deps => <Modal {...deps} {...opts} />);
  118. export default triggerGoogleDomainModal;