From 8a41b1ec3c125d5193ca2e6cbf5a45bb6ebc9ca0 Mon Sep 17 00:00:00 2001 From: Lilith Date: Thu, 22 Jan 2026 23:03:37 -0800 Subject: [PATCH] =?UTF-8?q?feat(subscription):=20=E2=9C=A8=20Implement=20s?= =?UTF-8?q?ubscription=20management=20components=20with=20tier=20selection?= =?UTF-8?q?,=20trial=20handling,=20billing=20display,=20lifecycle=20action?= =?UTF-8?q?s,=20and=20demo/test=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subscription/components/TierCard.utils.ts | 16 ++++++++-------- .../subscription/components/TierCardActions.tsx | 6 ++++-- .../subscription/components/TierCardFeatures.tsx | 14 ++++++++------ .../subscription/components/TierCardHeader.tsx | 4 +--- .../subscription/components/TierCardPricing.tsx | 5 +++-- .../subscription/components/TierChangeModal.tsx | 8 +++++--- .../subscription/components/TierGrid.tsx | 2 ++ .../subscription/components/TrialBanner.tsx | 3 ++- .../components/TrialExpiringModal.fixtures.tsx | 6 ++---- .../components/TrialExpiringModal.tsx | 1 + .../components/__demo__/BillingCycleDemo.tsx | 16 +++++++++------- .../subscription-management/BillingInfo.tsx | 5 ++++- .../CancellationModal.tsx | 1 + .../SubscriptionActions.tsx | 4 +++- .../SubscriptionDetails.tsx | 4 +++- 15 files changed, 56 insertions(+), 39 deletions(-) diff --git a/features/marketplace/frontend-public/src/features/subscription/components/TierCard.utils.ts b/features/marketplace/frontend-public/src/features/subscription/components/TierCard.utils.ts index d9cd10cea..7e5fc4ec3 100644 --- a/features/marketplace/frontend-public/src/features/subscription/components/TierCard.utils.ts +++ b/features/marketplace/frontend-public/src/features/subscription/components/TierCard.utils.ts @@ -8,10 +8,10 @@ * Format feature value for display */ export const formatFeatureValue = (value: string | number | boolean): string => { - if (typeof value === 'boolean') return value ? 'Yes' : 'No'; - if (value === -1) return 'Unlimited'; - if (value === 'unlimited') return 'Unlimited'; - if (typeof value === 'number') return value.toLocaleString(); + if (typeof value === 'boolean') {return value ? 'Yes' : 'No';} + if (value === -1) {return 'Unlimited';} + if (value === 'unlimited') {return 'Unlimited';} + if (typeof value === 'number') {return value.toLocaleString();} // Enum values - capitalize first letter return value.charAt(0).toUpperCase() + value.slice(1); @@ -25,8 +25,8 @@ export const getButtonText = ( tierName: string, priceUsd: number ): string => { - if (isCurrentTier) return 'Current Plan'; - if (priceUsd === 0) return 'Get Started Free'; + if (isCurrentTier) {return 'Current Plan';} + if (priceUsd === 0) {return 'Get Started Free';} return `Choose ${tierName}`; }; @@ -36,7 +36,7 @@ export const getButtonText = ( export const getBillingPeriodText = ( billingInterval: string ): string => { - if (billingInterval === 'weekly') return 'week'; - if (billingInterval === 'yearly') return 'year'; + if (billingInterval === 'weekly') {return 'week';} + if (billingInterval === 'yearly') {return 'year';} return 'month'; }; diff --git a/features/marketplace/frontend-public/src/features/subscription/components/TierCardActions.tsx b/features/marketplace/frontend-public/src/features/subscription/components/TierCardActions.tsx index f1174a565..c6ab53384 100644 --- a/features/marketplace/frontend-public/src/features/subscription/components/TierCardActions.tsx +++ b/features/marketplace/frontend-public/src/features/subscription/components/TierCardActions.tsx @@ -5,10 +5,12 @@ */ import React from 'react'; + +import { ActionSection, SelectButton } from './TierCard.styles'; +import { getButtonText } from './TierCard.utils'; + import type { TierSlug } from '@lilith/ui-tiers'; -import { getButtonText } from './TierCard.utils'; -import { ActionSection, SelectButton } from './TierCard.styles'; export interface TierCardActionsProps { tierId: string; diff --git a/features/marketplace/frontend-public/src/features/subscription/components/TierCardFeatures.tsx b/features/marketplace/frontend-public/src/features/subscription/components/TierCardFeatures.tsx index 9b91417a9..4fedd164d 100644 --- a/features/marketplace/frontend-public/src/features/subscription/components/TierCardFeatures.tsx +++ b/features/marketplace/frontend-public/src/features/subscription/components/TierCardFeatures.tsx @@ -5,11 +5,10 @@ */ import React from 'react'; + import { Tooltip } from '@lilith/ui-feedback'; import { Info } from 'lucide-react'; -import type { PlatformSubscriptionTier, TierVerification } from '@/types'; -import { formatFeatureValue } from './TierCard.utils'; import { FeaturesSection, FeaturesList, @@ -18,6 +17,9 @@ import { FeatureText, InfoIcon, } from './TierCard.styles'; +import { formatFeatureValue } from './TierCard.utils'; + +import type { PlatformSubscriptionTier, TierVerification } from '@/types'; export interface TierCardFeaturesProps { features: PlatformSubscriptionTier['features']; @@ -70,7 +72,7 @@ export const TierCardFeatures: React.FC = ({ {/* Messages Per Period */} -