import { useState, useEffect } from 'react' import { X, UserPlus, FileText } from 'lucide-react' import type { IntakeFormField } from '@/types' import { sessionsApi } from '@/api/sessions' import { cn } from '@/lib/utils' import { toast } from '@/lib/toast' interface TeamMember { id: string name: string email: string } interface PrepareSessionModalProps { isOpen: boolean onClose: () => void treeId: string treeName: string intakeFields: IntakeFormField[] teamMembers?: TeamMember[] onPrepared?: () => void } export function PrepareSessionModal({ isOpen, onClose, treeId, treeName, intakeFields, teamMembers = [], onPrepared, }: PrepareSessionModalProps) { const [values, setValues] = useState>({}) const [assignedToId, setAssignedToId] = useState('') const [ticketNumber, setTicketNumber] = useState('') const [clientName, setClientName] = useState('') const [isSubmitting, setIsSubmitting] = useState(false) // Reset on open useEffect(() => { if (isOpen) { setValues({}) setAssignedToId('') setTicketNumber('') setClientName('') } }, [isOpen]) if (!isOpen) return null const handleFieldChange = (variableName: string, value: string) => { setValues(prev => ({ ...prev, [variableName]: value })) } const handleSubmit = async () => { setIsSubmitting(true) try { // Clean empty values const cleanedVars: Record = {} for (const [k, v] of Object.entries(values)) { if (v.trim()) cleanedVars[k] = v.trim() } await sessionsApi.prepare({ tree_id: treeId, session_variables: Object.keys(cleanedVars).length > 0 ? cleanedVars : undefined, assigned_to_id: assignedToId || undefined, ticket_number: ticketNumber.trim() || undefined, client_name: clientName.trim() || undefined, }) toast.success('Session prepared successfully') onPrepared?.() onClose() } catch { toast.error('Failed to prepare session') } finally { setIsSubmitting(false) } } // Group fields by group_name const grouped = new Map() for (const field of [...intakeFields].sort((a, b) => a.display_order - b.display_order)) { const group = field.group_name || 'General' if (!grouped.has(group)) grouped.set(group, []) grouped.get(group)!.push(field) } return (
{/* Header */}

Prepare Session

{/* Body */}
{/* Flow name */}

Flow

{treeName}

{/* Context fields */}
setTicketNumber(e.target.value)} placeholder="e.g. TKT-12345" className="w-full rounded-md border border-border bg-card px-3 py-1.5 text-sm text-foreground placeholder:text-muted-foreground focus:border-[rgba(96,165,250,0.3)] focus:outline-hidden focus:ring-1 focus:ring-primary/20" />
setClientName(e.target.value)} placeholder="e.g. Acme Corp" className="w-full rounded-md border border-border bg-card px-3 py-1.5 text-sm text-foreground placeholder:text-muted-foreground focus:border-[rgba(96,165,250,0.3)] focus:outline-hidden focus:ring-1 focus:ring-primary/20" />
{/* Assignee */} {teamMembers.length > 0 && (
)} {/* Intake form fields */} {intakeFields.length > 0 && (

Variables (optional — can be filled later)

{Array.from(grouped.entries()).map(([groupName, fields]) => (
{grouped.size > 1 && (

{groupName}

)} {fields.map(field => (
{field.field_type === 'select' && field.options?.length ? ( ) : field.field_type === 'textarea' ? (