customCommitsResolutionModal.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {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/selectAsyncField';
  5. import TimeSince from 'sentry/components/timeSince';
  6. import Version from 'sentry/components/version';
  7. import {t} from 'sentry/locale';
  8. import {space} from 'sentry/styles/space';
  9. import type {ResolvedStatusDetails} from 'sentry/types/group';
  10. import type {Commit} from 'sentry/types/integrations';
  11. interface CustomCommitsResolutionModalProps extends ModalRenderProps {
  12. onSelected: (x: ResolvedStatusDetails) => void;
  13. orgSlug: string;
  14. projectSlug?: string;
  15. }
  16. function CustomCommitsResolutionModal({
  17. onSelected,
  18. orgSlug,
  19. projectSlug,
  20. closeModal,
  21. Header,
  22. Body,
  23. Footer,
  24. }: CustomCommitsResolutionModalProps) {
  25. const [commit, setCommit] = useState<Commit | undefined>();
  26. const [commits, setCommits] = useState<Commit[] | undefined>();
  27. const onChange = (value: string | number | boolean) => {
  28. setCommit(commits?.find(result => result.id === value));
  29. };
  30. const onAsyncFieldResults = (results: Commit[]) => {
  31. setCommits(results);
  32. return results.map(c => ({
  33. value: c.id,
  34. label: <Version version={c.id} anchor={false} />,
  35. details: (
  36. <span>
  37. {t('Created')} <TimeSince date={c.dateCreated} />
  38. </span>
  39. ),
  40. c,
  41. }));
  42. };
  43. const onSubmit = (e: React.FormEvent) => {
  44. e.preventDefault();
  45. onSelected({
  46. inCommit: {
  47. commit: commit?.id,
  48. repository: commit?.repository?.name,
  49. },
  50. });
  51. closeModal();
  52. };
  53. return (
  54. <form onSubmit={onSubmit}>
  55. <Header>
  56. <h4>{t('Resolved In')}</h4>
  57. </Header>
  58. <Body>
  59. <SelectAsyncField
  60. label={t('Commit')}
  61. id="commit"
  62. name="commit"
  63. onChange={onChange}
  64. placeholder={t('e.g. d86b832')}
  65. url={`/projects/${orgSlug}/${projectSlug}/commits/`}
  66. onResults={onAsyncFieldResults}
  67. onQuery={query => ({query})}
  68. />
  69. </Body>
  70. <Footer>
  71. <Button css={{marginRight: space(1.5)}} onClick={closeModal}>
  72. {t('Cancel')}
  73. </Button>
  74. <Button type="submit" priority="primary">
  75. {t('Resolve')}
  76. </Button>
  77. </Footer>
  78. </form>
  79. );
  80. }
  81. export default CustomCommitsResolutionModal;