remove.tsx 2.4 KB

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