import React from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { ShieldOff, KeyRound, MailX, Printer, WifiOff, Download, X, Check, Sparkles, FileText, ArrowRight, } from 'lucide-react'; import TICKET_TEMPLATES from '../../data/ticketTemplates'; /** * Maps icon name strings from the template data to actual lucide-react components. */ const ICON_MAP = { ShieldOff, KeyRound, MailX, Printer, WifiOff, Download, }; /** * Color palette for template cards — each template gets a distinct, harmonious color. */ const CARD_COLORS = { 'vpn-connectivity': { bg: 'bg-amber-50', border: 'border-amber-200', activeBorder: 'border-amber-400', iconBg: 'bg-amber-100', iconColor: 'text-amber-600', badge: 'bg-amber-100 text-amber-700', buttonBg: 'bg-amber-500 hover:bg-amber-600', previewBg: 'bg-amber-50/50', previewBorder: 'border-amber-200', }, 'password-reset': { bg: 'bg-violet-50', border: 'border-violet-200', activeBorder: 'border-violet-400', iconBg: 'bg-violet-100', iconColor: 'text-violet-600', badge: 'bg-violet-100 text-violet-700', buttonBg: 'bg-violet-500 hover:bg-violet-600', previewBg: 'bg-violet-50/50', previewBorder: 'border-violet-200', }, 'email-access': { bg: 'bg-blue-50', border: 'border-blue-200', activeBorder: 'border-blue-400', iconBg: 'bg-blue-100', iconColor: 'text-blue-600', badge: 'bg-blue-100 text-blue-700', buttonBg: 'bg-blue-500 hover:bg-blue-600', previewBg: 'bg-blue-50/50', previewBorder: 'border-blue-200', }, 'printer-issue': { bg: 'bg-rose-50', border: 'border-rose-200', activeBorder: 'border-rose-400', iconBg: 'bg-rose-100', iconColor: 'text-rose-600', badge: 'bg-rose-100 text-rose-700', buttonBg: 'bg-rose-500 hover:bg-rose-600', previewBg: 'bg-rose-50/50', previewBorder: 'border-rose-200', }, 'wifi-network': { bg: 'bg-emerald-50', border: 'border-emerald-200', activeBorder: 'border-emerald-400', iconBg: 'bg-emerald-100', iconColor: 'text-emerald-600', badge: 'bg-emerald-100 text-emerald-700', buttonBg: 'bg-emerald-500 hover:bg-emerald-600', previewBg: 'bg-emerald-50/50', previewBorder: 'border-emerald-200', }, 'software-installation': { bg: 'bg-indigo-50', border: 'border-indigo-200', activeBorder: 'border-indigo-400', iconBg: 'bg-indigo-100', iconColor: 'text-indigo-600', badge: 'bg-indigo-100 text-indigo-700', buttonBg: 'bg-indigo-500 hover:bg-indigo-600', previewBg: 'bg-indigo-50/50', previewBorder: 'border-indigo-200', }, }; /** * TemplateSelector v2 — Two-step template selection with preview. * * UX FLOW (v2 change): * 1. User clicks a template card → card is HIGHLIGHTED (not auto-applied) * 2. A preview panel appears showing template details + field count * 3. User clicks "Use This Template" → onActivateTemplate is called * 4. Only THEN does the dynamic form appear in CreateTicket * * Props: * selectedTemplateId — currently highlighted template ID (or null) * activatedTemplateId — template that has been activated/committed (or null) * onHighlightTemplate — callback(templateObject) when a card is clicked (highlight only) * onActivateTemplate — callback(templateObject) when "Use Template" is confirmed * onDismissTemplate — callback() when the active template is dismissed * hasExistingContent — boolean, whether user has already typed content in the form */ const TemplateSelector = ({ selectedTemplateId, activatedTemplateId, onHighlightTemplate, onActivateTemplate, onDismissTemplate, hasExistingContent = false, }) => { const highlightedTemplate = TICKET_TEMPLATES.find((t) => t.id === selectedTemplateId); const isActivated = !!activatedTemplateId; return (
{/* Section header */}
Start from a template (optional)
{/* Active template chip — shown when a template is activated */} {isActivated && (
Using: {TICKET_TEMPLATES.find(t => t.id === activatedTemplateId)?.label}
)}
{/* Template cards grid — hidden when a template is activated */} {!isActivated && ( <>
{TICKET_TEMPLATES.map((template) => { const IconComponent = ICON_MAP[template.icon]; const colors = CARD_COLORS[template.id]; const isHighlighted = selectedTemplateId === template.id; return ( onHighlightTemplate(template)} whileHover={{ y: -2 }} whileTap={{ scale: 0.97 }} className={` relative group text-left p-3.5 rounded-2xl border-2 transition-all duration-200 cursor-pointer ${isHighlighted ? `${colors.bg} ${colors.activeBorder} shadow-md` : `bg-white border-gray-100 hover:${colors.bg} hover:border-gray-200 shadow-sm hover:shadow-md` } `} > {/* Selected checkmark */} {isHighlighted && ( )} {/* Icon */}
{IconComponent && ( )}
{/* Label */}

{template.label}

{/* Category badge */} {template.category}
); })}
{/* ── Template Preview Panel ── */} {/* Appears when a card is highlighted but NOT yet activated */} {highlightedTemplate && (
{/* Preview header */}
{ICON_MAP[highlightedTemplate.icon] && React.createElement(ICON_MAP[highlightedTemplate.icon], { size: 20, className: CARD_COLORS[highlightedTemplate.id]?.iconColor, }) }

{highlightedTemplate.label}

{highlightedTemplate.description_summary}

{/* Field preview list */}

Form fields ({highlightedTemplate.fields?.length || 0})

{(highlightedTemplate.fields || []).map((field) => ( {field.label} {field.required && *} ))}
{/* Existing content warning */} {hasExistingContent && (
⚠️

You already have content in the form. Using this template will replace your current input.

)} {/* Action buttons */}
)}
)} {/* Divider */}
{isActivated ? 'fill in the details below' : 'or fill manually'}
); }; export default TemplateSelector;