import React from 'react'; import { Link } from 'react-router-dom'; interface TrialBannerProps { trialDays: number; planLabel?: string | null; creditsUsed: number; creditsGranted: number; talkToSpecialistUrl?: string; choosePlanTo?: string; } const DEFAULT_TALK_TO_SPECIALIST_URL: string = 'https://calendly.com/better-zty/meeting-with-recomaze'; const TOTAL_TRIAL_DAYS: number = 7; export function TrialBanner({ trialDays, planLabel, creditsUsed, creditsGranted, talkToSpecialistUrl = DEFAULT_TALK_TO_SPECIALIST_URL, choosePlanTo = '/pricing', }: TrialBannerProps) { if (trialDays <= 0) return null; const currentDayIndex: number = Math.max( 0, Math.min(TOTAL_TRIAL_DAYS - 1, trialDays - 1) ); const safeGranted: number = Math.max(1, creditsGranted); const usageRatio: number = Math.min( 1, Math.max(0, creditsUsed / safeGranted) ); return (

{trialDays} day{trialDays === 1 ? '' : 's'} left in your trial

{planLabel ? `${planLabel} ` : ''} · auto-converts unless you choose a plan ·{' '} {creditsUsed.toLocaleString()} of{' '} {creditsGranted.toLocaleString()} credits used

{Array.from({ length: TOTAL_TRIAL_DAYS }).map( (_unused, bucketIndex) => { const isPast: boolean = bucketIndex > currentDayIndex; const isCurrent: boolean = bucketIndex === currentDayIndex; const fillClass: string = isPast ? 'bg-gray-200' : isCurrent ? 'bg-[#B7007C] trial-bucket-pulse' : 'bg-emerald-500'; return ( ); } )}
Talk to a specialist Choose plan
); }