remove.tsx 2.3 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 '@/shared/components/ol/ol-tooltip'
  7. import OLIconButton, {
  8. OLIconButtonProps,
  9. } from '@/shared/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, setLoading } = useUserEmailsContext()
  36. const isManaged = getMeta('ol-isManagedAccount')
  37. const getTooltipText = () => {
  38. if (isManaged) {
  39. return t('your_account_is_managed_by_your_group_admin')
  40. }
  41. return userEmailData.default
  42. ? t('please_change_primary_to_remove')
  43. : t('remove')
  44. }
  45. const handleRemoveUserEmail = () => {
  46. deleteEmailAsync
  47. .runAsync(
  48. postJSON('/user/emails/delete', {
  49. body: {
  50. email: userEmailData.email,
  51. },
  52. })
  53. )
  54. .then(() => {
  55. deleteEmail(userEmailData.email)
  56. // Reset the global loading state before this row is unmounted
  57. setLoading(false)
  58. })
  59. .catch(() => {
  60. setLoading(false)
  61. })
  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