import { useEffect, useState, type CSSProperties } from "react" import type { SubscriptionCustomization } from "./customization-tab" export type SubscriptionPreviewMode = "single" | "plans" | "buy-once" interface SubscriptionPreviewProps { settings: { button_text: string buy_now_subscribe_label: string buy_now_one_time_label: string buy_now_toggle_style: string buy_now_normal_bg: string buy_now_normal_text: string buy_now_normal_border: string buy_now_hover_bg: string buy_now_hover_text: string buy_now_hover_border: string buy_now_active_bg: string buy_now_active_text: string buy_now_active_border: string buy_now_border_radius: number } customization: SubscriptionCustomization isPro: boolean mode: SubscriptionPreviewMode } type SubscriptionPreviewStyle = CSSProperties & Record<`--swift-commerce-subscription-${string}`, string> function formatLabel(template: string, replacements: Record) { return Object.entries(replacements).reduce( (label, [token, value]) => label.replace(token, value), template, ) } export function SubscriptionPreview({ settings, customization, isPro, mode, }: SubscriptionPreviewProps) { const [selectedPlan, setSelectedPlan] = useState(0) const [purchaseMode, setPurchaseMode] = useState<"subscription" | "one-time">("subscription") const isOutline = customization.buttonStyle === "outline" const style: SubscriptionPreviewStyle = { "--swift-commerce-subscription-button-background": isOutline ? "transparent" : customization.buttonBgColor, "--swift-commerce-subscription-button-color": isOutline ? customization.buttonBgColor : customization.buttonTextColor, "--swift-commerce-subscription-button-border-color": customization.buttonBgColor, "--swift-commerce-subscription-button-border-width": isOutline ? "2px" : "1px", "--swift-commerce-subscription-button-radius": `${customization.buttonBorderRadius}px`, "--swift-commerce-subscription-button-font-size": `${customization.buttonFontSize}px`, "--swift-commerce-subscription-button-font-weight": customization.buttonFontWeight, "--swift-commerce-subscription-button-padding-block": `${customization.buttonPadding}px`, "--swift-commerce-subscription-button-padding-inline": `${customization.buttonPadding * 2}px`, "--swift-commerce-subscription-button-width": customization.buttonWidth === "full" ? "100%" : "max-content", "--swift-commerce-subscription-price-color": customization.priceColor, "--swift-commerce-subscription-price-size": `${customization.priceFontSize}px`, "--swift-commerce-subscription-period-color": customization.periodColor, "--swift-commerce-subscription-period-size": `${customization.periodFontSize}px`, "--swift-commerce-subscription-fee-color": customization.signUpFeeColor, "--swift-commerce-subscription-fee-size": `${customization.signUpFeeFontSize}px`, "--swift-commerce-subscription-trial-color": customization.trialColor, "--swift-commerce-subscription-trial-size": `${customization.trialFontSize}px`, "--swift-commerce-subscription-surface": customization.containerBgColor, "--swift-commerce-subscription-border": customization.containerBorderColor, "--swift-commerce-subscription-radius": `${customization.containerBorderRadius}px`, "--swift-commerce-subscription-padding": `${customization.containerPadding}px`, "--swift-commerce-subscription-fee-display": customization.showSignUpFee ? "block" : "none", "--swift-commerce-subscription-trial-display": customization.showTrialText ? "block" : "none", "--swift-commerce-subscription-font-family": customization.fontFamily || "var(--swift-commerce-font-family)", "--swift-commerce-subscription-buy-now-normal-background": settings.buy_now_normal_bg, "--swift-commerce-subscription-buy-now-normal-color": settings.buy_now_normal_text, "--swift-commerce-subscription-buy-now-normal-border": settings.buy_now_normal_border, "--swift-commerce-subscription-buy-now-hover-background": settings.buy_now_hover_bg, "--swift-commerce-subscription-buy-now-hover-color": settings.buy_now_hover_text, "--swift-commerce-subscription-buy-now-hover-border": settings.buy_now_hover_border, "--swift-commerce-subscription-buy-now-active-background": settings.buy_now_active_bg, "--swift-commerce-subscription-buy-now-active-color": settings.buy_now_active_text, "--swift-commerce-subscription-buy-now-active-border": settings.buy_now_active_border, "--swift-commerce-subscription-buy-now-radius": `${settings.buy_now_border_radius}px`, } const signUpFee = formatLabel(customization.signUpFeeLabel, { "%s": "$50.00" }) const trial = formatLabel(customization.trialLabel, { "%1$d": "7", "%2$s": "days", }) const plans = [ { name: "Monthly", price: "$29.99", period: " / month" }, { name: "Quarterly", price: "$79.00", period: " / 3 months" }, { name: "Annual", price: "$299.00", period: " / year", fee: "+ $20.00 sign-up fee" }, ] const selectedPlanDetails = plans[selectedPlan] const hasBuyOnce = isPro && (mode === "buy-once" || mode === "plans") useEffect(() => { setPurchaseMode("subscription") }, [mode]) const purchaseButton = ( ) const buyOnceSelector = hasBuyOnce ? (
) : null return (
{mode !== "single" ? (
event.preventDefault()} > {buyOnceSelector} {mode === "plans" && ( )} {purchaseButton}
) : (
$ 29.99 {" "} {customization.periodSeparator.trim()} month
{signUpFee} {trial}
{purchaseButton}
)}
) }