From 86c3dccf1a7f5f3f5a0623f902e78aef0ad27200 Mon Sep 17 00:00:00 2001 From: Leon Date: Thu, 15 Jan 2026 15:03:06 +0100 Subject: [PATCH] feat: subscription packs --- src/screens/Subscriptions.js | 125 +++++++++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 6 deletions(-) diff --git a/src/screens/Subscriptions.js b/src/screens/Subscriptions.js index 23b48a8..29dbd41 100644 --- a/src/screens/Subscriptions.js +++ b/src/screens/Subscriptions.js @@ -76,6 +76,9 @@ function SubscriptionCard({ plan, selected, onSelect, isAnnual }) { typeof plan?.coinsPerMonth === 'number' && Number.isFinite(plan.coinsPerMonth) ? Math.round(plan.coinsPerMonth) : null + const details = planKey ? PLAN_DETAILS[planKey] : null + const isPopular = details?.popular + const planBadgeKey = planKey const planBadgeSource = planBadgeKey && subBadges[planBadgeKey] ? subBadges[planBadgeKey] : null const handleSelect = React.useCallback(() => { @@ -92,6 +95,7 @@ function SubscriptionCard({ plan, selected, onSelect, isAnnual }) { selected && styles.cardWrapperSelected, pressed && styles.cardWrapperPressed, plan?.active === false && styles.cardWrapperInactive, + isPopular && styles.cardWrapperPopular, ]} accessibilityRole="button" accessibilityState={{ selected, disabled: plan?.active === false }} @@ -105,6 +109,7 @@ function SubscriptionCard({ plan, selected, onSelect, isAnnual }) { ) : null} + {planName} @@ -127,7 +132,10 @@ function SubscriptionCard({ plan, selected, onSelect, isAnnual }) { {intervalLabel ? {intervalLabel} : null} ) : null} - {coinsPerMonth !== null ? ( + + {details?.creditsLabel ? ( + {details.creditsLabel} + ) : coinsPerMonth !== null ? ( - • Eligible au concours mensuel chanson/Vidéo - • Crédits gratuits tous les mois + Privilège Membre : + {details?.privileges?.map((item, index) => ( + + + {item.bold ? `• ${item.text}` : item.text} + + {item.subItems ? ( + + {item.subItems.join(' - ')} + + ) : null} + + )) || ( + <> + + • Eligible au concours mensuel chanson/Vidéo + + • Crédits gratuits tous les mois + + )} + + {isPopular ? ( + + Le plus populaire ! + + ) : null} {isAnnual ? ( @@ -208,6 +240,36 @@ const PLAN_DISPLAY_NAME_BY_KEY = { premium: 'Play Backer Gold', } +const PLAN_DETAILS = { + starter: { + creditsLabel: '50 Crédits / Mois', + popular: false, + privileges: [ + { text: 'Eligible au concours mensuel chanson/Vidéo', bold: true }, + { text: 'Catégorie Chanson :', subItems: ['Top 1: 500 €', 'Top 2: 250 €', 'Top 3: 125 €'] }, + { text: 'Catégorie Vidéo :', subItems: ['Top 1: 1000 €', 'Top 2: 500 €', 'Top 3: 250 €'] }, + ], + }, + pro: { + creditsLabel: '100 crédits + 50 offerts / Mois', + popular: true, + privileges: [ + { text: 'Eligible au concours mensuel chanson/Vidéo', bold: true }, + { text: 'Catégorie Chanson :', subItems: ['Top 1: 500 €', 'Top 2: 250 €', 'Top 3: 125 €'] }, + { text: 'Catégorie Vidéo :', subItems: ['Top 1: 1000 €', 'Top 2: 500 €', 'Top 3: 250 €'] }, + ], + }, + premium: { + creditsLabel: '150 Crédits + 100 offerts / Mois', + popular: false, + privileges: [ + { text: 'Eligible au concours mensuel chanson/Vidéo', bold: true }, + { text: 'Catégorie Chanson :', subItems: ['Top 1: 500 €', 'Top 2: 250 €', 'Top 3: 125 €'] }, + { text: 'Catégorie Vidéo :', subItems: ['Top 1: 1000 €', 'Top 2: 500 €', 'Top 3: 250 €'] }, + ], + }, +} + const getPlanKeyForBadge = (plan) => { if (!plan || typeof plan !== 'object') { return null @@ -621,7 +683,7 @@ export default function Subscriptions() {