emails-section.tsx 2.2 KB

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