emails-section.tsx 2.6 KB

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