import React, { useEffect, useState } from 'react'; import { FaCheckCircle, FaSpinner } from 'react-icons/fa'; import woFeedbackWebFormService, { type WoFeedbackRecord, type WoFeedbackWebFormConfig, } from '../services/woFeedbackWebFormService'; export interface WoFeedbackFormProps { workOrder: string; defaultRequesterName?: string; compact?: boolean; onSuccess?: (record: WoFeedbackRecord) => void; } type FormPhase = 'loading' | 'form' | 'existing' | 'success' | 'error'; const inputCls = 'w-full px-3 py-2 text-sm border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-indigo-400'; const WoFeedbackForm: React.FC = ({ workOrder, defaultRequesterName = '', compact = false, onSuccess, }) => { const [phase, setPhase] = useState('loading'); const [config, setConfig] = useState(null); const [existing, setExisting] = useState(null); const [requesterName, setRequesterName] = useState(defaultRequesterName); const [rating, setRating] = useState(''); const [comments, setComments] = useState(''); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(''); useEffect(() => { setRequesterName(defaultRequesterName); }, [defaultRequesterName]); useEffect(() => { if (!workOrder) { setPhase('error'); setError('Work Order is required.'); return; } let cancelled = false; (async () => { setPhase('loading'); setError(''); try { const [cfg, fb] = await Promise.all([ woFeedbackWebFormService.getWebFormConfig(), woFeedbackWebFormService.getFeedbackForWorkOrder(workOrder), ]); if (cancelled) return; setConfig(cfg); if (fb) { setExisting(fb); setPhase('existing'); } else { setPhase('form'); } } catch (e) { if (cancelled) return; setError(e instanceof Error ? e.message : 'Failed to load feedback form'); setPhase('error'); } })(); return () => { cancelled = true; }; }, [workOrder]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!requesterName.trim()) { setError('Requester Name is required.'); return; } if (!rating) { setError('Please select a rating.'); return; } setSubmitting(true); setError(''); try { const saved = await woFeedbackWebFormService.submitFeedback({ work_order: workOrder, requester_name: requesterName.trim(), rating, comments: comments.trim(), }); setExisting(saved); setPhase('success'); onSuccess?.(saved); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to submit feedback'); } finally { setSubmitting(false); } }; if (phase === 'loading') { return (
Loading feedback form…
); } if (phase === 'error' && !config) { return (
{error || 'Unable to load feedback form.'}
); } const title = config?.title || 'WO Feedback'; if (phase === 'existing' && existing) { return (
{!compact && config?.introductionText && (

{config.introductionText}

)}

Feedback already submitted

Requester: {existing.requester_name || '—'}

{existing.rating || '—'}

{existing.comments && (

Comments: {existing.comments}

)}
); } if (phase === 'success' && existing) { return (

{config?.successTitle || 'Feedback Submitted'}

{config?.successMessage || 'Your feedback was submitted successfully.'}

{existing.rating}

{existing.comments && (

{existing.comments}

)}
); } return (
{!compact && (

{title}

{config?.introductionText && (

{config.introductionText}

)}
)} {compact && config?.introductionText && (

{config.introductionText}

)}
{workOrder}
setRequesterName(e.target.value)} className={inputCls} placeholder="Your name" required />