make-primary.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import Tooltip from '../../../../../shared/components/tooltip'
  2. import { Button } from 'react-bootstrap'
  3. import { useTranslation } from 'react-i18next'
  4. import {
  5. inReconfirmNotificationPeriod,
  6. institutionAlreadyLinked,
  7. } from '../../../utils/selectors'
  8. import { postJSON } from '../../../../../infrastructure/fetch-json'
  9. import {
  10. State,
  11. useUserEmailsContext,
  12. } from '../../../context/user-email-context'
  13. import { UserEmailData } from '../../../../../../../types/user-email'
  14. import { UseAsyncReturnType } from '../../../../../shared/hooks/use-async'
  15. const getDescription = (
  16. t: (s: string) => string,
  17. state: State,
  18. userEmailData: UserEmailData
  19. ) => {
  20. if (inReconfirmNotificationPeriod(userEmailData)) {
  21. return t('please_reconfirm_your_affiliation_before_making_this_primary')
  22. }
  23. if (userEmailData.confirmedAt) {
  24. return t('make_email_primary_description')
  25. }
  26. if (!institutionAlreadyLinked(state, userEmailData)) {
  27. return userEmailData.ssoAvailable
  28. ? t('please_link_before_making_primary')
  29. : t('please_confirm_your_email_before_making_it_default')
  30. }
  31. return ''
  32. }
  33. function PrimaryButton({ children, disabled, onClick }: Button.ButtonProps) {
  34. return (
  35. <Button
  36. bsSize="small"
  37. bsStyle="success"
  38. disabled={disabled}
  39. onClick={onClick}
  40. >
  41. {children}
  42. </Button>
  43. )
  44. }
  45. type MakePrimaryProps = {
  46. userEmailData: UserEmailData
  47. makePrimaryAsync: UseAsyncReturnType
  48. }
  49. function MakePrimary({ userEmailData, makePrimaryAsync }: MakePrimaryProps) {
  50. const { t } = useTranslation()
  51. const { state, makePrimary } = useUserEmailsContext()
  52. const handleSetDefaultUserEmail = () => {
  53. makePrimaryAsync
  54. .runAsync(
  55. postJSON('/user/emails/default', {
  56. body: {
  57. email: userEmailData.email,
  58. },
  59. })
  60. )
  61. .then(() => {
  62. makePrimary(userEmailData.email)
  63. })
  64. .catch(() => {})
  65. }
  66. if (userEmailData.default) {
  67. return null
  68. }
  69. if (makePrimaryAsync.isLoading) {
  70. return <PrimaryButton disabled>{t('sending')}...</PrimaryButton>
  71. }
  72. return (
  73. <Tooltip
  74. id={`tooltip-make-primary-${userEmailData.email}`}
  75. description={getDescription(t, state, userEmailData)}
  76. >
  77. {/*
  78. Disabled buttons don't work with tooltips, due to pointer-events: none,
  79. so create a wrapper for the tooltip
  80. */}
  81. <span>
  82. <PrimaryButton
  83. disabled={
  84. state.isLoading ||
  85. inReconfirmNotificationPeriod(userEmailData) ||
  86. (!userEmailData.confirmedAt &&
  87. !institutionAlreadyLinked(state, userEmailData))
  88. }
  89. onClick={handleSetDefaultUserEmail}
  90. >
  91. {t('make_primary')}
  92. </PrimaryButton>
  93. </span>
  94. </Tooltip>
  95. )
  96. }
  97. export default MakePrimary