emails-section.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. function EmailsSectionContent() {
  15. const { t } = useTranslation()
  16. const {
  17. state: { data: userEmailsData },
  18. isInitializing,
  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. <div className="table">
  34. <EmailsHeader />
  35. {isInitializing ? (
  36. <div className="text-center">
  37. <Icon type="refresh" fw spin /> {t('loading')}...
  38. </div>
  39. ) : (
  40. <>
  41. {userEmails?.map(userEmail => (
  42. <Fragment key={userEmail.email}>
  43. <EmailsRow userEmailData={userEmail} />
  44. <div className="horizontal-divider" />
  45. </Fragment>
  46. ))}
  47. </>
  48. )}
  49. <AddEmail />
  50. {isInitializingError && (
  51. <Alert bsStyle="danger" className="text-center">
  52. <Icon type="exclamation-triangle" fw />{' '}
  53. {t('error_performing_request')}
  54. </Alert>
  55. )}
  56. </div>
  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. <>
  69. <UserEmailsProvider>
  70. <EmailsSectionContent />
  71. </UserEmailsProvider>
  72. <hr />
  73. </>
  74. )
  75. }
  76. export default EmailsSection