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 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 } =
  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. })
  59. .catch(() => {})
  60. }
  61. if (deleteEmailAsync.isLoading) {
  62. return <DeleteButton isLoading />
  63. }
  64. return (
  65. <OLTooltip
  66. id={userEmailData.email}
  67. description={getTooltipText()}
  68. overlayProps={{ placement: userEmailData.default ? 'left' : 'top' }}
  69. >
  70. <span>
  71. <DeleteButton
  72. disabled={state.isLoading || userEmailData.default}
  73. onClick={handleRemoveUserEmail}
  74. />
  75. </span>
  76. </OLTooltip>
  77. )
  78. }
  79. export default Remove