import React, { useState, useEffect } from 'react'; import { CreditCard, CheckCircle, RefreshCw, AlertTriangle, Play, Calendar, DollarSign, ShieldCheck, ArrowRight, ExternalLink, QrCode } from 'lucide-react'; import { SubscriptionStatus, SubscriptionPayment } from '../types'; interface SubscriptionViewProps { user: { name: string; email: string; subscriptionStatus: SubscriptionStatus; } | null; token: string | null; onStatusUpdate: (newStatus: SubscriptionStatus) => void; } export default function SubscriptionView({ user, token, onStatusUpdate }: SubscriptionViewProps) { const [payments, setPayments] = useState([]); const [subStatus, setSubStatus] = useState(user ? user.subscriptionStatus : null); const [isLoading, setIsLoading] = useState(true); // Checkout flow state const [billingType, setBillingType] = useState<'PIX' | 'CREDIT_CARD' | 'BOLETO'>('PIX'); const [cardName, setCardName] = useState(''); const [cardNumber, setCardNumber] = useState(''); const [cardExpiry, setCardExpiry] = useState(''); const [cardCvv, setCardCvv] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [successPayload, setSuccessPayload] = useState(null); const [checkoutError, setCheckoutError] = useState(null); const [enableBoleto, setEnableBoleto] = useState(true); useEffect(() => { fetchSubscriptionDetails(); if (token) { fetch('/api/settings', { headers: { 'Authorization': `Bearer ${token}` } }) .then(res => res.json()) .then(data => { if (data && data.enableBoleto === false) { setEnableBoleto(false); } }) .catch(() => {}); } }, []); const fetchSubscriptionDetails = async () => { setIsLoading(true); try { const res = await fetch('/api/subscription/status', { headers: { 'Authorization': `Bearer ${token}` } }); if (res.ok) { const data = await res.json(); setSubStatus(data.status); setPayments(data.payments); onStatusUpdate(data.status); } } catch (err) { console.error('Error fetching subscription status:', err); } finally { setIsLoading(false); } }; const handleCheckout = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); setCheckoutError(null); setSuccessPayload(null); const creditCardInfo = billingType === 'CREDIT_CARD' ? { creditCard: { holderName: cardName, number: cardNumber.replace(/\s+/g, ''), expiryMonth: cardExpiry.split('/')[0]?.trim(), expiryYear: '20' + cardExpiry.split('/')[1]?.trim(), ccv: cardCvv }, creditCardHolderInfo: { name: cardName, email: user?.email, cpfCnpj: '000.000.000-00', postalCode: '01001-000', addressNumber: '123', phone: '11999999999' } } : undefined; try { const res = await fetch('/api/subscription/subscribe', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ billingType, creditCardInfo }) }); const data = await res.json(); if (!res.ok) { throw new Error(data.error || 'Erro ao processar assinatura'); } setSuccessPayload(data); // Wait a moment and fetch updated profile status await fetchSubscriptionDetails(); } catch (err: any) { setCheckoutError(err.message || 'Erro de rede. Tente novamente.'); } finally { setIsSubmitting(false); } }; const getStatusColor = (status: SubscriptionStatus) => { switch (status) { case 'ACTIVE': return 'text-emerald-500 bg-emerald-500/10 border-emerald-500/20'; case 'TRIAL': return 'text-amber-500 bg-amber-500/10 border-amber-500/20'; case 'OVERDUE': return 'text-red-500 bg-red-500/10 border-red-500/20'; case 'CANCELED': return 'text-zinc-400 bg-zinc-800 border-zinc-700'; default: return 'text-zinc-500 bg-zinc-800 border-zinc-700'; } }; const getStatusLabel = (status: SubscriptionStatus) => { switch (status) { case 'ACTIVE': return 'Assinatura Ativa'; case 'TRIAL': return 'Acesso de Avaliação (Trial)'; case 'OVERDUE': return 'Fatura Vencida / Inadimplente'; case 'CANCELED': return 'Assinatura Cancelada'; default: return status; } }; const getPaymentStatusTag = (status: string) => { switch (status) { case 'CONFIRMED': case 'RECEIVED': return ✓ PAGO; case 'PENDING': return ● AGUARDANDO; case 'OVERDUE': return ⚠ VENCIDO; default: return {status}; } }; if (isLoading) { return (

Buscando faturas e status financeiro...

); } return (
{/* Top Title */}

Gestão de Assinatura & Cobranças

Veja seus comprovantes, históricos de faturamento e mude seu plano de estudos.

{/* Main Grid: Status summary left, checkout right */}
{/* Left Hand: Current Plan details & invoice history */}

Sua Conta

{user?.name}

{user?.email}

Status Atual do Acesso

{subStatus && (
{getStatusLabel(subStatus)}
)} {subStatus === 'TRIAL' && (

Seu período de teste está ativo. Para continuar com acesso ilimitado a todos os cursos, módulos e certificados, ative sua assinatura mensal abaixo.

)} {subStatus === 'ACTIVE' && (

Acesso integral liberado a todos os cursos de informática, hardware e servidores!

)} {subStatus === 'OVERDUE' && (

Seu acesso foi bloqueado por falta de pagamento. Regularize via Pix ou Cartão para liberar.

)}
{/* Past Payments History */}

Faturas e Segunda Via

{payments.length === 0 ? (

Nenhum pagamento registrado nesta conta.

) : ( payments.map(pay => (
R$ {pay.value.toFixed(2)} {getPaymentStatusTag(pay.status)}

Vence em: {new Date(pay.dueDate).toLocaleDateString('pt-BR')}

Boleto / Pix / Detalhes
)) )}
{/* Right Hand: Checkout Form (Create Subscription) */}

Assine o Plano Ilimitado

Trilha completa da Plataforma por apenas R$ 49,90/mês

{/* Billing Types Toggle */}
{enableBoleto && ( )}
{/* Error alerts */} {checkoutError && (
{checkoutError}
)} {/* SUCCESS PAYLOAD (PIX QR CODE OR CREDIT CARD CLEAR) */} {successPayload ? (

Inscrição criada com sucesso!

Sua assinatura está sendo faturada e integrada com o Asaas.

{billingType === 'PIX' && (

Para sua segurança, os pagamentos recorrentes via PIX e Boleto são processados diretamente no ambiente seguro do Asaas. Clique no botão abaixo para escanear o QR Code oficial ou copiar a linha digitável.

)}
) : ( /* ACTIVE CHECKOUT FORM */
{billingType === 'CREDIT_CARD' ? (
setCardName(e.target.value)} placeholder="Ex: SIDNEY GOMES" className="w-full glass-input rounded-lg p-2.5 text-xs text-white focus:outline-none" />
setCardNumber(e.target.value.replace(/\s?/g, '').replace(/(\d{4})/g, '$1 ').trim())} placeholder="4551 1234 5678 9012" className="w-full glass-input rounded-lg p-2.5 text-xs text-white focus:outline-none" />
setCardExpiry(e.target.value)} className="w-full glass-input rounded-lg p-2.5 text-xs text-white focus:outline-none" />
setCardCvv(e.target.value)} className="w-full glass-input rounded-lg p-2.5 text-xs text-white focus:outline-none" />
) : ( /* PIX or BOLETO Info */

Informações da Assinatura:

- Faturamento recorrente mensal (R$ 49,90) via {billingType}.

- O link para pagamento, Pix Copia e Cola e código de barras serão gerados dinamicamente de forma integrada com a API oficial do Asaas.

)}
)}
); }