import React, { useState } from 'react'; import { Send, CheckCircle, AlertCircle, Globe, Server, Check, ArrowRight, ArrowLeft, User, FileText, Target, Layout, Palette, Zap, Lightbulb, Settings, ClipboardCheck, Lock, Cloud, Upload } from 'lucide-react'; import { Button } from './Button'; import { useAuth } from '../context/AuthContext'; import { Link } from 'react-router-dom'; import { supabase, isSupabaseConfigured } from '../lib/supabaseClient'; interface Inspiration { url: string; comment: string; } export const OrderForm: React.FC = () => { const { user, loading } = useAuth(); const [currentStep, setCurrentStep] = useState(1); const [isSubmitted, setIsSubmitted] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [submitError, setSubmitError] = useState(null); const [errors, setErrors] = useState([]); const [privacyAccepted, setPrivacyAccepted] = useState(false); const [aszfAccepted, setAszfAccepted] = useState(false); const totalSteps = 9; const [formData, setFormData] = useState({ // 1. Kapcsolattartás name: '', company: '', email: user?.email || '', phone: '', package: 'Pro Web', // Default selection updated // 2. Bemutatkozás description: '', // 3. Célok goals: [] as string[], goalOther: '', successCriteria: '', // 4. Tartalom content: [] as string[], contentOther: '', existingAssets: 'Nincs' as 'Igen' | 'Nem' | 'Részben', contentLink: '', // New field for drive link // 5. Design primaryColor: '', secondaryColor: '', balanceColor: '', style: [] as string[], targetAudience: '', // 6. Funkciók features: [] as string[], // 7. Inspirációk inspirations: [ { url: '', comment: '' }, { url: '', comment: '' }, { url: '', comment: '' } ] as Inspiration[], // 8. Extrák & Megjegyzések extras: [] as string[], domainName: '', notes: '' }); // Helper arrays const colorOptions = [ { name: 'Piros', value: '#ef4444' }, { name: 'Kék', value: '#3b82f6' }, { name: 'Zöld', value: '#22c55e' }, { name: 'Lila', value: '#a855f7' }, { name: 'Fekete', value: '#171717' }, { name: 'Fehér', value: '#ffffff' }, { name: 'Szürke', value: '#6b7280' }, { name: 'Narancs', value: '#f97316' }, { name: 'Sárga', value: '#eab308' }, { name: 'Türkiz', value: '#14b8a6' }, { name: 'Barna', value: '#78350f' }, ]; const styleOptions = [ 'Modern és letisztult', 'Üzleti és professzionális', 'Fiatalos és energikus', 'Spirituális / nyugodt', 'Természetes / barátságos', 'Luxus / prémium' ]; const steps = [ { id: 1, title: 'Kapcsolat', icon: User }, { id: 2, title: 'Bemutatkozás', icon: FileText }, { id: 3, title: 'Célok', icon: Target }, { id: 4, title: 'Tartalom', icon: Layout }, { id: 5, title: 'Design', icon: Palette }, { id: 6, title: 'Funkciók', icon: Zap }, { id: 7, title: 'Inspirációk', icon: Lightbulb }, { id: 8, title: 'Extrák', icon: Settings }, { id: 9, title: 'Összegzés', icon: ClipboardCheck }, ]; // Auto-fill user data (Name and Email) when user loads React.useEffect(() => { const prefillUserData = async () => { if (!user) return; let emailToSet = user.email || ''; let nameToSet = ''; // 1. Try metadata (from session - fastest) const meta = user.user_metadata; if (meta?.last_name && meta?.first_name) { // Hungarian order: Lastname Firstname nameToSet = `${meta.last_name} ${meta.first_name}`; } // 2. Fallback to DB if Supabase is configured and metadata is missing name if (!nameToSet && isSupabaseConfigured) { try { const { data } = await supabase .from('profiles') .select('first_name, last_name') .eq('id', user.id) .maybeSingle(); if (data?.first_name && data?.last_name) { nameToSet = `${data.last_name} ${data.first_name}`; } } catch (error) { console.error('Error fetching user profile for order form:', error); } } setFormData(prev => { // Only update if fields are empty to avoid overwriting user input if (prev.name && prev.email) return prev; return { ...prev, email: prev.email || emailToSet, name: prev.name || nameToSet }; }); }; prefillUserData(); }, [user]); // If loading auth state, show a skeleton or loader if (loading) { return (
Betöltés...
); } // Auth Protection - Lock Screen if (!user) { return (

Jelentkezzen be a rendeléshez

Weboldal rendelés leadásához kérjük, jelentkezzen be fiókjába, vagy regisztráljon egyet ingyenesen.

A regisztráció mindössze 1 percet vesz igénybe, és segít a projekt későbbi nyomon követésében.

); } const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; const handleCheckboxChange = (category: 'goals' | 'content' | 'style' | 'features' | 'extras', value: string) => { setFormData(prev => { const list = prev[category]; if (list.includes(value)) { return { ...prev, [category]: list.filter(item => item !== value) }; } else { return { ...prev, [category]: [...list, value] }; } }); }; const handleInspirationChange = (index: number, field: 'url' | 'comment', value: string) => { const newInspirations = [...formData.inspirations]; newInspirations[index] = { ...newInspirations[index], [field]: value }; setFormData(prev => ({ ...prev, inspirations: newInspirations })); }; const validateStep = (step: number): boolean => { const newErrors: string[] = []; if (step === 1) { if (!formData.name) newErrors.push('A név megadása kötelező.'); if (!formData.email) newErrors.push('Az e-mail cím megadása kötelező.'); if (!formData.phone) newErrors.push('A telefonszám megadása kötelező.'); } if (newErrors.length > 0) { setErrors(newErrors); return false; } setErrors([]); return true; }; const nextStep = () => { if (validateStep(currentStep)) { if (currentStep < totalSteps) { setCurrentStep(prev => prev + 1); window.scrollTo({ top: document.getElementById('order-form-container')?.offsetTop || 0, behavior: 'smooth' }); } else { handleSubmit(); } } }; const prevStep = () => { if (currentStep > 1) { setCurrentStep(prev => prev - 1); window.scrollTo({ top: document.getElementById('order-form-container')?.offsetTop || 0, behavior: 'smooth' }); } }; const handleSubmit = async () => { setIsSubmitting(true); setSubmitError(null); if (!privacyAccepted) { setSubmitError('A rendelés leadásához el kell fogadnia az Adatkezelési tájékoztatót.'); setIsSubmitting(false); return; } if (!aszfAccepted) { setSubmitError('A rendelés leadásához el kell fogadnia az Általános Szerződési Feltételeket (ÁSZF).'); setIsSubmitting(false); return; } // Determine amount text const amount = formData.package === 'Landing Page' ? '190.000 Ft' : formData.package === 'Pro Web' ? '350.000 Ft' : 'Egyedi Árazás'; if (isSupabaseConfigured && user) { try { const { error } = await supabase.from('orders').insert({ user_id: user.id, customer_name: formData.name, customer_email: formData.email, package: formData.package, status: 'new', amount: amount, details: formData }); if (error) { throw error; } setIsSubmitted(true); window.scrollTo({ top: document.getElementById('order-form-container')?.offsetTop || 0, behavior: 'smooth' }); } catch (err: any) { console.error('Error submitting order:', err); setSubmitError('Hiba történt a rendelés elküldésekor: ' + err.message); } finally { setIsSubmitting(false); } } else { // Fallback for Demo Mode console.log('Demo Mode: Order Data:', formData); await new Promise(resolve => setTimeout(resolve, 1500)); // Simulate delay setIsSubmitted(true); setIsSubmitting(false); window.scrollTo({ top: document.getElementById('order-form-container')?.offsetTop || 0, behavior: 'smooth' }); } }; // Modern Input Style Class - MotionWeb Style const inputClass = "w-full px-4 py-3 rounded-lg border border-gray-200 bg-white text-[#111111] placeholder-gray-400 focus:ring-4 focus:ring-[#4e6bff]/10 focus:border-[#4e6bff] outline-none transition-all shadow-sm"; const labelClass = "text-sm font-semibold text-gray-800 block mb-2"; const checkboxClass = "w-5 h-5 text-[#4e6bff] rounded focus:ring-[#4e6bff] border-gray-300 flex-shrink-0 transition-colors cursor-pointer"; const ColorPickerSection = ({ label, selected, onChange }: { label: string, selected: string, onChange: (color: string) => void }) => (
{colorOptions.map((color) => ( ))}

{selected ? `Választott: ${selected}` : ''}

); if (isSubmitted) { return (

Rendelését sikeresen rögzítettük!

Átirányítjuk az előlegfizetési oldalra. Amennyiben ez nem történik meg, kollégáink hamarosan felveszik Önnel a kapcsolatot.

); } return (
{/* Light Gradient Header & Step Navigation */}

Rendelés Leadása

Töltse ki az űrlapot a pontos ajánlatadáshoz, és segítünk megvalósítani elképzeléseit.

{/* Desktop Stepper Navigation */}
{/* Background Line */}
{/* Active Progress Line */}
{steps.map((step) => { const isActive = step.id === currentStep; const isCompleted = step.id < currentStep; return (
{isCompleted ? : }
{step.title}
); })}
{/* Mobile/Tablet Progress Bar */}
Lépés {currentStep} / {totalSteps} {steps[currentStep - 1].title}
{errors.length > 0 && (

Kérjük, javítsa a következő hibákat:

    {errors.map((err, idx) =>
  • {err}
  • )}
)} {submitError && (
{submitError}
)} {/* Step 1: Kapcsolattartási adatok */} {currentStep === 1 && (

Kapcsolattartási adatok

A bejelentkezett e-mail címed.

{['Landing Page', 'Pro Web', 'Enterprise'].map((pkg) => (
)} {currentStep === 2 && (

A vállalkozás rövid bemutatása

💡 Tipp: Írjon le mindent, amit fontosnak tart a tevékenységével kapcsolatban.

)} {currentStep === 3 && (

Mi a weboldal fő célja?

{['Cég bemutatása', 'Termék / szolgáltatás értékesítés', 'Időpontfoglalás vagy ügyfélszerzés', 'Hírlevél / e-mail lista építése', 'Közösségépítés', 'Egyéb'].map((goal) => (
{goal === 'Egyéb' && formData.goals.includes('Egyéb') && (
)}
))}
)} {currentStep === 4 && (

Tartalom és szerkezet

{['Rólunk', 'Szolgáltatások', 'Termékek', 'Referenciák / Vélemények', 'Blog / Hírek', 'Kapcsolat', 'Egyéb'].map((item) => (
{item === 'Egyéb' && formData.content.includes('Egyéb') && ( )}
))}
{['Igen', 'Nem', 'Részben'].map((opt) => ( ))}
{/* Content Upload / Link Section */} {(formData.existingAssets === 'Igen' || formData.existingAssets === 'Részben') && (

Tartalom megosztása

Kérjük, töltse fel a meglévő tartalmakat (képek, szövegek, logó) egy felhő tárhelyre (pl. Google Drive) és ossza meg a linket, vagy töltsön fel fájlt (max 1GB).

Kattintson a feltöltéshez vagy húzza ide a fájlt

(Max 1GB)

)}
)} {currentStep === 5 && (

Design és stílus

setFormData(prev => ({ ...prev, primaryColor: c }))} /> setFormData(prev => ({ ...prev, secondaryColor: c }))} /> setFormData(prev => ({ ...prev, balanceColor: c }))} />
{styleOptions.map((style) => ( ))}
)} {currentStep === 6 && (

Funkciók és technikai igények

{['Kapcsolatfelvételi űrlap', 'Időpontfoglalás rendszer', 'Hírlevél-feliratkozás', 'Webshop / fizetési lehetőség', 'Blog / hírek', 'Többnyelvűség', 'Képgaléria / videógaléria', 'Google Térkép integráció', 'Chat gomb (Messenger / WhatsApp)'].map((feat) => ( ))}
)} {currentStep === 7 && (

Inspirációk

Segítsen megérteni az ízlését!

Osszon meg velünk 3 weboldalt, ami tetszik, és írja le röviden, miért (pl. színek, elrendezés, hangulat).

{[0, 1, 2].map((i) => (
handleInspirationChange(i, 'url', e.target.value)} placeholder="https://pelda.hu" className={`${inputClass} pl-9`} />
handleInspirationChange(i, 'comment', e.target.value)} placeholder="Színek, elrendezés, animációk..." className={inputClass} />
))}
)} {currentStep === 8 && (

Extra szolgáltatások és Megjegyzések

{['SEO optimalizálás', 'Szövegírás', 'Domain ügyintézés', 'Tárhely ügyintézés'].map((extra) => ( ))}
{/* Dynamic Content */}
{formData.extras.includes('Domain ügyintézés') && (
)} {/* Domain Warning */} {!formData.extras.includes('Domain ügyintézés') && (
Figyelem: Nem jelölte be a domain ügyintézést. Kérjük győződjön meg róla, hogy rendelkezik saját domain névvel, vagy a későbbiekben tudja biztosítani a DNS beállításokat.
)} {!formData.extras.includes('Tárhely ügyintézés') && (
Figyelem: Mivel nem jelölte be a tárhely ügyintézést, a weboldalt átadjuk (forráskód), de az üzemeltetést és a szerver beállítását nem a MotionWeb végzi.
)}
)} {/* Step 9: Összegzés */} {currentStep === 9 && (

Rendelés összesítése

Ellenőrizze az adatokat a véglegesítés előtt.

Kapcsolattartó

{formData.name}

{formData.email}

{formData.phone}

{formData.company &&

{formData.company}

}

Választott Csomag

{formData.package}

Célok

{formData.goals.length > 0 ? formData.goals.map(g => {g}) : Nincs megadva}

Színvilág

{formData.primaryColor &&
c.name === formData.primaryColor)?.value}} title="Főszín">
} {formData.secondaryColor &&
c.name === formData.secondaryColor)?.value}} title="Mellékszín">
} {formData.balanceColor &&
c.name === formData.balanceColor)?.value}} title="Kiegyensúlyozó">
} {!formData.primaryColor && !formData.secondaryColor && !formData.balanceColor && Nincs színválasztás}

Mi történik a rendelés leadása után?

A "Rendelés leadása" gombra kattintva átirányítjuk az előlegfizetési oldalra. A sikeres tranzakciót követően kollégáink 48 órán belül felveszik Önnel a kapcsolatot a megadott elérhetőségeken a projekt indításához.

setPrivacyAccepted(e.target.checked)} className="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded cursor-pointer" />
setAszfAccepted(e.target.checked)} className="h-4 w-4 text-primary focus:ring-primary border-gray-300 rounded cursor-pointer" />
)}
{/* Footer Navigation */}
{currentStep < totalSteps ? ( ) : ( )}
); };