leave-group-modal.tsx 2.2 KB

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