remove.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { useTranslation } from 'react-i18next'
  2. import { UserEmailData } from '../../../../../../../types/user-email'
  3. import { useUserEmailsContext } from '../../../context/user-email-context'
  4. import { postJSON } from '../../../../../infrastructure/fetch-json'
  5. import { UseAsyncReturnType } from '../../../../../shared/hooks/use-async'
  6. import TooltipWrapper from '@/features/ui/components/bootstrap-5/wrappers/tooltip-wrapper'
  7. import IconButtonWrapper, {
  8. IconButtonWrapperProps,
  9. } from '@/features/ui/components/bootstrap-5/wrappers/icon-button-wrapper'
  10. import { bsVersion } from '@/features/utils/bootstrap-5'
  11. type DeleteButtonProps = Pick<
  12. IconButtonWrapperProps,
  13. 'disabled' | 'isLoading' | 'onClick'
  14. >
  15. function DeleteButton({ disabled, isLoading, onClick }: DeleteButtonProps) {
  16. const { t } = useTranslation()
  17. return (
  18. <IconButtonWrapper
  19. variant="danger"
  20. disabled={disabled}
  21. isLoading={isLoading}
  22. size="small"
  23. onClick={onClick}
  24. accessibilityLabel={t('remove') || ''}
  25. icon={
  26. bsVersion({
  27. bs5: 'delete',
  28. bs3: 'trash',
  29. }) || 'trash'
  30. }
  31. bs3Props={{ fw: true }}
  32. />
  33. )
  34. }
  35. type RemoveProps = {
  36. userEmailData: UserEmailData
  37. deleteEmailAsync: UseAsyncReturnType
  38. }
  39. function Remove({ userEmailData, deleteEmailAsync }: RemoveProps) {
  40. const { t } = useTranslation()
  41. const { state, deleteEmail, resetLeaversSurveyExpiration } =
  42. useUserEmailsContext()
  43. const handleRemoveUserEmail = () => {
  44. deleteEmailAsync
  45. .runAsync(
  46. postJSON('/user/emails/delete', {
  47. body: {
  48. email: userEmailData.email,
  49. },
  50. })
  51. )
  52. .then(() => {
  53. deleteEmail(userEmailData.email)
  54. resetLeaversSurveyExpiration(userEmailData)
  55. })
  56. .catch(() => {})
  57. }
  58. if (deleteEmailAsync.isLoading) {
  59. return <DeleteButton isLoading />
  60. }
  61. return (
  62. <TooltipWrapper
  63. id={userEmailData.email}
  64. description={
  65. userEmailData.default
  66. ? t('please_change_primary_to_remove')
  67. : t('remove')
  68. }
  69. overlayProps={{ placement: userEmailData.default ? 'left' : 'top' }}
  70. >
  71. <span>
  72. <DeleteButton
  73. disabled={state.isLoading || userEmailData.default}
  74. onClick={handleRemoveUserEmail}
  75. />
  76. </span>
  77. </TooltipWrapper>
  78. )
  79. }
  80. export default Remove