leave-group-modal.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { useCallback, useState } from 'react'
  2. import { useTranslation } from 'react-i18next'
  3. import { deleteJSON } from '../../../../infrastructure/fetch-json'
  4. import { useSubscriptionDashboardContext } from '../../context/subscription-dashboard-context'
  5. import { useLocation } from '../../../../shared/hooks/use-location'
  6. import { debugConsole } from '@/utils/debugging'
  7. import {
  8. OLModal,
  9. OLModalBody,
  10. OLModalFooter,
  11. OLModalHeader,
  12. OLModalTitle,
  13. } from '@/shared/components/ol/ol-modal'
  14. import OLButton from '@/shared/components/ol/ol-button'
  15. export const LEAVE_GROUP_MODAL_ID = 'leave-group'
  16. export default function LeaveGroupModal() {
  17. const { t } = useTranslation()
  18. const { handleCloseModal, modalIdShown, leavingGroupId } =
  19. useSubscriptionDashboardContext()
  20. const [inflight, setInflight] = useState(false)
  21. const location = useLocation()
  22. const handleConfirmLeaveGroup = useCallback(async () => {
  23. if (!leavingGroupId) {
  24. return
  25. }
  26. setInflight(true)
  27. try {
  28. const params = new URLSearchParams()
  29. params.set('subscriptionId', leavingGroupId)
  30. await deleteJSON(`/subscription/group/user?${params}`)
  31. location.reload()
  32. } catch (error) {
  33. debugConsole.error('something went wrong', error)
  34. setInflight(false)
  35. }
  36. }, [location, leavingGroupId])
  37. if (modalIdShown !== LEAVE_GROUP_MODAL_ID || !leavingGroupId) {
  38. return null
  39. }
  40. return (
  41. <OLModal
  42. id={LEAVE_GROUP_MODAL_ID}
  43. show
  44. animation
  45. onHide={handleCloseModal}
  46. backdrop="static"
  47. >
  48. <OLModalHeader>
  49. <OLModalTitle>{t('leave_group')}</OLModalTitle>
  50. </OLModalHeader>
  51. <OLModalBody>
  52. <p>{t('sure_you_want_to_leave_group')}</p>
  53. </OLModalBody>
  54. <OLModalFooter>
  55. <OLButton
  56. variant="secondary"
  57. onClick={handleCloseModal}
  58. disabled={inflight}
  59. >
  60. {t('cancel')}
  61. </OLButton>
  62. <OLButton
  63. variant="danger"
  64. onClick={handleConfirmLeaveGroup}
  65. disabled={inflight}
  66. isLoading={inflight}
  67. loadingLabel={t('processing_uppercase') + '…'}
  68. >
  69. {t('leave_now')}
  70. </OLButton>
  71. </OLModalFooter>
  72. </OLModal>
  73. )
  74. }