'use client'; import { Fragment, useState } from 'react'; import { Dialog, Transition } from '@headlessui/react'; import { XMarkIcon, SparklesIcon, } from '@heroicons/react/24/outline'; interface CreatePlanModalProps { isOpen: boolean; onClose: () => void; onSuccess: (plan: any) => void; } interface CreatePlanForm { name: string; slug: string; description: string; min_users: number; max_users: number; monthly_price: string; annual_price: string; features: string; differentiators: string; storage_gb: number; is_active: boolean; } function classNames(...classes: string[]) { return classes.filter(Boolean).join(' '); } export default function CreatePlanModal({ isOpen, onClose, onSuccess }: CreatePlanModalProps) { const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [formData, setFormData] = useState({ name: '', slug: '', description: '', min_users: 1, max_users: 30, monthly_price: '', annual_price: '', features: '', differentiators: '', storage_gb: 1, is_active: true, }); const handleChange = (e: React.ChangeEvent) => { const { name, value, type } = e.target; if (type === 'checkbox') { setFormData(prev => ({ ...prev, [name]: (e.target as HTMLInputElement).checked, })); } else if (type === 'number') { setFormData(prev => ({ ...prev, [name]: parseFloat(value) || 0, })); } else { setFormData(prev => ({ ...prev, [name]: value, })); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); setError(''); try { // Validações básicas if (!formData.name || !formData.slug) { setError('Nome e Slug são obrigatórios'); setLoading(false); return; } const token = localStorage.getItem('token'); // Parse features e differentiators const features = formData.features .split(',') .map(f => f.trim()) .filter(f => f.length > 0); const differentiators = formData.differentiators .split(',') .map(d => d.trim()) .filter(d => d.length > 0); const payload = { name: formData.name, slug: formData.slug, description: formData.description, min_users: formData.min_users, max_users: formData.max_users, monthly_price: formData.monthly_price ? parseFloat(formData.monthly_price) : null, annual_price: formData.annual_price ? parseFloat(formData.annual_price) : null, features, differentiators, storage_gb: formData.storage_gb, is_active: formData.is_active, }; const response = await fetch('/api/admin/plans', { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify(payload), }); if (!response.ok) { const error = await response.json(); throw new Error(error.message || 'Erro ao criar plano'); } const data = await response.json(); onSuccess(data.plan); onClose(); } catch (err: any) { setError(err.message); } finally { setLoading(false); } }; const handleClose = () => { if (!loading) { setError(''); setFormData({ name: '', slug: '', description: '', min_users: 1, max_users: 30, monthly_price: '', annual_price: '', features: '', differentiators: '', storage_gb: 1, is_active: true, }); onClose(); } }; return (
{/* Header */}
Criar Novo Plano

Configure um novo plano de assinatura para as agências.

{/* Error Message */} {error && (

{error}

)}
{/* Row 1: Nome e Slug */}
{/* Descrição */}