feat: dinamizar exibicao de planos na tela de assinatura a partir do banco de dados
Build and Deploy (Gitea Actions) / build-and-deploy (push) Successful in 2m40s
Details
Build and Deploy (Gitea Actions) / build-and-deploy (push) Successful in 2m40s
Details
This commit is contained in:
parent
c4cb13a912
commit
104974abd1
|
|
@ -1,8 +1,8 @@
|
||||||
'use client';
|
'use client';
|
||||||
import { useState } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Check, Crown, Zap, Building2, Rocket, AlertTriangle, ShieldAlert, CreditCard, QrCode, FileText, CheckCircle2, ShieldCheck } from 'lucide-react';
|
import { Check, Crown, Zap, Building2, Rocket, AlertTriangle, ShieldAlert, CreditCard, QrCode, FileText, CheckCircle2, ShieldCheck } from 'lucide-react';
|
||||||
|
|
||||||
const plans = [
|
const staticPlans = [
|
||||||
{
|
{
|
||||||
name: 'Starter', price: 49.90, icon: Zap, color: '#3b82f6',
|
name: 'Starter', price: 49.90, icon: Zap, color: '#3b82f6',
|
||||||
features: ['1 profissional', '10 serviços', '200 agendamentos/mês', 'Agendamento online', 'Página de reservas', 'Lembretes por e-mail', 'Relatórios básicos']
|
features: ['1 profissional', '10 serviços', '200 agendamentos/mês', 'Agendamento online', 'Página de reservas', 'Lembretes por e-mail', 'Relatórios básicos']
|
||||||
|
|
@ -76,6 +76,46 @@ export default function Subscription({ currentPlan, onPlanChange, isLocked = fal
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [successData, setSuccessData] = useState<any>(null);
|
const [successData, setSuccessData] = useState<any>(null);
|
||||||
const [errorMsg, setErrorMsg] = useState<string | null>(null);
|
const [errorMsg, setErrorMsg] = useState<string | null>(null);
|
||||||
|
const [dbPlans, setDbPlans] = useState<any[]>([]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const fetchSubscriptionData = async () => {
|
||||||
|
const slug = localStorage.getItem('agendapro_tenant_slug') || 'barbearia-premium';
|
||||||
|
try {
|
||||||
|
const res = await fetch(`/api/tenant/subscription?slug=${slug}`);
|
||||||
|
if (res.ok) {
|
||||||
|
const data = await res.json();
|
||||||
|
if (data.plans && data.plans.length > 0) {
|
||||||
|
setDbPlans(data.plans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Erro ao buscar planos da API:', e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fetchSubscriptionData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const iconMap: Record<string, any> = { Starter: Zap, Professional: Crown, Business: Building2, Enterprise: Rocket };
|
||||||
|
const colorMap: Record<string, string> = { Starter: '#3b82f6', Professional: '#6C63FF', Business: '#a855f7', Enterprise: '#f59e0b' };
|
||||||
|
|
||||||
|
const plans = dbPlans.length > 0 ? dbPlans.map(p => {
|
||||||
|
let featuresList: string[] = [];
|
||||||
|
try {
|
||||||
|
if (typeof p.features === 'string') featuresList = JSON.parse(p.features);
|
||||||
|
else if (Array.isArray(p.features)) featuresList = p.features;
|
||||||
|
} catch (e) {}
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: p.id,
|
||||||
|
name: p.name,
|
||||||
|
price: Number(p.price || p.price_monthly || 0),
|
||||||
|
icon: iconMap[p.name] || Crown,
|
||||||
|
color: colorMap[p.name] || '#6C63FF',
|
||||||
|
featured: p.name === 'Professional',
|
||||||
|
features: featuresList.length > 0 ? featuresList : ['Agendamento online']
|
||||||
|
};
|
||||||
|
}) : staticPlans;
|
||||||
|
|
||||||
// Form de cartão
|
// Form de cartão
|
||||||
const [cardHolder, setCardHolder] = useState('');
|
const [cardHolder, setCardHolder] = useState('');
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue