customResolutionModal.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import {Fragment, useState} from 'react';
  2. import type {ModalRenderProps} from 'sentry/actionCreators/modal';
  3. import Button from 'sentry/components/button';
  4. import {SelectAsyncField} from 'sentry/components/deprecatedforms';
  5. import TimeSince from 'sentry/components/timeSince';
  6. import Version from 'sentry/components/version';
  7. import {t} from 'sentry/locale';
  8. import configStore from 'sentry/stores/configStore';
  9. import space from 'sentry/styles/space';
  10. import type {Release} from 'sentry/types';
  11. interface CustomResolutionModalProps extends ModalRenderProps {
  12. onSelected: ({inRelease: string}) => void;
  13. orgSlug: string;
  14. projectSlug?: string;
  15. }
  16. function CustomResolutionModal(props: CustomResolutionModalProps) {
  17. const [version, setVersion] = useState('');
  18. const currentUser = configStore.get('user');
  19. const onChange = (value: any) => {
  20. setVersion(value.item);
  21. };
  22. const onAsyncFieldResults = (results: Release[]) => {
  23. return results.map(release => {
  24. const isAuthor = release.authors.some(
  25. author => author.email && author.email === currentUser?.email
  26. );
  27. return {
  28. item: release.version,
  29. label: <Version version={release.version} anchor={false} />,
  30. details: (
  31. <span>
  32. {t('Created')} <TimeSince date={release.dateCreated} />
  33. {isAuthor ? <Fragment> — {t('You committed')}</Fragment> : null}
  34. </span>
  35. ),
  36. release,
  37. };
  38. });
  39. };
  40. const url = props.projectSlug
  41. ? `/projects/${props.orgSlug}/${props.projectSlug}/releases/`
  42. : `/organizations/${props.orgSlug}/releases/`;
  43. const onSubmit = (e: React.FormEvent) => {
  44. e.preventDefault();
  45. props.onSelected({inRelease: version});
  46. props.closeModal();
  47. };
  48. const {Header, Body, Footer} = props;
  49. return (
  50. <form onSubmit={onSubmit}>
  51. <Header>{t('Resolved In')}</Header>
  52. <Body>
  53. <SelectAsyncField
  54. label={t('Version')}
  55. id="version"
  56. name="version"
  57. onChange={onChange}
  58. placeholder={t('e.g. 1.0.4')}
  59. url={url}
  60. onResults={onAsyncFieldResults}
  61. onQuery={query => ({query})}
  62. />
  63. </Body>
  64. <Footer>
  65. <Button type="button" css={{marginRight: space(1.5)}} onClick={props.closeModal}>
  66. {t('Cancel')}
  67. </Button>
  68. <Button type="submit" priority="primary">
  69. {t('Save Changes')}
  70. </Button>
  71. </Footer>
  72. </form>
  73. );
  74. }
  75. export default CustomResolutionModal;