emails-section.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { Fragment } from 'react'
  2. import { useTranslation, Trans } from 'react-i18next'
  3. import getMeta from '../../../utils/meta'
  4. import {
  5. UserEmailsProvider,
  6. useUserEmailsContext,
  7. } from '../context/user-email-context'
  8. import EmailsHeader from './emails/header'
  9. import EmailsRow from './emails/row'
  10. import AddEmail from './emails/add-email'
  11. import Icon from '../../../shared/components/icon'
  12. import { Alert } from 'react-bootstrap'
  13. import { ExposedSettings } from '../../../../../types/exposed-settings'
  14. import { LeaversSurveyAlert } from './leavers-survey-alert'
  15. function EmailsSectionContent() {
  16. const { t } = useTranslation()
  17. const {
  18. state: { data: userEmailsData },
  19. isInitializing,
  20. isInitializingError,
  21. isInitializingSuccess,
  22. } = useUserEmailsContext()
  23. const userEmails = Object.values(userEmailsData.byId)
  24. return (
  25. <>
  26. <h3>{t('emails_and_affiliations_title')}</h3>
  27. <p className="small">{t('emails_and_affiliations_explanation')}</p>
  28. <p className="small">
  29. <Trans i18nKey="change_primary_email_address_instructions">
  30. <strong />
  31. {/* eslint-disable-next-line jsx-a11y/anchor-has-content */}
  32. <a href="/learn/how-to/Keeping_your_account_secure" />
  33. </Trans>
  34. </p>
  35. <>
  36. <EmailsHeader />
  37. {isInitializing ? (
  38. <div className="affiliations-table-row--highlighted">
  39. <div className="affiliations-table-cell text-center">
  40. <Icon type="refresh" fw spin /> {t('loading')}...
  41. </div>
  42. </div>
  43. ) : (
  44. <>
  45. {userEmails?.map(userEmail => (
  46. <Fragment key={userEmail.email}>
  47. <EmailsRow userEmailData={userEmail} />
  48. <div className="horizontal-divider" />
  49. </Fragment>
  50. ))}
  51. </>
  52. )}
  53. {isInitializingSuccess && <LeaversSurveyAlert />}
  54. {isInitializingSuccess && <AddEmail />}
  55. {isInitializingError && (
  56. <Alert bsStyle="danger" className="text-center">
  57. <Icon type="exclamation-triangle" fw />{' '}
  58. {t('error_performing_request')}
  59. </Alert>
  60. )}
  61. </>
  62. </>
  63. )
  64. }
  65. function EmailsSection() {
  66. const { hasAffiliationsFeature } = getMeta(
  67. 'ol-ExposedSettings'
  68. ) as ExposedSettings
  69. if (!hasAffiliationsFeature) {
  70. return null
  71. }
  72. return (
  73. <>
  74. <UserEmailsProvider>
  75. <EmailsSectionContent />
  76. </UserEmailsProvider>
  77. </>
  78. )
  79. }
  80. export default EmailsSection