personal-subscription.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { Trans, useTranslation } from 'react-i18next'
  2. import { PaidSubscription } from '../../../../../../types/subscription/dashboard/subscription'
  3. import { PausedSubscription } from './states/active/paused'
  4. import { ActiveSubscription } from '@/features/subscription/components/dashboard/states/active/active'
  5. import { CanceledSubscription } from './states/canceled'
  6. import { ExpiredSubscription } from './states/expired'
  7. import { useSubscriptionDashboardContext } from '../../context/subscription-dashboard-context'
  8. import PersonalSubscriptionSyncEmail from './personal-subscription-sync-email'
  9. import OLNotification from '@/shared/components/ol/ol-notification'
  10. function PastDueSubscriptionAlert({
  11. subscription,
  12. }: {
  13. subscription: PaidSubscription
  14. }) {
  15. const { t } = useTranslation()
  16. return (
  17. <OLNotification
  18. type="error"
  19. content={
  20. <>
  21. {t('account_has_past_due_invoice_change_plan_warning')}{' '}
  22. <a
  23. href={subscription.payment.accountManagementLink}
  24. target="_blank"
  25. rel="noreferrer noopener"
  26. >
  27. {t('view_your_invoices')}
  28. </a>
  29. </>
  30. }
  31. />
  32. )
  33. }
  34. function PersonalSubscriptionStates({
  35. subscription,
  36. }: {
  37. subscription: PaidSubscription
  38. }) {
  39. const { t } = useTranslation()
  40. const state = subscription?.payment.state
  41. if (state === 'active') {
  42. // This version handles subscriptions with and without addons
  43. return <ActiveSubscription subscription={subscription} />
  44. } else if (state === 'canceled') {
  45. return <CanceledSubscription subscription={subscription} />
  46. } else if (state === 'expired') {
  47. return <ExpiredSubscription subscription={subscription} />
  48. } else if (state === 'paused') {
  49. return <PausedSubscription subscription={subscription} />
  50. } else {
  51. return <>{t('problem_with_subscription_contact_us')}</>
  52. }
  53. }
  54. function PersonalSubscription() {
  55. const { t } = useTranslation()
  56. const { personalSubscription, recurlyLoadError } =
  57. useSubscriptionDashboardContext()
  58. if (!personalSubscription) return null
  59. if (!('payment' in personalSubscription)) {
  60. return (
  61. <p>
  62. <Trans
  63. i18nKey="please_contact_support_to_makes_change_to_your_plan"
  64. components={[<a href="/contact" />]} // eslint-disable-line react/jsx-key, jsx-a11y/anchor-has-content
  65. />
  66. </p>
  67. )
  68. }
  69. return (
  70. <>
  71. {personalSubscription.payment.hasPastDueInvoice && (
  72. <PastDueSubscriptionAlert subscription={personalSubscription} />
  73. )}
  74. <PersonalSubscriptionStates
  75. subscription={personalSubscription as PaidSubscription}
  76. />
  77. {recurlyLoadError && (
  78. <OLNotification
  79. type="warning"
  80. content={<strong>{t('payment_provider_unreachable_error')}</strong>}
  81. />
  82. )}
  83. <hr />
  84. <PersonalSubscriptionSyncEmail />
  85. </>
  86. )
  87. }
  88. export default PersonalSubscription