remove.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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="small"
  24. onClick={onClick}
  25. accessibilityLabel={t('remove') || ''}
  26. icon={
  27. bsVersion({
  28. bs5: 'delete',
  29. bs3: 'trash',
  30. }) || 'trash'
  31. }
  32. bs3Props={{ fw: true }}
  33. />
  34. )
  35. }
  36. type RemoveProps = {
  37. userEmailData: UserEmailData
  38. deleteEmailAsync: UseAsyncReturnType
  39. }
  40. function Remove({ userEmailData, deleteEmailAsync }: RemoveProps) {
  41. const { t } = useTranslation()
  42. const { state, deleteEmail, resetLeaversSurveyExpiration } =
  43. useUserEmailsContext()
  44. const isManaged = getMeta('ol-isManagedAccount', false)
  45. const getTooltipText = () => {
  46. if (isManaged) {
  47. return t('your_account_is_managed_by_your_group_admin')
  48. }
  49. return userEmailData.default
  50. ? t('please_change_primary_to_remove')
  51. : t('remove')
  52. }
  53. const handleRemoveUserEmail = () => {
  54. deleteEmailAsync
  55. .runAsync(
  56. postJSON('/user/emails/delete', {
  57. body: {
  58. email: userEmailData.email,
  59. },
  60. })
  61. )
  62. .then(() => {
  63. deleteEmail(userEmailData.email)
  64. resetLeaversSurveyExpiration(userEmailData)
  65. })
  66. .catch(() => {})
  67. }
  68. if (deleteEmailAsync.isLoading) {
  69. return <DeleteButton isLoading />
  70. }
  71. return (
  72. <OLTooltip
  73. id={userEmailData.email}
  74. description={getTooltipText()}
  75. overlayProps={{ placement: userEmailData.default ? 'left' : 'top' }}
  76. >
  77. <span>
  78. <DeleteButton
  79. disabled={state.isLoading || userEmailData.default}
  80. onClick={handleRemoveUserEmail}
  81. />
  82. </span>
  83. </OLTooltip>
  84. )
  85. }
  86. export default Remove