emails-section.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. isInitializingSuccess,
  21. } = useUserEmailsContext()
  22. const userEmails = Object.values(userEmailsData.byId)
  23. return (
  24. <>
  25. <h3>{t('emails_and_affiliations_title')}</h3>
  26. <p className="small">{t('emails_and_affiliations_explanation')}</p>
  27. <p className="small">
  28. <Trans i18nKey="change_primary_email_address_instructions">
  29. <strong />
  30. {/* eslint-disable-next-line jsx-a11y/anchor-has-content */}
  31. <a href="/learn/how-to/Keeping_your_account_secure" />
  32. </Trans>
  33. </p>
  34. <>
  35. <EmailsHeader />
  36. {isInitializing ? (
  37. <div className="affiliations-table-row--highlighted">
  38. <div className="affiliations-table-cell text-center">
  39. <Icon type="refresh" fw spin /> {t('loading')}...
  40. </div>
  41. </div>
  42. ) : (
  43. <>
  44. {userEmails?.map(userEmail => (
  45. <Fragment key={userEmail.email}>
  46. <EmailsRow userEmailData={userEmail} />
  47. <div className="horizontal-divider" />
  48. </Fragment>
  49. ))}
  50. </>
  51. )}
  52. {isInitializingSuccess && <AddEmail />}
  53. {isInitializingError && (
  54. <Alert bsStyle="danger" className="text-center">
  55. <Icon type="exclamation-triangle" fw />{' '}
  56. {t('error_performing_request')}
  57. </Alert>
  58. )}
  59. </>
  60. </>
  61. )
  62. }
  63. function EmailsSection() {
  64. const { hasAffiliationsFeature } = getMeta(
  65. 'ol-ExposedSettings'
  66. ) as ExposedSettings
  67. if (!hasAffiliationsFeature) {
  68. return null
  69. }
  70. return (
  71. <>
  72. <UserEmailsProvider>
  73. <EmailsSectionContent />
  74. </UserEmailsProvider>
  75. </>
  76. )
  77. }
  78. export default EmailsSection