import React, { useState } from 'react'; import { User, Server, Bot, ShieldCheck, Wrench, FileText, ArrowRight, ArrowLeft, Send, CheckCircle, AlertCircle, Copy } from 'lucide-react'; // --- CONFIGURAZIONE API --- const API_ENDPOINT = "https://api.example.com/v1/requirements"; const API_KEY_HEADER = "X-Api-Key"; // Se necessario const API_KEY_VALUE = ""; // Inserire chiave se necessaria export default function App() { const [step, setStep] = useState(0); const [isSubmitting, setIsSubmitting] = useState(false); const [submitStatus, setSubmitStatus] = useState(null); // 'success', 'error' const [payloadPreview, setPayloadPreview] = useState(""); // Stato unico per tutti i dati del form const [formData, setFormData] = useState({ // Metadata commerciale: '', cliente: '', data: new Date().toISOString().split('T')[0], // Step 1: Gestionale gestionale_obiettivo: '', gestionale_utenti_interni: '', gestionale_utenti_esterni: false, gestionale_device: 'desktop', // desktop, web, app gestionale_entita: '', gestionale_migrazione: 'nessuna', // nessuna, excel, legacy // Step 2: Automazioni automazione_trigger: '', automazione_azione: '', automazione_software_a: '', automazione_software_b: '', automazione_frequenza: 'bassa', // Step 3: Compliance compliance_dati: [], // array di stringhe compliance_retention: '', compliance_hosting: 'cloud', // Step 4: Manutenzione manutenzione_tipo: 'standard', manutenzione_budget: '', manutenzione_deadline: '', // Step 5: Extra note_finali: '' }); // Gestione input generica const handleChange = (e) => { const { name, value, type, checked } = e.target; if (type === 'checkbox' && name === 'compliance_dati') { // Gestione array per checkbox multiple let updatedList = [...formData.compliance_dati]; if (checked) { updatedList.push(value); } else { updatedList = updatedList.filter((item) => item !== value); } setFormData({ ...formData, compliance_dati: updatedList }); } else if (type === 'checkbox') { setFormData({ ...formData, [name]: checked }); } else { setFormData({ ...formData, [name]: value }); } }; // Navigazione const nextStep = () => setStep((prev) => Math.min(prev + 1, steps.length - 1)); const prevStep = () => setStep((prev) => Math.max(prev - 1, 0)); // Invio Dati const handleSubmit = async () => { setIsSubmitting(true); const payload = JSON.stringify(formData, null, 2); setPayloadPreview(payload); try { // Simulazione o Invio Reale const response = await fetch(API_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', [API_KEY_HEADER]: API_KEY_VALUE }, body: payload }); if (response.ok) { setSubmitStatus('success'); } else { // Fallback per demo (visto che example.com darà 404/405) console.warn("API Error (Expected in demo):", response.status); setSubmitStatus('error'); } } catch (error) { console.error("Network Error:", error); setSubmitStatus('error'); } finally { setIsSubmitting(false); nextStep(); // Vai alla schermata finale } }; const copyToClipboard = () => { navigator.clipboard.writeText(payloadPreview); alert("Dati copiati negli appunti!"); }; // Definizione degli Step const steps = [ { id: 0, title: "Start", icon: User, color: "bg-blue-500" }, { id: 1, title: "Gestionale", icon: Server, color: "bg-indigo-500" }, { id: 2, title: "Automazione", icon: Bot, color: "bg-purple-500" }, { id: 3, title: "GDPR", icon: ShieldCheck, color: "bg-red-500" }, { id: 4, title: "Service", icon: Wrench, color: "bg-orange-500" }, { id: 5, title: "Note", icon: FileText, color: "bg-gray-500" }, { id: 6, title: "Fine", icon: Send, color: "bg-green-500" }, ]; const currentStepData = steps[step]; return (
Chiedi sempre se hanno accesso API o admin.
Usa questo spazio per dettagli tecnici non coperti dal wizard, sensazioni sul cliente o vincoli particolari.
Il team tecnico ha ricevuto i requisiti.
L'API non è raggiungibile (normale in questa demo).
Copia il report qui sotto e invialo manualmente.
{payloadPreview}