import {Button, Collapsible, CollapsibleContent, CollapsibleTrigger, Input, Label, Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from '@plunk/ui'; import {ChevronDown, Plus, Trash2} from 'lucide-react'; import Link from 'next/link'; import {useState} from 'react'; import {toast} from 'sonner'; import {WIKI_URI} from '../../lib/constants'; import {type EditStepDialogProps, getStepConfig, StepDialogShell, useStepUpdate} from './shared'; interface HeaderEntry { key: string; value: string; } export function WebhookStepDialog({step, workflowId, open, onOpenChange, onSuccess}: EditStepDialogProps) { const config = getStepConfig(step); const initialHeaders: HeaderEntry[] = config.headers && typeof config.headers === 'object' ? Object.entries(config.headers as Record).map(([key, value]) => ({key, value: String(value)})) : []; const [name, setName] = useState(step.name); const [webhookUrl, setWebhookUrl] = useState(String(config.url ?? '')); const [webhookMethod, setWebhookMethod] = useState(String(config.method ?? 'POST')); const [webhookHeaders, setWebhookHeaders] = useState(initialHeaders); const [showWebhookInfo, setShowWebhookInfo] = useState(false); const {update, isSubmitting} = useStepUpdate(workflowId, step.id); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!webhookUrl) { toast.error('Webhook URL is required'); return; } const headers: Record = {}; webhookHeaders.forEach(header => { if (header.key.trim() && header.value.trim()) { headers[header.key.trim()] = header.value.trim(); } }); const ok = await update({ name, config: {url: webhookUrl, method: webhookMethod, headers}, }); if (ok) { onOpenChange(false); onSuccess(); } }; const updateHeader = (index: number, patch: Partial) => { setWebhookHeaders(prev => prev.map((h, i) => (i === index ? {...h, ...patch} : h))); }; return (
{showWebhookInfo ? 'Hide' : 'View'} request payload Webhook guide
              {`{
  "contact": { "email": "user@example.com", "subscribed": true, "data": { ... } },
  "workflow": { "id": "wf_...", "name": "Welcome Series" },
  "execution": { "id": "exec_...", "startedAt": "2025-01-19T..." },
  "event": { ... }
}`}
            
setWebhookUrl(e.target.value)} required placeholder="https://api.example.com/webhook" />
{webhookHeaders.map((header, index) => (
updateHeader(index, {key: e.target.value})} className="text-sm font-mono" /> updateHeader(index, {value: e.target.value})} className="text-sm font-mono" />
))}
); }