linking-section.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { useTranslation } from 'react-i18next'
  2. import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
  3. import { useSSOContext, SSOSubscription } from '../context/sso-context'
  4. import { SSOLinkingWidget } from './linking/sso-widget'
  5. const integrationLinkingWidgets = importOverleafModules(
  6. 'integrationLinkingWidgets'
  7. )
  8. const referenceLinkingWidgets = importOverleafModules('referenceLinkingWidgets')
  9. function LinkingSection() {
  10. const { t } = useTranslation()
  11. const { subscriptions } = useSSOContext()
  12. const hasIntegrationLinkingSection = integrationLinkingWidgets.length
  13. const hasReferencesLinkingSection = referenceLinkingWidgets.length
  14. const hasSSOLinkingSection = Object.keys(subscriptions).length > 0
  15. if (
  16. !hasIntegrationLinkingSection &&
  17. !hasReferencesLinkingSection &&
  18. !hasSSOLinkingSection
  19. ) {
  20. return null
  21. }
  22. return (
  23. <>
  24. <h3>{t('integrations')}</h3>
  25. <p>{t('linked_accounts_explained')}</p>
  26. {hasIntegrationLinkingSection ? (
  27. <>
  28. <h3 className="text-capitalize">{t('sync_dropbox_github')}</h3>
  29. <div className="settings-widgets-container">
  30. {integrationLinkingWidgets.map(
  31. ({ import: importObject, path }, widgetIndex) => (
  32. <ModuleLinkingWidget
  33. key={Object.keys(importObject)[0]}
  34. ModuleComponent={Object.values(importObject)[0]}
  35. isLast={widgetIndex === integrationLinkingWidgets.length - 1}
  36. />
  37. )
  38. )}
  39. </div>
  40. </>
  41. ) : null}
  42. {hasReferencesLinkingSection ? (
  43. <>
  44. <h3 className="text-capitalize">{t('reference_sync')}</h3>
  45. <div className="settings-widgets-container">
  46. {referenceLinkingWidgets.map(
  47. ({ import: importObject, path }, widgetIndex) => (
  48. <ModuleLinkingWidget
  49. key={Object.keys(importObject)[0]}
  50. ModuleComponent={Object.values(importObject)[0]}
  51. isLast={widgetIndex === referenceLinkingWidgets.length - 1}
  52. />
  53. )
  54. )}
  55. </div>
  56. </>
  57. ) : null}
  58. {hasSSOLinkingSection ? (
  59. <>
  60. <h3 className="text-capitalize">{t('linked_accounts')}</h3>
  61. <div className="settings-widgets-container">
  62. {Object.values(subscriptions).map(
  63. (subscription, subscriptionIndex) => (
  64. <SSOLinkingWidgetContainer
  65. key={subscription.providerId}
  66. subscription={subscription}
  67. isLast={
  68. subscriptionIndex === Object.keys(subscriptions).length - 1
  69. }
  70. />
  71. )
  72. )}
  73. </div>
  74. </>
  75. ) : null}
  76. {hasIntegrationLinkingSection ||
  77. hasReferencesLinkingSection ||
  78. hasSSOLinkingSection ? (
  79. <hr />
  80. ) : null}
  81. </>
  82. )
  83. }
  84. type LinkingWidgetProps = {
  85. ModuleComponent: any
  86. isLast: boolean
  87. }
  88. function ModuleLinkingWidget({ ModuleComponent, isLast }: LinkingWidgetProps) {
  89. return (
  90. <>
  91. <ModuleComponent />
  92. {isLast ? null : <hr />}
  93. </>
  94. )
  95. }
  96. type SSOLinkingWidgetContainerProps = {
  97. subscription: SSOSubscription
  98. isLast: boolean
  99. }
  100. function SSOLinkingWidgetContainer({
  101. subscription,
  102. isLast,
  103. }: SSOLinkingWidgetContainerProps) {
  104. const { t } = useTranslation()
  105. const { unlink } = useSSOContext()
  106. return (
  107. <>
  108. <SSOLinkingWidget
  109. providerId={subscription.providerId}
  110. title={subscription.provider.name}
  111. description={t(
  112. subscription.provider.descriptionKey,
  113. subscription.provider.descriptionOptions
  114. )}
  115. helpPath={subscription.provider.descriptionOptions?.link}
  116. linked={subscription.linked}
  117. linkPath={subscription.provider.linkPath}
  118. onUnlink={() => unlink(subscription.providerId)}
  119. />
  120. {isLast ? null : <hr />}
  121. </>
  122. )
  123. }
  124. export default LinkingSection