sso-linking-section.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { useTranslation } from 'react-i18next'
  2. import {
  3. SSOProvider,
  4. useSSOContext,
  5. SSOSubscription,
  6. } from '../context/sso-context'
  7. import { SSOLinkingWidget } from './sso-linking/widget'
  8. function SSOLinkingSection() {
  9. const { t } = useTranslation()
  10. return (
  11. <SSOProvider>
  12. <h3 className="text-capitalize">{t('linked_accounts')}</h3>
  13. <p>{t('linked_accounts_explained')}</p>
  14. <SSOLinkingWidgets />
  15. </SSOProvider>
  16. )
  17. }
  18. function SSOLinkingWidgets() {
  19. const { subscriptions } = useSSOContext()
  20. return (
  21. <div className="settings-widgets-container">
  22. {Object.values(subscriptions).map((subscription, subscriptionIndex) => (
  23. <SSOLinkingWidgetContainer
  24. key={subscription.providerId}
  25. subscription={subscription}
  26. isLast={subscriptionIndex === Object.keys(subscriptions).length - 1}
  27. />
  28. ))}
  29. </div>
  30. )
  31. }
  32. type SSOLinkingWidgetContainerProps = {
  33. subscription: SSOSubscription
  34. isLast: boolean
  35. }
  36. function SSOLinkingWidgetContainer({
  37. subscription,
  38. isLast,
  39. }: SSOLinkingWidgetContainerProps) {
  40. const { t } = useTranslation()
  41. const { unlink } = useSSOContext()
  42. return (
  43. <>
  44. <SSOLinkingWidget
  45. providerId={subscription.providerId}
  46. title={subscription.provider.name}
  47. description={t(
  48. subscription.provider.descriptionKey,
  49. subscription.provider.descriptionOptions
  50. )}
  51. helpPath={subscription.provider.descriptionOptions?.link}
  52. linked={subscription.linked}
  53. linkPath={subscription.provider.linkPath}
  54. onUnlink={() => unlink(subscription.providerId)}
  55. />
  56. {isLast ? null : <hr />}
  57. </>
  58. )
  59. }
  60. export default SSOLinkingSection