remove.tsx 2.4 KB

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