"use client"; import { useState } from "react"; import { createFileRoute } from "@tanstack/react-router"; import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; import { CalendarClock, CreditCard, ExternalLink, Loader2 } from "lucide-react"; import { toast } from "sonner"; import { useSubscription } from "@/hooks/use-profile"; import { useQuery } from "@tanstack/react-query"; import { supabase } from "@/integrations/supabase/client"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; export const Route = createFileRoute("/painel/faturamento")({ component: BillingPage, }); function BillingPage() { const { data: subscription, isLoading } = useSubscription(); const [portalLoading, setPortalLoading] = useState(false); const { data: plan } = useQuery({ queryKey: ["plan", subscription?.plan_id], enabled: !!subscription?.plan_id, queryFn: async () => { const { data } = await supabase .from("plans") .select("*") .eq("id", subscription!.plan_id!) .maybeSingle(); return data; }, }); const openPortal = async () => { setPortalLoading(true); try { const { data, error } = await supabase.functions.invoke("create-portal-session"); if (error || !data?.url) { toast.error("Não foi possível abrir o portal. Tente novamente."); return; } window.open(data.url, "_blank", "noopener,noreferrer"); } finally { setPortalLoading(false); } }; return (

Faturamento

Gerencie sua assinatura, método de pagamento e histórico.

{isLoading ? ( ) : (

Plano atual

{subscription && plan ? (

Status

{statusLabel(subscription.status)}

{subscription.cancel_at_period_end && (subscription.status === "active" || subscription.status === "trialing") && ( {subscription.current_period_end ? `Cancelamento em ${format(new Date(subscription.current_period_end), "d 'de' MMM 'de' yyyy", { locale: ptBR })}` : "Cancelamento agendado"} )}
) : (

Você ainda não possui uma assinatura ativa.

)}
)}

Histórico de pagamentos

Seu histórico aparecerá aqui após a primeira cobrança.

Método de pagamento

Nenhum método cadastrado
); } function Field({ label, value }: { label: string; value: string }) { return (

{label}

{value}

); } function statusLabel(s: string): string { return { active: "Ativa", trialing: "Em período de teste", past_due: "Pagamento pendente", canceled: "Cancelada", incomplete: "Em provisionamento", incomplete_expired: "Expirada", unpaid: "Não paga", }[s] || s; }