import React, { useState, useEffect } from 'react'; import { X, Info, CheckCircle, AlertTriangle, MessageSquare, Calendar, ChevronDown, ChevronUp, Wallet, ArrowLeft, RefreshCw, CreditCard } from 'lucide-react'; import { Button } from './Button'; interface FeedbackModalProps { isOpen: boolean; onClose: () => void; onSubmit: (feedbackData: any) => Promise; loading: boolean; order?: any; } export const FeedbackModal: React.FC = ({ isOpen, onClose, onSubmit, loading, order }) => { // --- STATE --- const [mainDecision, setMainDecision] = useState<'approved' | 'minor' | 'major' | null>(null); const [showPayment, setShowPayment] = useState(false); // Approval Flow const [approvalConfirmed, setApprovalConfirmed] = useState(false); // Revision Flow const [designCheckboxes, setDesignCheckboxes] = useState([]); const [designText, setDesignText] = useState(''); const [contentCheckboxes, setContentCheckboxes] = useState([]); const [contentText, setContentText] = useState(''); const [structureCheckboxes, setStructureCheckboxes] = useState([]); const [structureText, setStructureText] = useState(''); const [funcCheckboxes, setFuncCheckboxes] = useState([]); const [funcText, setFuncText] = useState(''); const [priorityText, setPriorityText] = useState(''); const [deadlineType, setDeadlineType] = useState<'none' | 'date' | 'discuss'>('none'); const [deadlineDate, setDeadlineDate] = useState(''); const [extraNotes, setExtraNotes] = useState(''); const [revisionConfirmed, setRevisionConfirmed] = useState(false); useEffect(() => { if (isOpen) { setMainDecision(null); setShowPayment(false); setApprovalConfirmed(false); setRevisionConfirmed(false); // Reset other fields if needed } }, [isOpen]); if (!isOpen) return null; // --- LOGIC --- const paymentDetails = order?.details?.payment_summary; const totalAmount = paymentDetails?.total || 0; const advanceAmount = paymentDetails?.advance || 0; const remainingAmount = paymentDetails?.remaining || 0; const isCustomPrice = paymentDetails?.is_custom; // We show payment step ONLY if Approved AND there is a remaining amount AND it's not custom price (unless handled) const shouldShowPaymentStep = mainDecision === 'approved' && remainingAmount > 0 && !isCustomPrice; // --- HANDLERS --- const handleCheckbox = ( currentList: string[], setList: React.Dispatch>, value: string, noneValue: string ) => { if (value === noneValue) { if (currentList.includes(noneValue)) { setList([]); } else { setList([noneValue]); } } else { let newList = currentList.filter(item => item !== noneValue); if (newList.includes(value)) { newList = newList.filter(item => item !== value); } else { newList = [...newList, value]; } setList(newList); } }; const isRevision = mainDecision === 'minor' || mainDecision === 'major'; const handleSubmit = () => { const feedbackData = { decision: mainDecision, submittedAt: new Date().toISOString(), approval: mainDecision === 'approved' ? { confirmed: approvalConfirmed, paymentComplete: showPayment // Flag that payment step was shown } : null, revision: isRevision ? { design: { selected: designCheckboxes, comment: designText }, content: { selected: contentCheckboxes, comment: contentText }, structure: { selected: structureCheckboxes, comment: structureText }, functionality: { selected: funcCheckboxes, comment: funcText }, priority: priorityText, deadline: { type: deadlineType, date: deadlineDate }, extraNotes: extraNotes, confirmed: revisionConfirmed } : null }; onSubmit(feedbackData); }; const handleProceedToPayment = () => { setShowPayment(true); }; const commonInputStyles = "w-full p-4 border border-gray-300 rounded-xl text-sm font-medium text-black placeholder-gray-400 focus:ring-4 focus:ring-primary/10 focus:border-primary outline-none bg-white transition-all shadow-sm"; const formatPrice = (num: number) => num.toLocaleString('hu-HU') + ' Ft'; const renderFeedbackCategory = ( title: string, options: string[], selected: string[], setSelected: React.Dispatch>, textValue: string, setTextValue: React.Dispatch>, placeholder: string ) => { const noneOption = options[options.length - 1]; const showTextarea = selected.length > 0 && !selected.includes(noneOption); return (

{title}

{options.map(opt => ( ))}
{showTextarea && ( )}
); }; return (
{showPayment ? ( /* PAYMENT SUMMARY VIEW */

Véglegesítés & Fizetés

A fennmaradó összeg rendezése a projekt lezárásához.

Projekt Elszámolás

A demó oldal jóváhagyásával a projekt a befejező szakaszba lép. Kérjük, egyenlítse ki a fennmaradó összeget.

Projekt Teljes Ára

{formatPrice(totalAmount)}

Már Befizetve (Előleg)

{formatPrice(advanceAmount)}

Most Fizetendő (Fennmaradó)

{formatPrice(remainingAmount)}

Fontos: A befizetés után a rendszer automatikusan kiállítja a végszámlát és elküldi e-mailben. A fejlesztő csapat értesítést kap a jóváhagyásról és megkezdi a végleges élesítést.

) : ( /* STANDARD FEEDBACK FORM */ <>

Visszajelzés a Weboldalról

A bemutató verzió alapján kérjük jelezd, ha valamit módosítanál.

Döntés a továbblépésről *

{[ { id: 'approved', label: 'Igen, jóváhagyom a terveket', color: 'green', icon: '✅' }, { id: 'minor', label: 'Alapvetően jó, de kisebb javításokat kérek', color: 'yellow', icon: '🔧' }, { id: 'major', label: 'Nem megfelelő, jelentős módosításra van szükség', color: 'red', icon: '❌' } ].map(opt => ( ))}
{mainDecision === 'approved' && (

Megerősítés

)} {isRevision && (
{renderFeedbackCategory( "Dizájn módosítások", ["Színek", "Betűtípusok", "Elrendezés", "Képek / Illusztrációk", "Nem szeretnék dizájn módosítást"], designCheckboxes, setDesignCheckboxes, designText, setDesignText, "Írd le pontosan, mit változtatnál a megjelenésen..." )} {renderFeedbackCategory( "Tartalmi változtatások", ["Szövegek stílusa", "Adatok pontosítása", "Hiányzó tartalom", "Nem szeretnék tartalmi módosítást"], contentCheckboxes, setContentCheckboxes, contentText, setContentText, "Írd le a szöveges módosításokat..." )}

Mi a legfontosabb kérésed? *

Egyéb észrevételek

)}
{mainDecision === 'approved' && ( shouldShowPaymentStep ? ( ) : ( ) )} {isRevision && ( )} {!mainDecision && ( )}
)}
); };