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 (
{template.label}
{/* Category badge */} {template.category}{highlightedTemplate.description_summary}
Form fields ({highlightedTemplate.fields?.length || 0})
You already have content in the form. Using this template will replace your current input.