"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 (
Gerencie sua assinatura, método de pagamento e histórico.
Status
{statusLabel(subscription.status)}
{subscription.cancel_at_period_end && (subscription.status === "active" || subscription.status === "trialing") && (Você ainda não possui uma assinatura ativa.
)}Seu histórico aparecerá aqui após a primeira cobrança.
{label}
{value}