'use client' import { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import { motion, AnimatePresence } from 'motion/react' import { AlertTriangle, Sparkles, Key, X, ArrowRight } from 'lucide-react' import { useLanguage } from '@/lib/i18n' interface InlinePaywallProps { /** Action en cours (pour contexte uniquement — le solde est global) */ feature: string onDismiss: () => void /** Coût de l'action si connu */ creditCost?: number /** Solde restant si connu */ creditsRemaining?: number } export function InlinePaywall({ feature, onDismiss, creditCost, creditsRemaining, }: InlinePaywallProps) { const { t } = useLanguage() const router = useRouter() const [timeLeft, setTimeLeft] = useState(12) useEffect(() => { if (timeLeft <= 0) { onDismiss() return } const timer = setTimeout(() => { setTimeLeft((prev) => prev - 1) }, 1000) return () => clearTimeout(timer) }, [timeLeft, onDismiss]) const handleUpgrade = () => { router.push('/settings/billing') onDismiss() } const handleByok = () => { router.push('/settings/ai#byok') onDismiss() } const featureLabels: Record = { semantic_search: t('usageMeter.featureSearch'), auto_tag: t('usageMeter.featureTags'), auto_title: t('usageMeter.featureTitles'), reformulate: t('usageMeter.featureReformulate'), chat: t('usageMeter.featureChat'), brainstorm_create: t('usageMeter.featureBrainstormSessions'), brainstorm_expand: t('usageMeter.featureBrainstormExpand'), brainstorm_enrich: t('usageMeter.featureBrainstormEnrich'), publish_enhance: t('usageMeter.featurePublishEnhance'), slide_generate: t('usageMeter.featureSlides'), excalidraw_generate: t('usageMeter.featureDiagrams'), ai_flashcard: t('usageMeter.featureFlashcards'), voice_transcribe: t('usageMeter.featureVoice'), credits: t('billing.aiCredits'), } const currentFeatureLabel = featureLabels[feature] || feature let description = t('quotaPaywall.description').replace('{feature}', currentFeatureLabel) if ( typeof creditCost === 'number' && typeof creditsRemaining === 'number' && Number.isFinite(creditCost) && Number.isFinite(creditsRemaining) ) { description = t('quotaPaywall.descriptionWithCost', { remaining: String(creditsRemaining), cost: String(creditCost), feature: currentFeatureLabel, }) } return (

{t('quotaPaywall.title')}

{description}

{t('quotaPaywall.closingIn').replace('{n}', String(timeLeft))}
) }