useDeleteFeedback.tsx 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import {Fragment, useCallback, useMemo} from 'react';
  2. import {
  3. addErrorMessage,
  4. addLoadingMessage,
  5. addSuccessMessage,
  6. } from 'sentry/actionCreators/indicator';
  7. import {ModalRenderProps, openModal} from 'sentry/actionCreators/modal';
  8. import {Button} from 'sentry/components/button';
  9. import {useInfiniteFeedbackListData} from 'sentry/components/feedback/feedbackDataContext';
  10. import {Flex} from 'sentry/components/profiling/flex';
  11. import {t} from 'sentry/locale';
  12. import {space} from 'sentry/styles/space';
  13. import type {HydratedFeedbackItem} from 'sentry/utils/feedback/item/types';
  14. import useApi from 'sentry/utils/useApi';
  15. import useOrganization from 'sentry/utils/useOrganization';
  16. import useUrlParams from 'sentry/utils/useUrlParams';
  17. interface Props {
  18. feedbackItem: HydratedFeedbackItem;
  19. }
  20. function openDeleteModal({onDelete}: {onDelete: () => void | Promise<void>}) {
  21. openModal(({Body, Footer, closeModal}: ModalRenderProps) => (
  22. <Fragment>
  23. <Body>
  24. {t('Deleting this feedback is permanent. Are you sure you wish to continue?')}
  25. </Body>
  26. <Footer>
  27. <Flex gap={space(1)}>
  28. <Button onClick={closeModal}>{t('Cancel')}</Button>
  29. <Button
  30. priority="danger"
  31. onClick={() => {
  32. closeModal();
  33. onDelete();
  34. }}
  35. >
  36. {t('Delete')}
  37. </Button>
  38. </Flex>
  39. </Footer>
  40. </Fragment>
  41. ));
  42. }
  43. export default function useDeleteFeedback({feedbackItem}: Props) {
  44. const feedbackId = feedbackItem.feedback_id;
  45. const api = useApi();
  46. const organization = useOrganization();
  47. const {getParamValue: getFeedbackSlug, setParamValue: setFeedbackSlug} =
  48. useUrlParams('feedbackSlug');
  49. const {setFeedback} = useInfiniteFeedbackListData();
  50. const url = useMemo(() => {
  51. const feedbackSlug = getFeedbackSlug();
  52. const projectSlug = feedbackSlug?.split(':')[0];
  53. return `/projects/${organization.slug}/${projectSlug}/feedback/${feedbackId}/`;
  54. }, [feedbackId, getFeedbackSlug, organization]);
  55. const handleDelete = useCallback(async () => {
  56. addLoadingMessage(t('Deleting feedback...'));
  57. try {
  58. await api.requestPromise(url, {method: 'DELETE'});
  59. addSuccessMessage(t('Deleted feedback'));
  60. setFeedbackSlug('');
  61. setFeedback(feedbackId, undefined);
  62. } catch {
  63. addErrorMessage(t('An error occurred while deleting the feedback.'));
  64. }
  65. }, [api, feedbackId, setFeedback, setFeedbackSlug, url]);
  66. return {
  67. onDelete: () => openDeleteModal({onDelete: handleDelete}),
  68. };
  69. }