subscription-dashboard.tsx 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { Trans, useTranslation } from 'react-i18next'
  2. import ContactSupport from './contact-support-for-custom-subscription'
  3. import GroupSubscriptionMemberships from './group-subscription-memberships'
  4. import InstitutionMemberships from './institution-memberships'
  5. import FreePlan from './free-plan'
  6. import ManagedPublishers from './managed-publishers'
  7. import PersonalSubscription from './personal-subscription'
  8. import ManagedGroupSubscriptions from './managed-group-subscriptions'
  9. import ManagedInstitutions from './managed-institutions'
  10. import { useSubscriptionDashboardContext } from '../../context/subscription-dashboard-context'
  11. import getMeta from '../../../../utils/meta'
  12. import PremiumFeaturesLink from './premium-features-link'
  13. import OLPageContentCard from '@/shared/components/ol/ol-page-content-card'
  14. import OLRow from '@/shared/components/ol/ol-row'
  15. import OLCol from '@/shared/components/ol/ol-col'
  16. import OLNotification from '@/shared/components/ol/ol-notification'
  17. import WritefullManagedBundleAddOn from './states/active/change-plan/modals/writefull-bundle-management-modal'
  18. import RedirectAlerts from './redirect-alerts'
  19. function SubscriptionDashboard() {
  20. const { t } = useTranslation()
  21. const {
  22. hasDisplayedSubscription,
  23. hasSubscription,
  24. hasValidActiveSubscription,
  25. personalSubscription,
  26. } = useSubscriptionDashboardContext()
  27. const hasAiAssistViaWritefull = getMeta('ol-hasAiAssistViaWritefull')
  28. const fromPlansPage = getMeta('ol-fromPlansPage')
  29. const hasRedirectedPaymentError = Boolean(
  30. getMeta('ol-subscriptionPaymentErrorCode')
  31. )
  32. return (
  33. <div className="container">
  34. <OLRow>
  35. <OLCol lg={{ span: 8, offset: 2 }}>
  36. {fromPlansPage && (
  37. <OLNotification
  38. className="mb-4"
  39. aria-live="polite"
  40. content={t('you_already_have_a_subscription')}
  41. type="warning"
  42. />
  43. )}
  44. {hasRedirectedPaymentError && (
  45. <OLNotification
  46. className="mb-4"
  47. aria-live="polite"
  48. content={
  49. <Trans
  50. i18nKey="payment_error_generic"
  51. components={[
  52. /* eslint-disable-next-line jsx-a11y/anchor-has-content, react/jsx-key */
  53. <a href="/contact" target="_blank" />,
  54. ]}
  55. />
  56. }
  57. type="error"
  58. />
  59. )}
  60. <RedirectAlerts />
  61. <OLPageContentCard>
  62. <div className="page-header">
  63. <h1>{t('your_subscriptions')}</h1>
  64. </div>
  65. <div>
  66. <PersonalSubscription />
  67. <ManagedGroupSubscriptions />
  68. <ManagedInstitutions />
  69. <ManagedPublishers />
  70. <GroupSubscriptionMemberships />
  71. <InstitutionMemberships />
  72. {!personalSubscription && hasAiAssistViaWritefull && (
  73. <div className="mb-4">
  74. <h2 className="h3 fw-bold">{t('add_ons')}</h2>
  75. <WritefullManagedBundleAddOn />
  76. </div>
  77. )}
  78. {hasValidActiveSubscription && (
  79. <PremiumFeaturesLink subscription={personalSubscription} />
  80. )}
  81. {!hasDisplayedSubscription &&
  82. (hasSubscription ? <ContactSupport /> : <FreePlan />)}
  83. </div>
  84. </OLPageContentCard>
  85. </OLCol>
  86. </OLRow>
  87. </div>
  88. )
  89. }
  90. export default SubscriptionDashboard