feat: separate renewal and purchase flows in multi-tariff mode

Renewal flow (per-subscription):
- New /subscriptions/:id/renew page showing only period options for
  the specific tariff with balance display and renew button
- PurchaseCTAButton links to /renew in multi-tariff mode

Purchase flow (new tariffs only):
- Hide already purchased tariffs (is_purchased flag from backend)
- Fallback UI when all tariffs are owned
- Types: added is_purchased, all_tariffs_purchased fields
This commit is contained in:
c0mrade
2026-03-24 10:47:49 +03:00
parent a709ddbec2
commit 82eb03dec9
6 changed files with 280 additions and 3 deletions

View File

@@ -5,9 +5,14 @@ import type { Subscription } from '../../types';
interface PurchaseCTAButtonProps {
subscription: Subscription | null;
/** In multi-tariff mode, link to /subscriptions/:id/renew instead of /subscription/purchase */
isMultiTariff?: boolean;
}
export default function PurchaseCTAButton({ subscription }: PurchaseCTAButtonProps) {
export default function PurchaseCTAButton({
subscription,
isMultiTariff = false,
}: PurchaseCTAButtonProps) {
const { t } = useTranslation();
const isExpired = !subscription || (!subscription.is_active && !subscription.is_trial);
@@ -27,8 +32,14 @@ export default function PurchaseCTAButton({ subscription }: PurchaseCTAButtonPro
? t('subscription.cta.trialHint')
: t('subscription.cta.activeHint');
// In multi-tariff mode: renew goes to per-subscription renew page
const linkTo =
isMultiTariff && subscription?.id
? `/subscriptions/${subscription.id}/renew`
: '/subscription/purchase';
return (
<Link to="/subscription/purchase" className="block">
<Link to={linkTo} className="block">
<HoverBorderGradient
accentColor={accentColor}
duration={4}