import { Link } from "@tanstack/react-router"; import { ArrowRight, Clock, Sparkles, Zap } from "lucide-react"; import { useSubscription, useTrialDaysRemaining } from "@/lib/billing"; import { cn } from "@/lib/utils"; import { formatDate } from "@/lib/format"; /** * Banner d'enforcement plan Free. * * - "Essai" : essai 14 j actif → countdown rubis (toujours affiché) * - Hidden : plan Pro/Business OU période de grâce active * - "Approche" : ratio ≥ 80 % du quota → ton conseil * - "Atteinte" : ratio ≥ 100 % du quota → ton blocant + CTA upgrade * * Posé en haut de /factures et /factures/import. Pas dans le dashboard * pour ne pas polluer la lecture des KPIs. */ export function PlanLimitBanner({ className }: { className?: string }) { const { data: sub } = useSubscription(); const trialDays = useTrialDaysRemaining(); if (!sub) return null; // Essai 14 j Pro actif → countdown discret rubis-glow, toujours visible // pendant la fenêtre. Pas blocant — l'user a accès Pro complet. if (sub.inTrial && trialDays !== null) { const dayLabel = trialDays > 1 ? "jours" : "jour"; return (
); } if (sub.plan !== "free") return null; const limit = sub.caps.activeInvoicesLimit; if (limit === null) return null; // En grace period → on affiche un mini-rappel doux, pas un blocking banner. if (sub.inGracePeriod && sub.gracePeriodEndsAt) { return (
); } const ratio = sub.activeInvoicesCount / limit; if (ratio < 0.8) return null; const reached = sub.activeInvoicesCount >= limit; return (
); }