subscription-dashboard.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. import { PaidSubscription } from '@ol-types/subscription/dashboard/subscription'
  20. function SubscriptionDashboard() {
  21. const { t } = useTranslation()
  22. const {
  23. hasDisplayedSubscription,
  24. hasSubscription,
  25. hasValidActiveSubscription,
  26. personalSubscription,
  27. } = useSubscriptionDashboardContext()
  28. const fromPlansPage = new URLSearchParams(window.location.search).has(
  29. 'hasSubscription'
  30. )
  31. const subscription = personalSubscription as PaidSubscription
  32. const hasAiAssistViaWritefull = getMeta('ol-hasAiAssistViaWritefull')
  33. const hasRedirectedPaymentError = Boolean(
  34. getMeta('ol-subscriptionPaymentErrorCode')
  35. )
  36. const hasPendingPlan =
  37. subscription &&
  38. subscription.pendingPlan &&
  39. subscription.pendingPlan.name !== subscription.plan.name
  40. const nextPaymentDueDate = subscription?.payment?.nextPaymentDueDate
  41. return (
  42. <div className="container">
  43. <OLRow>
  44. <OLCol lg={{ span: 8, offset: 2 }}>
  45. {hasPendingPlan && (
  46. <OLNotification
  47. className="mb-4"
  48. aria-live="polite"
  49. content={
  50. <div>
  51. <Trans
  52. i18nKey="pending_subscription_message"
  53. values={{
  54. planName: personalSubscription?.pendingPlan?.name,
  55. activationDate: nextPaymentDueDate,
  56. }}
  57. shouldUnescape
  58. tOptions={{ interpolation: { escapeValue: true } }}
  59. components={[
  60. // eslint-disable-next-line react/jsx-key
  61. <strong />,
  62. ]}
  63. />
  64. </div>
  65. }
  66. type="success"
  67. />
  68. )}
  69. {fromPlansPage && (
  70. <OLNotification
  71. className="mb-4"
  72. aria-live="polite"
  73. content={t('you_already_have_a_subscription')}
  74. type="warning"
  75. />
  76. )}
  77. {hasRedirectedPaymentError && (
  78. <OLNotification
  79. className="mb-4"
  80. aria-live="polite"
  81. content={
  82. <Trans
  83. i18nKey="payment_error_generic"
  84. components={[
  85. /* eslint-disable-next-line jsx-a11y/anchor-has-content, react/jsx-key */
  86. <a href="/contact" target="_blank" />,
  87. ]}
  88. />
  89. }
  90. type="error"
  91. />
  92. )}
  93. <RedirectAlerts />
  94. <OLPageContentCard>
  95. <div className="page-header">
  96. <h1>{t('your_subscriptions')}</h1>
  97. </div>
  98. <div>
  99. <PersonalSubscription />
  100. <ManagedGroupSubscriptions />
  101. <ManagedInstitutions />
  102. <ManagedPublishers />
  103. <GroupSubscriptionMemberships />
  104. <InstitutionMemberships />
  105. {!personalSubscription && hasAiAssistViaWritefull && (
  106. <div className="mb-4">
  107. <h2 className="h3 fw-bold">{t('add_ons')}</h2>
  108. <WritefullManagedBundleAddOn />
  109. </div>
  110. )}
  111. {hasValidActiveSubscription && (
  112. <PremiumFeaturesLink subscription={personalSubscription} />
  113. )}
  114. {!hasDisplayedSubscription &&
  115. (hasSubscription ? <ContactSupport /> : <FreePlan />)}
  116. </div>
  117. </OLPageContentCard>
  118. </OLCol>
  119. </OLRow>
  120. </div>
  121. )
  122. }
  123. export default SubscriptionDashboard