@actuate-media/cms-admin 0.62.0 → 0.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/components/forms/FormSchemaDrawer.d.ts.map +1 -1
- package/dist/components/forms/FormSchemaDrawer.js +6 -3
- package/dist/components/forms/FormSchemaDrawer.js.map +1 -1
- package/dist/components/forms/NotificationsPanel.d.ts.map +1 -1
- package/dist/components/forms/NotificationsPanel.js +2 -3
- package/dist/components/forms/NotificationsPanel.js.map +1 -1
- package/dist/components/forms/WebhooksPanel.d.ts +5 -0
- package/dist/components/forms/WebhooksPanel.d.ts.map +1 -0
- package/dist/components/forms/WebhooksPanel.js +129 -0
- package/dist/components/forms/WebhooksPanel.js.map +1 -0
- package/dist/lib/forms-service.d.ts +40 -2
- package/dist/lib/forms-service.d.ts.map +1 -1
- package/dist/lib/forms-service.js +24 -0
- package/dist/lib/forms-service.js.map +1 -1
- package/package.json +1 -1
- package/src/components/forms/FormSchemaDrawer.tsx +9 -2
- package/src/components/forms/NotificationsPanel.tsx +5 -4
- package/src/components/forms/WebhooksPanel.tsx +311 -0
- package/src/lib/forms-service.ts +81 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @actuate-media/cms-admin
|
|
2
2
|
|
|
3
|
+
## 0.63.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- a6360cc: Forms launch kit (Batch 7): Integrations tab with Zapier Catch Hook helper and webhook CRUD in the form schema drawer; marketing seed contact form + /contact page; ActuateForm success focus; actuate doctor forms/CRM checks; forms-and-integrations docs.
|
|
8
|
+
|
|
3
9
|
## 0.62.0
|
|
4
10
|
|
|
5
11
|
### Minor Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormSchemaDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/forms/FormSchemaDrawer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FormSchemaDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/forms/FormSchemaDrawer.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAiB9D,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,OAAO,GACR,EAAE;IACD,IAAI,EAAE,YAAY,GAAG,IAAI,CAAA;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACrC,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,kDAmJA"}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
/**
|
|
4
4
|
* Form Schema drawer — the right-side panel opened from the Forms list "Schema"
|
|
5
|
-
* action.
|
|
6
|
-
* + domain restrictions), Notifications (
|
|
5
|
+
* action. Four tabs: Fields (versioned schema editor), Embed (public snippets
|
|
6
|
+
* + domain restrictions), Notifications (email settings), Integrations (CRM
|
|
7
|
+
* webhooks / Zapier).
|
|
7
8
|
*
|
|
8
9
|
* Saving the Fields tab creates a new schema version server-side; existing
|
|
9
10
|
* submissions keep referencing the version they were captured against, so
|
|
@@ -19,11 +20,13 @@ import { Drawer } from './Drawer.js';
|
|
|
19
20
|
import { FieldsPanel } from './FieldsPanel.js';
|
|
20
21
|
import { EmbedPanel } from './EmbedPanel.js';
|
|
21
22
|
import { NotificationsPanel } from './NotificationsPanel.js';
|
|
23
|
+
import { WebhooksPanel } from './WebhooksPanel.js';
|
|
22
24
|
import { FormsErrorState, FormsLoading, btnPrimary, btnSecondary } from './primitives.js';
|
|
23
25
|
const TABS = [
|
|
24
26
|
{ id: 'fields', label: 'Fields' },
|
|
25
27
|
{ id: 'embed', label: 'Embed' },
|
|
26
28
|
{ id: 'notifications', label: 'Notifications' },
|
|
29
|
+
{ id: 'integrations', label: 'Integrations' },
|
|
27
30
|
];
|
|
28
31
|
export function FormSchemaDrawer({ form, open, onOpenChange, onSaved, }) {
|
|
29
32
|
const [tab, setTab] = useState('fields');
|
|
@@ -88,7 +91,7 @@ export function FormSchemaDrawer({ form, open, onOpenChange, onSaved, }) {
|
|
|
88
91
|
}
|
|
89
92
|
if (!form)
|
|
90
93
|
return null;
|
|
91
|
-
return (_jsxs(_Fragment, { children: [_jsx(Drawer, { open: open, onOpenChange: requestClose, title: form.name, description: `/${form.slug}`, width: "max-w-2xl", footer: tab === 'fields' ? (_jsxs(_Fragment, { children: [_jsx("button", { className: btnSecondary, onClick: () => requestClose(false), children: "Close" }), _jsx("button", { className: btnPrimary, onClick: handleSave, disabled: saving || loading, children: saving ? 'Saving…' : 'Save Schema' })] })) : undefined, children: _jsxs(Tabs.Root, { value: tab, onValueChange: setTab, children: [_jsx(Tabs.List, { className: "border-border mb-4 flex gap-1 border-b", "aria-label": "Form schema sections", children: TABS.map((t) => (_jsx(Tabs.Trigger, { value: t.id, className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary focus-visible:ring-ring -mb-px border-b-2 border-transparent px-3 py-2 text-sm font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none", children: t.label }, t.id))) }), _jsx(Tabs.Content, { value: "fields", tabIndex: -1, children: loading ? (_jsx(FormsLoading, { label: "Loading schema\u2026" })) : error ? (_jsx(FormsErrorState, { message: error, onRetry: () => formId && setTab('fields') })) : (_jsx(FieldsPanel, { fields: fields, onChange: handleFieldsChange, hasSubmissions: hasSubmissions })) }), _jsx(Tabs.Content, { value: "embed", tabIndex: -1, children: formId && _jsx(EmbedPanel, { formId: formId, slug: form.slug, status: form.status }) }), _jsx(Tabs.Content, { value: "notifications", tabIndex: -1, children: formId && _jsx(NotificationsPanel, { formId: formId, onChanged: onSaved }) })] }) }), _jsx(ConfirmDialog, { open: confirmDiscard, onClose: () => setConfirmDiscard(false), onConfirm: () => {
|
|
94
|
+
return (_jsxs(_Fragment, { children: [_jsx(Drawer, { open: open, onOpenChange: requestClose, title: form.name, description: `/${form.slug}`, width: "max-w-2xl", footer: tab === 'fields' ? (_jsxs(_Fragment, { children: [_jsx("button", { className: btnSecondary, onClick: () => requestClose(false), children: "Close" }), _jsx("button", { className: btnPrimary, onClick: handleSave, disabled: saving || loading, children: saving ? 'Saving…' : 'Save Schema' })] })) : undefined, children: _jsxs(Tabs.Root, { value: tab, onValueChange: setTab, children: [_jsx(Tabs.List, { className: "border-border mb-4 flex gap-1 border-b", "aria-label": "Form schema sections", children: TABS.map((t) => (_jsx(Tabs.Trigger, { value: t.id, className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-primary focus-visible:ring-ring -mb-px border-b-2 border-transparent px-3 py-2 text-sm font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none", children: t.label }, t.id))) }), _jsx(Tabs.Content, { value: "fields", tabIndex: -1, children: loading ? (_jsx(FormsLoading, { label: "Loading schema\u2026" })) : error ? (_jsx(FormsErrorState, { message: error, onRetry: () => formId && setTab('fields') })) : (_jsx(FieldsPanel, { fields: fields, onChange: handleFieldsChange, hasSubmissions: hasSubmissions })) }), _jsx(Tabs.Content, { value: "embed", tabIndex: -1, children: formId && _jsx(EmbedPanel, { formId: formId, slug: form.slug, status: form.status }) }), _jsx(Tabs.Content, { value: "notifications", tabIndex: -1, children: formId && _jsx(NotificationsPanel, { formId: formId, onChanged: onSaved }) }), _jsx(Tabs.Content, { value: "integrations", tabIndex: -1, children: formId && _jsx(WebhooksPanel, { formId: formId, formSlug: form.slug }) })] }) }), _jsx(ConfirmDialog, { open: confirmDiscard, onClose: () => setConfirmDiscard(false), onConfirm: () => {
|
|
92
95
|
setDirty(false);
|
|
93
96
|
onOpenChange(false);
|
|
94
97
|
}, title: "Discard unsaved changes?", description: "You have unsaved schema changes. Closing now will discard them.", confirmLabel: "Discard", cancelLabel: "Keep editing", destructive: true })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormSchemaDrawer.js","sourceRoot":"","sources":["../../../src/components/forms/FormSchemaDrawer.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ
|
|
1
|
+
{"version":3,"file":"FormSchemaDrawer.js","sourceRoot":"","sources":["../../../src/components/forms/FormSchemaDrawer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/forms/NotificationsPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"NotificationsPanel.d.ts","sourceRoot":"","sources":["../../../src/components/forms/NotificationsPanel.tsx"],"names":[],"mappings":"AAqBA,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB,kDAqKA"}
|
|
@@ -3,8 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
/**
|
|
4
4
|
* Notifications tab of the Form Schema drawer. Persists per-form notification
|
|
5
5
|
* settings (recipients, reply-to, subject/message templates, field inclusion,
|
|
6
|
-
* autoresponder).
|
|
7
|
-
* wired in a later phase (PR 6); this panel owns the configuration only.
|
|
6
|
+
* autoresponder). Email delivery uses the configured email adapter when enabled.
|
|
8
7
|
*/
|
|
9
8
|
import { useEffect, useState } from 'react';
|
|
10
9
|
import * as Switch from '@radix-ui/react-switch';
|
|
@@ -69,7 +68,7 @@ export function NotificationsPanel({ formId, onChanged, }) {
|
|
|
69
68
|
.split(',')
|
|
70
69
|
.map((s) => s.trim())
|
|
71
70
|
.filter(Boolean),
|
|
72
|
-
}), placeholder: "team@example.com", className: inputCls }) }), _jsx(Field, { label: "Reply-to field key", hint: "Field whose value is used as the reply-to address", children: _jsx("input", { type: "text", value: settings.replyToFieldKey ?? '', onChange: (e) => patch({ replyToFieldKey: e.target.value || null }), placeholder: "email", className: inputCls }) }), _jsx(Field, { label: "Subject template", children: _jsx("input", { type: "text", value: settings.subjectTemplate ?? '', onChange: (e) => patch({ subjectTemplate: e.target.value }), placeholder: "New submission from {{name}}", className: inputCls }) }), _jsx(Field, { label: "Message template", children: _jsx("textarea", { rows: 3, value: settings.messageTemplate ?? '', onChange: (e) => patch({ messageTemplate: e.target.value }), className: inputCls }) }), _jsx(ToggleRow, { label: "Include all fields", help: "Append every submitted field to the notification body.", checked: settings.includeFields ?? true, onChange: (v) => patch({ includeFields: v }) }), _jsx(ToggleRow, { label: "Exclude sensitive fields", help: "Omit fields marked as sensitive/PII from the email.", checked: settings.excludeSensitiveFields ?? false, onChange: (v) => patch({ excludeSensitiveFields: v }) }), _jsxs("div", { className: "border-border border-t pt-4", children: [_jsx(ToggleRow, { label: "Auto-response email", help: "Send a confirmation email back to the submitter.", checked: settings.autoresponderEnabled ?? false, onChange: (v) => patch({ autoresponderEnabled: v }) }), settings.autoresponderEnabled && (_jsxs("div", { className: "mt-3 space-y-3", children: [_jsx(Field, { label: "Auto-response subject", children: _jsx("input", { type: "text", value: settings.autoresponderSubject ?? '', onChange: (e) => patch({ autoresponderSubject: e.target.value }), className: inputCls }) }), _jsx(Field, { label: "Auto-response body", children: _jsx("textarea", { rows: 3, value: settings.autoresponderBody ?? '', onChange: (e) => patch({ autoresponderBody: e.target.value }), className: inputCls }) })] }))] })] }),
|
|
71
|
+
}), placeholder: "team@example.com", className: inputCls }) }), _jsx(Field, { label: "Reply-to field key", hint: "Field whose value is used as the reply-to address", children: _jsx("input", { type: "text", value: settings.replyToFieldKey ?? '', onChange: (e) => patch({ replyToFieldKey: e.target.value || null }), placeholder: "email", className: inputCls }) }), _jsx(Field, { label: "Subject template", children: _jsx("input", { type: "text", value: settings.subjectTemplate ?? '', onChange: (e) => patch({ subjectTemplate: e.target.value }), placeholder: "New submission from {{name}}", className: inputCls }) }), _jsx(Field, { label: "Message template", children: _jsx("textarea", { rows: 3, value: settings.messageTemplate ?? '', onChange: (e) => patch({ messageTemplate: e.target.value }), className: inputCls }) }), _jsx(ToggleRow, { label: "Include all fields", help: "Append every submitted field to the notification body.", checked: settings.includeFields ?? true, onChange: (v) => patch({ includeFields: v }) }), _jsx(ToggleRow, { label: "Exclude sensitive fields", help: "Omit fields marked as sensitive/PII from the email.", checked: settings.excludeSensitiveFields ?? false, onChange: (v) => patch({ excludeSensitiveFields: v }) }), _jsxs("div", { className: "border-border border-t pt-4", children: [_jsx(ToggleRow, { label: "Auto-response email", help: "Send a confirmation email back to the submitter.", checked: settings.autoresponderEnabled ?? false, onChange: (v) => patch({ autoresponderEnabled: v }) }), settings.autoresponderEnabled && (_jsxs("div", { className: "mt-3 space-y-3", children: [_jsx(Field, { label: "Auto-response subject", children: _jsx("input", { type: "text", value: settings.autoresponderSubject ?? '', onChange: (e) => patch({ autoresponderSubject: e.target.value }), className: inputCls }) }), _jsx(Field, { label: "Auto-response body", children: _jsx("textarea", { rows: 3, value: settings.autoresponderBody ?? '', onChange: (e) => patch({ autoresponderBody: e.target.value }), className: inputCls }) })] }))] })] }), _jsxs("p", { className: "text-muted-foreground text-xs", children: ["For CRM integrations (Zapier, HubSpot via Zapier, etc.), use the", ' ', _jsx("span", { className: "font-medium", children: "Integrations" }), " tab to add a signed webhook. Email notifications send when recipients are configured and your email provider is set up (", _jsx("span", { className: "font-mono", children: "RESEND_API_KEY" }), " or SMTP)."] }), _jsx("div", { className: "flex justify-end", children: _jsx("button", { className: btnPrimary, onClick: save, disabled: saving, children: saving ? 'Saving…' : 'Save notifications' }) })] }));
|
|
73
72
|
}
|
|
74
73
|
function ToggleRow({ label, help, checked, onChange, }) {
|
|
75
74
|
return (_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("span", { className: "min-w-0", children: [_jsx("span", { className: "text-foreground block text-sm font-medium", children: label }), _jsx("span", { className: "text-muted-foreground block text-sm", children: help })] }), _jsx(Switch.Root, { checked: checked, onCheckedChange: onChange, "aria-label": label, className: "bg-destructive data-[state=checked]:bg-success focus-visible:ring-ring relative h-[18px] w-8 shrink-0 rounded-full transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(Switch.Thumb, { className: "bg-background block h-3.5 w-3.5 translate-x-0.5 rounded-full shadow-sm transition-transform data-[state=checked]:translate-x-[14px]" }) })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationsPanel.js","sourceRoot":"","sources":["../../../src/components/forms/NotificationsPanel.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ
|
|
1
|
+
{"version":3,"file":"NotificationsPanel.js","sourceRoot":"","sources":["../../../src/components/forms/NotificationsPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebhooksPanel.d.ts","sourceRoot":"","sources":["../../../src/components/forms/WebhooksPanel.tsx"],"names":[],"mappings":"AA4BA,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,2CA0RvF"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Integrations tab of the Form Schema drawer. Manages signed outbound webhooks
|
|
5
|
+
* (Zapier Catch Hook, Make, custom CRM endpoints) and guides editors through
|
|
6
|
+
* the default Zapier → Webhooks by Zapier → Catch Hook setup.
|
|
7
|
+
*/
|
|
8
|
+
import * as Switch from '@radix-ui/react-switch';
|
|
9
|
+
import { ExternalLink, Loader2, Plus, Trash2, Zap } from 'lucide-react';
|
|
10
|
+
import { useEffect, useState } from 'react';
|
|
11
|
+
import { toast } from 'sonner';
|
|
12
|
+
import { createFormWebhook, deleteFormWebhook, fetchFormWebhooks, testFormWebhook, updateFormWebhook, } from '../../lib/forms-service.js';
|
|
13
|
+
import { ConfirmDialog } from '../ui/ConfirmDialog.js';
|
|
14
|
+
import { FormsErrorState, FormsLoading, btnPrimary, btnSecondary } from './primitives.js';
|
|
15
|
+
const ZAPIER_CATCH_HOOK_DOCS = 'https://zapier.com/apps/webhook/integrations';
|
|
16
|
+
const FORMS_INTEGRATIONS_DOCS = 'https://actuatecms.dev/docs/forms-and-integrations';
|
|
17
|
+
const inputCls = 'border-border bg-input-background text-foreground focus-visible:ring-ring w-full rounded-md border px-2.5 py-1.5 text-sm focus-visible:ring-2 focus-visible:outline-none';
|
|
18
|
+
export function WebhooksPanel({ formId, formSlug }) {
|
|
19
|
+
const [webhooks, setWebhooks] = useState([]);
|
|
20
|
+
const [loading, setLoading] = useState(true);
|
|
21
|
+
const [error, setError] = useState(null);
|
|
22
|
+
const [url, setUrl] = useState('');
|
|
23
|
+
const [creating, setCreating] = useState(false);
|
|
24
|
+
const [createdSecret, setCreatedSecret] = useState(null);
|
|
25
|
+
const [pendingDelete, setPendingDelete] = useState(null);
|
|
26
|
+
const [testingId, setTestingId] = useState(null);
|
|
27
|
+
async function reload() {
|
|
28
|
+
setLoading(true);
|
|
29
|
+
setError(null);
|
|
30
|
+
try {
|
|
31
|
+
setWebhooks(await fetchFormWebhooks(formId));
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
setError(e instanceof Error ? e.message : 'Failed to load webhooks');
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
setLoading(false);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
let active = true;
|
|
42
|
+
setLoading(true);
|
|
43
|
+
setError(null);
|
|
44
|
+
fetchFormWebhooks(formId)
|
|
45
|
+
.then((rows) => {
|
|
46
|
+
if (active)
|
|
47
|
+
setWebhooks(rows);
|
|
48
|
+
})
|
|
49
|
+
.catch((e) => {
|
|
50
|
+
if (active)
|
|
51
|
+
setError(e instanceof Error ? e.message : 'Failed to load webhooks');
|
|
52
|
+
})
|
|
53
|
+
.finally(() => {
|
|
54
|
+
if (active)
|
|
55
|
+
setLoading(false);
|
|
56
|
+
});
|
|
57
|
+
return () => {
|
|
58
|
+
active = false;
|
|
59
|
+
};
|
|
60
|
+
}, [formId]);
|
|
61
|
+
async function handleCreate(e) {
|
|
62
|
+
e.preventDefault();
|
|
63
|
+
const trimmed = url.trim();
|
|
64
|
+
if (!trimmed) {
|
|
65
|
+
toast.error('Paste your Catch Hook URL first.');
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
setCreating(true);
|
|
69
|
+
const res = await createFormWebhook(formId, {
|
|
70
|
+
url: trimmed,
|
|
71
|
+
events: ['form.submitted'],
|
|
72
|
+
enabled: true,
|
|
73
|
+
});
|
|
74
|
+
setCreating(false);
|
|
75
|
+
if (res.error) {
|
|
76
|
+
toast.error(res.error);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (res.data?.secret)
|
|
80
|
+
setCreatedSecret(res.data.secret);
|
|
81
|
+
setUrl('');
|
|
82
|
+
toast.success('Webhook connected.');
|
|
83
|
+
await reload();
|
|
84
|
+
}
|
|
85
|
+
async function toggleEnabled(webhook, enabled) {
|
|
86
|
+
const res = await updateFormWebhook(formId, webhook.id, { enabled });
|
|
87
|
+
if (res.error) {
|
|
88
|
+
toast.error(res.error);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
setWebhooks((rows) => rows.map((row) => (row.id === webhook.id ? { ...row, enabled } : row)));
|
|
92
|
+
}
|
|
93
|
+
async function handleTest(webhookId) {
|
|
94
|
+
setTestingId(webhookId);
|
|
95
|
+
const res = await testFormWebhook(formId, webhookId);
|
|
96
|
+
setTestingId(null);
|
|
97
|
+
if (res.error) {
|
|
98
|
+
toast.error(res.error);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (res.data?.ok) {
|
|
102
|
+
toast.success(`Test delivery succeeded (HTTP ${res.data.status}).`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
toast.error(res.data?.error || `Test failed (HTTP ${res.data?.status ?? 'unknown'}).`);
|
|
106
|
+
}
|
|
107
|
+
await reload();
|
|
108
|
+
}
|
|
109
|
+
async function confirmDelete() {
|
|
110
|
+
if (!pendingDelete)
|
|
111
|
+
return;
|
|
112
|
+
const res = await deleteFormWebhook(formId, pendingDelete.id);
|
|
113
|
+
setPendingDelete(null);
|
|
114
|
+
if (res.error) {
|
|
115
|
+
toast.error(res.error);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
toast.success('Webhook removed.');
|
|
119
|
+
await reload();
|
|
120
|
+
}
|
|
121
|
+
if (loading)
|
|
122
|
+
return _jsx(FormsLoading, { label: "Loading integrations\u2026" });
|
|
123
|
+
if (error)
|
|
124
|
+
return _jsx(FormsErrorState, { message: error, onRetry: () => void reload() });
|
|
125
|
+
return (_jsxs("div", { className: "space-y-5", children: [_jsx("section", { className: "border-border bg-muted/40 space-y-3 rounded-lg border p-4", "aria-labelledby": "zapier-helper-title", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("span", { className: "bg-primary/10 text-primary flex h-9 w-9 shrink-0 items-center justify-center rounded-md", children: _jsx(Zap, { size: 18, "aria-hidden": true }) }), _jsxs("div", { className: "min-w-0 space-y-2", children: [_jsx("h3", { id: "zapier-helper-title", className: "text-foreground text-sm font-medium", children: "Connect to Zapier (recommended)" }), _jsxs("ol", { className: "text-muted-foreground list-decimal space-y-1 pl-4 text-sm", children: [_jsxs("li", { children: ["In Zapier, create a Zap with trigger", ' ', _jsx("span", { className: "text-foreground font-medium", children: "Webhooks by Zapier \u2192 Catch Hook" }), "."] }), _jsx("li", { children: "Copy the hook URL Zapier gives you and paste it below." }), _jsxs("li", { children: ["Map fields in your action step \u2014 submission values arrive under", ' ', _jsx("span", { className: "font-mono text-xs", children: "data.email" }), ",", ' ', _jsx("span", { className: "font-mono text-xs", children: "data.name" }), ", etc."] }), _jsxs("li", { children: ["Use event ", _jsx("span", { className: "font-mono text-xs", children: "form.submitted" }), " only (spam hits emit ", _jsx("span", { className: "font-mono text-xs", children: "form.spam_detected" }), " separately)."] })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "HubSpot, Salesforce, Slack, and Google Sheets work through Zapier actions \u2014 no native Actuate app required for v1." }), _jsxs("div", { className: "flex flex-wrap gap-3 pt-1", children: [_jsxs("a", { href: ZAPIER_CATCH_HOOK_DOCS, target: "_blank", rel: "noopener noreferrer", className: "text-primary inline-flex items-center gap-1 text-sm font-medium hover:underline", children: ["Open Zapier Webhooks", _jsx(ExternalLink, { size: 14, "aria-hidden": true })] }), _jsxs("a", { href: FORMS_INTEGRATIONS_DOCS, target: "_blank", rel: "noopener noreferrer", className: "text-primary inline-flex items-center gap-1 text-sm font-medium hover:underline", children: ["Full integration guide", _jsx(ExternalLink, { size: 14, "aria-hidden": true })] })] })] })] }) }), _jsxs("form", { onSubmit: handleCreate, className: "space-y-3", children: [_jsxs("label", { className: "block", children: [_jsx("span", { className: "text-foreground mb-1 block text-sm font-medium", children: "Webhook URL" }), _jsx("input", { type: "url", value: url, onChange: (e) => setUrl(e.target.value), placeholder: "https://hooks.zapier.com/hooks/catch/\u2026", className: inputCls, autoComplete: "off" }), _jsxs("span", { className: "text-muted-foreground mt-1 block text-xs", children: ["Paste your Catch Hook URL for form ", _jsx("span", { className: "font-mono", children: formSlug }), ". Payloads are HMAC-signed via ", _jsx("span", { className: "font-mono", children: "X-Actuate-Signature" }), "."] })] }), _jsx("button", { type: "submit", className: `${btnPrimary} inline-flex items-center`, disabled: creating, children: creating ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 inline h-4 w-4 animate-spin", "aria-hidden": true }), "Connecting\u2026"] })) : (_jsxs(_Fragment, { children: [_jsx(Plus, { className: "mr-1 inline h-4 w-4", "aria-hidden": true }), "Add webhook"] })) })] }), createdSecret && (_jsxs("div", { className: "border-success/30 bg-success/10 text-foreground space-y-2 rounded-md border px-3 py-3 text-sm", role: "status", children: [_jsx("p", { className: "font-medium", children: "Signing secret (shown once)" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Store this if your CRM verifies HMAC signatures. You cannot retrieve it again after closing this panel." }), _jsx("pre", { className: "border-border bg-background overflow-x-auto rounded border px-2 py-1.5 font-mono text-xs", children: createdSecret }), _jsx("button", { type: "button", className: btnSecondary, onClick: () => setCreatedSecret(null), children: "Dismiss" })] })), webhooks.length === 0 ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "No webhooks yet. Add a Catch Hook URL to send each submission to your CRM." })) : (_jsx("ul", { className: "space-y-3", "aria-label": "Configured webhooks", children: webhooks.map((webhook) => (_jsxs("li", { className: "border-border flex flex-col gap-3 rounded-lg border p-3 sm:flex-row sm:items-center sm:justify-between", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "text-foreground truncate font-mono text-xs", children: webhook.url }), _jsxs("p", { className: "text-muted-foreground mt-1 text-xs", children: ["Events: ", webhook.events.join(', ') || 'form.submitted', webhook.lastDeliveryAt
|
|
126
|
+
? ` · Last delivery: ${webhook.lastDeliveryStatus ?? 'unknown'}`
|
|
127
|
+
: ''] })] }), _jsxs("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: [_jsx(Switch.Root, { checked: webhook.enabled, onCheckedChange: (v) => void toggleEnabled(webhook, v), "aria-label": `Enable webhook ${webhook.url}`, className: "bg-destructive data-[state=checked]:bg-success focus-visible:ring-ring relative h-[18px] w-8 rounded-full transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(Switch.Thumb, { className: "bg-background block h-3.5 w-3.5 translate-x-0.5 rounded-full shadow-sm transition-transform data-[state=checked]:translate-x-[14px]" }) }), _jsx("button", { type: "button", className: btnSecondary, disabled: testingId === webhook.id, onClick: () => void handleTest(webhook.id), children: testingId === webhook.id ? 'Testing…' : 'Send test' }), _jsxs("button", { type: "button", className: "text-destructive hover:bg-destructive/10 focus-visible:ring-ring inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-sm font-medium focus-visible:ring-2 focus-visible:outline-none", "aria-label": "Remove webhook", onClick: () => setPendingDelete(webhook), children: [_jsx(Trash2, { size: 16, "aria-hidden": true }), "Remove"] })] })] }, webhook.id))) })), _jsx(ConfirmDialog, { open: !!pendingDelete, onClose: () => setPendingDelete(null), onConfirm: () => void confirmDelete(), title: "Remove webhook?", description: "New submissions will no longer be sent to this URL. Existing Zapier Zaps are not deleted \u2014 disable them in Zapier if needed.", confirmLabel: "Remove", cancelLabel: "Keep webhook", destructive: true })] }));
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=WebhooksPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebhooksPanel.js","sourceRoot":"","sources":["../../../src/components/forms/WebhooksPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { FormDefinition, FormSchemaVersion, FormField, FormNotificationSettings, FormEmbedSettings, FormStatus, FormStats, FormsSidebarCount, FetchFormsParams, FormSubmission, FetchFormEntriesParams, EntryCounts } from '@actuate-media/cms-core';
|
|
2
|
-
export type { FormDefinition, FormSchemaVersion, FormField, FormFieldType, FormFieldOption, FieldValidationRules, FormNotificationSettings, FormEmbedSettings, FormStatus, FormStats, FormsSidebarCount, FormSubmission, FormSubmissionFile, FetchFormEntriesParams, EntryCounts, SpamStatus, } from '@actuate-media/cms-core';
|
|
1
|
+
import type { FormDefinition, FormSchemaVersion, FormField, FormNotificationSettings, FormEmbedSettings, FormWebhookConfig, FormWebhookEvent, FormStatus, FormStats, FormsSidebarCount, FetchFormsParams, FormSubmission, FetchFormEntriesParams, EntryCounts } from '@actuate-media/cms-core';
|
|
2
|
+
export type { FormDefinition, FormSchemaVersion, FormField, FormFieldType, FormFieldOption, FieldValidationRules, FormNotificationSettings, FormEmbedSettings, FormWebhookConfig, FormWebhookEvent, FormStatus, FormStats, FormsSidebarCount, FormSubmission, FormSubmissionFile, FetchFormEntriesParams, EntryCounts, SpamStatus, } from '@actuate-media/cms-core';
|
|
3
3
|
/**
|
|
4
4
|
* A form as returned by `GET /forms` — the typed definition plus the legacy
|
|
5
5
|
* numeric aliases the list endpoint adds for backward compatibility.
|
|
@@ -77,6 +77,44 @@ export declare function updateEmbedSettings(id: string, payload: Partial<FormEmb
|
|
|
77
77
|
data?: FormEmbedSettings;
|
|
78
78
|
error?: string;
|
|
79
79
|
}>;
|
|
80
|
+
export interface WebhookTestResult {
|
|
81
|
+
ok: boolean;
|
|
82
|
+
status: number;
|
|
83
|
+
attempts: number;
|
|
84
|
+
error?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface CreateFormWebhookPayload {
|
|
87
|
+
url: string;
|
|
88
|
+
events?: FormWebhookEvent[];
|
|
89
|
+
enabled?: boolean;
|
|
90
|
+
retryCount?: number;
|
|
91
|
+
}
|
|
92
|
+
export interface UpdateFormWebhookPayload {
|
|
93
|
+
url?: string;
|
|
94
|
+
events?: FormWebhookEvent[];
|
|
95
|
+
enabled?: boolean;
|
|
96
|
+
retryCount?: number;
|
|
97
|
+
}
|
|
98
|
+
/** Plaintext secret is returned only on create — store it before closing the dialog. */
|
|
99
|
+
export type CreatedFormWebhook = FormWebhookConfig & {
|
|
100
|
+
secret: string;
|
|
101
|
+
};
|
|
102
|
+
export declare function fetchFormWebhooks(formId: string): Promise<FormWebhookConfig[]>;
|
|
103
|
+
export declare function createFormWebhook(formId: string, payload: CreateFormWebhookPayload): Promise<{
|
|
104
|
+
data?: CreatedFormWebhook;
|
|
105
|
+
error?: string;
|
|
106
|
+
}>;
|
|
107
|
+
export declare function updateFormWebhook(formId: string, webhookId: string, payload: UpdateFormWebhookPayload): Promise<{
|
|
108
|
+
data?: FormWebhookConfig;
|
|
109
|
+
error?: string;
|
|
110
|
+
}>;
|
|
111
|
+
export declare function deleteFormWebhook(formId: string, webhookId: string): Promise<{
|
|
112
|
+
error?: string;
|
|
113
|
+
}>;
|
|
114
|
+
export declare function testFormWebhook(formId: string, webhookId: string): Promise<{
|
|
115
|
+
data?: WebhookTestResult;
|
|
116
|
+
error?: string;
|
|
117
|
+
}>;
|
|
80
118
|
/** A page of submissions as returned by `GET /forms/entries`. */
|
|
81
119
|
export interface EntriesPage {
|
|
82
120
|
entries: FormSubmission[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forms-service.d.ts","sourceRoot":"","sources":["../../src/lib/forms-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"forms-service.d.ts","sourceRoot":"","sources":["../../src/lib/forms-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -141,6 +141,30 @@ export async function updateEmbedSettings(id, payload) {
|
|
|
141
141
|
});
|
|
142
142
|
return { data: res.data, error: res.error };
|
|
143
143
|
}
|
|
144
|
+
export async function fetchFormWebhooks(formId) {
|
|
145
|
+
const res = await cmsApi(`/forms/${encodeURIComponent(formId)}/webhooks`);
|
|
146
|
+
throwIfError(res);
|
|
147
|
+
return res.data ?? [];
|
|
148
|
+
}
|
|
149
|
+
export async function createFormWebhook(formId, payload) {
|
|
150
|
+
const res = await cmsApi(`/forms/${encodeURIComponent(formId)}/webhooks`, {
|
|
151
|
+
method: 'POST',
|
|
152
|
+
body: JSON.stringify(payload),
|
|
153
|
+
});
|
|
154
|
+
return { data: res.data, error: res.error };
|
|
155
|
+
}
|
|
156
|
+
export async function updateFormWebhook(formId, webhookId, payload) {
|
|
157
|
+
const res = await cmsApi(`/forms/${encodeURIComponent(formId)}/webhooks/${encodeURIComponent(webhookId)}`, { method: 'PATCH', body: JSON.stringify(payload) });
|
|
158
|
+
return { data: res.data, error: res.error };
|
|
159
|
+
}
|
|
160
|
+
export async function deleteFormWebhook(formId, webhookId) {
|
|
161
|
+
const res = await cmsApi(`/forms/${encodeURIComponent(formId)}/webhooks/${encodeURIComponent(webhookId)}`, { method: 'DELETE' });
|
|
162
|
+
return { error: res.error };
|
|
163
|
+
}
|
|
164
|
+
export async function testFormWebhook(formId, webhookId) {
|
|
165
|
+
const res = await cmsApi(`/forms/${encodeURIComponent(formId)}/webhooks/${encodeURIComponent(webhookId)}/test`, { method: 'POST' });
|
|
166
|
+
return { data: res.data, error: res.error };
|
|
167
|
+
}
|
|
144
168
|
function buildEntriesQuery(params) {
|
|
145
169
|
const qs = new URLSearchParams();
|
|
146
170
|
if (params.search)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forms-service.js","sourceRoot":"","sources":["../../src/lib/forms-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"forms-service.js","sourceRoot":"","sources":["../../src/lib/forms-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAuCjC;;;;GAIG;AACH,SAAS,YAAY,CAAC,GAAuB;IAC3C,IAAI,GAAG,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AAC3C,CAAC;AAmBD,4EAA4E;AAE5E,SAAS,eAAe,CAAC,MAAwB;IAC/C,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAA;IAChC,IAAI,MAAM,CAAC,MAAM;QAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,MAAM;QAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC9C,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAA;IACvD,CAAC;IACD,IAAI,MAAM,CAAC,MAAM;QAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,aAAa;QAAE,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;IACvE,IAAI,MAAM,CAAC,IAAI;QAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IACpD,IAAI,MAAM,CAAC,QAAQ;QAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;IAChE,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;IACzB,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAA2B,EAAE;IAC5D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAiB,SAAS,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC5E,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAU;IAC5C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAiB,UAAU,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAC5E,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,CAAA;AACzB,CAAC;AAED,MAAM,WAAW,GAAc;IAC7B,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;CACjB,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAY,cAAc,CAAC,CAAA;IACnD,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,WAAW,CAAA;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAsB,uBAAuB,CAAC,CAAA;IACtE,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;AACvB,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAA0B;IAE1B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAiB,QAAQ,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAU,EACV,OAAkF;IAElF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAiB,UAAU,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3E,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAU;IAEV,MAAM,GAAG,GAAG,MAAM,MAAM,CAAiB,UAAU,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE;QACrF,MAAM,EAAE,MAAM;KACf,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;AAC/C,CAAC;AAED,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAU,EACV,OAA4B,EAAE;IAE9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,UAAU,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IACvF,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7B,CAAC;AAED,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAU;IAC9C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAmB,UAAU,kBAAkB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAA;IACrF,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAU,EACV,MAAmB,EACnB,KAAc;IAEd,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,UAAU,kBAAkB,CAAC,EAAE,CAAC,SAAS,EACzC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAC3D,CAAA;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,EAAU;IACxD,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,UAAU,kBAAkB,CAAC,EAAE,CAAC,gBAAgB,CACjD,CAAA;IACD,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAA;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,EAAU,EACV,OAA0C;IAE1C,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,UAAU,kBAAkB,CAAC,EAAE,CAAC,gBAAgB,EAChD,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CACjD,CAAA;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAU,EACV,OAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,MAAM,CAA6B,UAAU,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE;QAC9F,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;KAClC,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAU;IACjD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAoB,UAAU,kBAAkB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;IACrF,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAU,EACV,OAAmC;IAEnC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAoB,UAAU,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE;QACpF,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AA4BD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAsB,UAAU,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAC9F,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,OAAiC;IAEjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAqB,UAAU,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE;QAC5F,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,SAAiB,EACjB,OAAiC;IAEjC,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,UAAU,kBAAkB,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAChF,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CACnD,CAAA;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,SAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,UAAU,kBAAkB,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE,EAChF,EAAE,MAAM,EAAE,QAAQ,EAAE,CACrB,CAAA;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,SAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,UAAU,kBAAkB,CAAC,MAAM,CAAC,aAAa,kBAAkB,CAAC,SAAS,CAAC,OAAO,EACrF,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CAAA;IACD,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAmBD,SAAS,iBAAiB,CAAC,MAA8B;IACvD,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAA;IAChC,IAAI,MAAM,CAAC,MAAM;QAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,MAAM;QAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/E,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,SAAS;QAAE,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IAClF,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;IACrF,IAAI,MAAM,CAAC,UAAU;QAAE,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IAC9D,IAAI,MAAM,CAAC,QAAQ;QAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACxD,IAAI,MAAM,CAAC,MAAM;QAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,QAAQ;QAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAC/C,IAAI,MAAM,CAAC,MAAM;QAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,aAAa;QAAE,EAAE,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;IACvE,IAAI,MAAM,CAAC,IAAI;QAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IACpD,IAAI,MAAM,CAAC,QAAQ;QAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;IAChE,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;IACzB,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,GAAgB,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;AAEhF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiC,EAAE;IACpE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAc,iBAAiB,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACnF,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,UAAU,CAAA;AAC/B,CAAC;AAED,MAAM,YAAY,GAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AAE9F,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiC,EAAE;IACxE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAc,wBAAwB,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC1F,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,YAAY,CAAA;AACjC,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAc,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACjF,YAAY,CAAC,GAAG,CAAC,CAAA;IACjB,OAAO,GAAG,CAAC,IAAI,IAAI,IAAI,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAU,EACV,KAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAiB,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;QACnF,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;KAC5B,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC1F,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAa,EACb,KAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAsB,qBAAqB,EAAE;QACnE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;KACrC,CAAC,CAAA;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAA;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Form Schema drawer — the right-side panel opened from the Forms list "Schema"
|
|
5
|
-
* action.
|
|
6
|
-
* + domain restrictions), Notifications (
|
|
5
|
+
* action. Four tabs: Fields (versioned schema editor), Embed (public snippets
|
|
6
|
+
* + domain restrictions), Notifications (email settings), Integrations (CRM
|
|
7
|
+
* webhooks / Zapier).
|
|
7
8
|
*
|
|
8
9
|
* Saving the Fields tab creates a new schema version server-side; existing
|
|
9
10
|
* submissions keep referencing the version they were captured against, so
|
|
@@ -20,12 +21,14 @@ import { Drawer } from './Drawer.js'
|
|
|
20
21
|
import { FieldsPanel } from './FieldsPanel.js'
|
|
21
22
|
import { EmbedPanel } from './EmbedPanel.js'
|
|
22
23
|
import { NotificationsPanel } from './NotificationsPanel.js'
|
|
24
|
+
import { WebhooksPanel } from './WebhooksPanel.js'
|
|
23
25
|
import { FormsErrorState, FormsLoading, btnPrimary, btnSecondary } from './primitives.js'
|
|
24
26
|
|
|
25
27
|
const TABS = [
|
|
26
28
|
{ id: 'fields', label: 'Fields' },
|
|
27
29
|
{ id: 'embed', label: 'Embed' },
|
|
28
30
|
{ id: 'notifications', label: 'Notifications' },
|
|
31
|
+
{ id: 'integrations', label: 'Integrations' },
|
|
29
32
|
] as const
|
|
30
33
|
|
|
31
34
|
export function FormSchemaDrawer({
|
|
@@ -164,6 +167,10 @@ export function FormSchemaDrawer({
|
|
|
164
167
|
<Tabs.Content value="notifications" tabIndex={-1}>
|
|
165
168
|
{formId && <NotificationsPanel formId={formId} onChanged={onSaved} />}
|
|
166
169
|
</Tabs.Content>
|
|
170
|
+
|
|
171
|
+
<Tabs.Content value="integrations" tabIndex={-1}>
|
|
172
|
+
{formId && <WebhooksPanel formId={formId} formSlug={form.slug} />}
|
|
173
|
+
</Tabs.Content>
|
|
167
174
|
</Tabs.Root>
|
|
168
175
|
</Drawer>
|
|
169
176
|
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* Notifications tab of the Form Schema drawer. Persists per-form notification
|
|
5
5
|
* settings (recipients, reply-to, subject/message templates, field inclusion,
|
|
6
|
-
* autoresponder).
|
|
7
|
-
* wired in a later phase (PR 6); this panel owns the configuration only.
|
|
6
|
+
* autoresponder). Email delivery uses the configured email adapter when enabled.
|
|
8
7
|
*/
|
|
9
8
|
import { useEffect, useState } from 'react'
|
|
10
9
|
import * as Switch from '@radix-ui/react-switch'
|
|
@@ -179,8 +178,10 @@ export function NotificationsPanel({
|
|
|
179
178
|
</fieldset>
|
|
180
179
|
|
|
181
180
|
<p className="text-muted-foreground text-xs">
|
|
182
|
-
|
|
183
|
-
|
|
181
|
+
For CRM integrations (Zapier, HubSpot via Zapier, etc.), use the{' '}
|
|
182
|
+
<span className="font-medium">Integrations</span> tab to add a signed webhook. Email
|
|
183
|
+
notifications send when recipients are configured and your email provider is set up (
|
|
184
|
+
<span className="font-mono">RESEND_API_KEY</span> or SMTP).
|
|
184
185
|
</p>
|
|
185
186
|
|
|
186
187
|
<div className="flex justify-end">
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Integrations tab of the Form Schema drawer. Manages signed outbound webhooks
|
|
5
|
+
* (Zapier Catch Hook, Make, custom CRM endpoints) and guides editors through
|
|
6
|
+
* the default Zapier → Webhooks by Zapier → Catch Hook setup.
|
|
7
|
+
*/
|
|
8
|
+
import * as Switch from '@radix-ui/react-switch'
|
|
9
|
+
import { ExternalLink, Loader2, Plus, Trash2, Zap } from 'lucide-react'
|
|
10
|
+
import { useEffect, useState } from 'react'
|
|
11
|
+
import { toast } from 'sonner'
|
|
12
|
+
import {
|
|
13
|
+
createFormWebhook,
|
|
14
|
+
deleteFormWebhook,
|
|
15
|
+
fetchFormWebhooks,
|
|
16
|
+
testFormWebhook,
|
|
17
|
+
updateFormWebhook,
|
|
18
|
+
type FormWebhookConfig,
|
|
19
|
+
} from '../../lib/forms-service.js'
|
|
20
|
+
import { ConfirmDialog } from '../ui/ConfirmDialog.js'
|
|
21
|
+
import { FormsErrorState, FormsLoading, btnPrimary, btnSecondary } from './primitives.js'
|
|
22
|
+
|
|
23
|
+
const ZAPIER_CATCH_HOOK_DOCS = 'https://zapier.com/apps/webhook/integrations'
|
|
24
|
+
const FORMS_INTEGRATIONS_DOCS = 'https://actuatecms.dev/docs/forms-and-integrations'
|
|
25
|
+
|
|
26
|
+
const inputCls =
|
|
27
|
+
'border-border bg-input-background text-foreground focus-visible:ring-ring w-full rounded-md border px-2.5 py-1.5 text-sm focus-visible:ring-2 focus-visible:outline-none'
|
|
28
|
+
|
|
29
|
+
export function WebhooksPanel({ formId, formSlug }: { formId: string; formSlug: string }) {
|
|
30
|
+
const [webhooks, setWebhooks] = useState<FormWebhookConfig[]>([])
|
|
31
|
+
const [loading, setLoading] = useState(true)
|
|
32
|
+
const [error, setError] = useState<string | null>(null)
|
|
33
|
+
const [url, setUrl] = useState('')
|
|
34
|
+
const [creating, setCreating] = useState(false)
|
|
35
|
+
const [createdSecret, setCreatedSecret] = useState<string | null>(null)
|
|
36
|
+
const [pendingDelete, setPendingDelete] = useState<FormWebhookConfig | null>(null)
|
|
37
|
+
const [testingId, setTestingId] = useState<string | null>(null)
|
|
38
|
+
|
|
39
|
+
async function reload(): Promise<void> {
|
|
40
|
+
setLoading(true)
|
|
41
|
+
setError(null)
|
|
42
|
+
try {
|
|
43
|
+
setWebhooks(await fetchFormWebhooks(formId))
|
|
44
|
+
} catch (e: unknown) {
|
|
45
|
+
setError(e instanceof Error ? e.message : 'Failed to load webhooks')
|
|
46
|
+
} finally {
|
|
47
|
+
setLoading(false)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
let active = true
|
|
53
|
+
setLoading(true)
|
|
54
|
+
setError(null)
|
|
55
|
+
fetchFormWebhooks(formId)
|
|
56
|
+
.then((rows) => {
|
|
57
|
+
if (active) setWebhooks(rows)
|
|
58
|
+
})
|
|
59
|
+
.catch((e: unknown) => {
|
|
60
|
+
if (active) setError(e instanceof Error ? e.message : 'Failed to load webhooks')
|
|
61
|
+
})
|
|
62
|
+
.finally(() => {
|
|
63
|
+
if (active) setLoading(false)
|
|
64
|
+
})
|
|
65
|
+
return () => {
|
|
66
|
+
active = false
|
|
67
|
+
}
|
|
68
|
+
}, [formId])
|
|
69
|
+
|
|
70
|
+
async function handleCreate(e: React.FormEvent): Promise<void> {
|
|
71
|
+
e.preventDefault()
|
|
72
|
+
const trimmed = url.trim()
|
|
73
|
+
if (!trimmed) {
|
|
74
|
+
toast.error('Paste your Catch Hook URL first.')
|
|
75
|
+
return
|
|
76
|
+
}
|
|
77
|
+
setCreating(true)
|
|
78
|
+
const res = await createFormWebhook(formId, {
|
|
79
|
+
url: trimmed,
|
|
80
|
+
events: ['form.submitted'],
|
|
81
|
+
enabled: true,
|
|
82
|
+
})
|
|
83
|
+
setCreating(false)
|
|
84
|
+
if (res.error) {
|
|
85
|
+
toast.error(res.error)
|
|
86
|
+
return
|
|
87
|
+
}
|
|
88
|
+
if (res.data?.secret) setCreatedSecret(res.data.secret)
|
|
89
|
+
setUrl('')
|
|
90
|
+
toast.success('Webhook connected.')
|
|
91
|
+
await reload()
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function toggleEnabled(webhook: FormWebhookConfig, enabled: boolean): Promise<void> {
|
|
95
|
+
const res = await updateFormWebhook(formId, webhook.id, { enabled })
|
|
96
|
+
if (res.error) {
|
|
97
|
+
toast.error(res.error)
|
|
98
|
+
return
|
|
99
|
+
}
|
|
100
|
+
setWebhooks((rows) => rows.map((row) => (row.id === webhook.id ? { ...row, enabled } : row)))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function handleTest(webhookId: string): Promise<void> {
|
|
104
|
+
setTestingId(webhookId)
|
|
105
|
+
const res = await testFormWebhook(formId, webhookId)
|
|
106
|
+
setTestingId(null)
|
|
107
|
+
if (res.error) {
|
|
108
|
+
toast.error(res.error)
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
if (res.data?.ok) {
|
|
112
|
+
toast.success(`Test delivery succeeded (HTTP ${res.data.status}).`)
|
|
113
|
+
} else {
|
|
114
|
+
toast.error(res.data?.error || `Test failed (HTTP ${res.data?.status ?? 'unknown'}).`)
|
|
115
|
+
}
|
|
116
|
+
await reload()
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function confirmDelete(): Promise<void> {
|
|
120
|
+
if (!pendingDelete) return
|
|
121
|
+
const res = await deleteFormWebhook(formId, pendingDelete.id)
|
|
122
|
+
setPendingDelete(null)
|
|
123
|
+
if (res.error) {
|
|
124
|
+
toast.error(res.error)
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
toast.success('Webhook removed.')
|
|
128
|
+
await reload()
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (loading) return <FormsLoading label="Loading integrations…" />
|
|
132
|
+
if (error) return <FormsErrorState message={error} onRetry={() => void reload()} />
|
|
133
|
+
|
|
134
|
+
return (
|
|
135
|
+
<div className="space-y-5">
|
|
136
|
+
<section
|
|
137
|
+
className="border-border bg-muted/40 space-y-3 rounded-lg border p-4"
|
|
138
|
+
aria-labelledby="zapier-helper-title"
|
|
139
|
+
>
|
|
140
|
+
<div className="flex items-start gap-3">
|
|
141
|
+
<span className="bg-primary/10 text-primary flex h-9 w-9 shrink-0 items-center justify-center rounded-md">
|
|
142
|
+
<Zap size={18} aria-hidden />
|
|
143
|
+
</span>
|
|
144
|
+
<div className="min-w-0 space-y-2">
|
|
145
|
+
<h3 id="zapier-helper-title" className="text-foreground text-sm font-medium">
|
|
146
|
+
Connect to Zapier (recommended)
|
|
147
|
+
</h3>
|
|
148
|
+
<ol className="text-muted-foreground list-decimal space-y-1 pl-4 text-sm">
|
|
149
|
+
<li>
|
|
150
|
+
In Zapier, create a Zap with trigger{' '}
|
|
151
|
+
<span className="text-foreground font-medium">Webhooks by Zapier → Catch Hook</span>
|
|
152
|
+
.
|
|
153
|
+
</li>
|
|
154
|
+
<li>Copy the hook URL Zapier gives you and paste it below.</li>
|
|
155
|
+
<li>
|
|
156
|
+
Map fields in your action step — submission values arrive under{' '}
|
|
157
|
+
<span className="font-mono text-xs">data.email</span>,{' '}
|
|
158
|
+
<span className="font-mono text-xs">data.name</span>, etc.
|
|
159
|
+
</li>
|
|
160
|
+
<li>
|
|
161
|
+
Use event <span className="font-mono text-xs">form.submitted</span> only (spam hits
|
|
162
|
+
emit <span className="font-mono text-xs">form.spam_detected</span> separately).
|
|
163
|
+
</li>
|
|
164
|
+
</ol>
|
|
165
|
+
<p className="text-muted-foreground text-xs">
|
|
166
|
+
HubSpot, Salesforce, Slack, and Google Sheets work through Zapier actions — no native
|
|
167
|
+
Actuate app required for v1.
|
|
168
|
+
</p>
|
|
169
|
+
<div className="flex flex-wrap gap-3 pt-1">
|
|
170
|
+
<a
|
|
171
|
+
href={ZAPIER_CATCH_HOOK_DOCS}
|
|
172
|
+
target="_blank"
|
|
173
|
+
rel="noopener noreferrer"
|
|
174
|
+
className="text-primary inline-flex items-center gap-1 text-sm font-medium hover:underline"
|
|
175
|
+
>
|
|
176
|
+
Open Zapier Webhooks
|
|
177
|
+
<ExternalLink size={14} aria-hidden />
|
|
178
|
+
</a>
|
|
179
|
+
<a
|
|
180
|
+
href={FORMS_INTEGRATIONS_DOCS}
|
|
181
|
+
target="_blank"
|
|
182
|
+
rel="noopener noreferrer"
|
|
183
|
+
className="text-primary inline-flex items-center gap-1 text-sm font-medium hover:underline"
|
|
184
|
+
>
|
|
185
|
+
Full integration guide
|
|
186
|
+
<ExternalLink size={14} aria-hidden />
|
|
187
|
+
</a>
|
|
188
|
+
</div>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
</section>
|
|
192
|
+
|
|
193
|
+
<form onSubmit={handleCreate} className="space-y-3">
|
|
194
|
+
<label className="block">
|
|
195
|
+
<span className="text-foreground mb-1 block text-sm font-medium">Webhook URL</span>
|
|
196
|
+
<input
|
|
197
|
+
type="url"
|
|
198
|
+
value={url}
|
|
199
|
+
onChange={(e) => setUrl(e.target.value)}
|
|
200
|
+
placeholder="https://hooks.zapier.com/hooks/catch/…"
|
|
201
|
+
className={inputCls}
|
|
202
|
+
autoComplete="off"
|
|
203
|
+
/>
|
|
204
|
+
<span className="text-muted-foreground mt-1 block text-xs">
|
|
205
|
+
Paste your Catch Hook URL for form <span className="font-mono">{formSlug}</span>.
|
|
206
|
+
Payloads are HMAC-signed via <span className="font-mono">X-Actuate-Signature</span>.
|
|
207
|
+
</span>
|
|
208
|
+
</label>
|
|
209
|
+
<button
|
|
210
|
+
type="submit"
|
|
211
|
+
className={`${btnPrimary} inline-flex items-center`}
|
|
212
|
+
disabled={creating}
|
|
213
|
+
>
|
|
214
|
+
{creating ? (
|
|
215
|
+
<>
|
|
216
|
+
<Loader2 className="mr-2 inline h-4 w-4 animate-spin" aria-hidden />
|
|
217
|
+
Connecting…
|
|
218
|
+
</>
|
|
219
|
+
) : (
|
|
220
|
+
<>
|
|
221
|
+
<Plus className="mr-1 inline h-4 w-4" aria-hidden />
|
|
222
|
+
Add webhook
|
|
223
|
+
</>
|
|
224
|
+
)}
|
|
225
|
+
</button>
|
|
226
|
+
</form>
|
|
227
|
+
|
|
228
|
+
{createdSecret && (
|
|
229
|
+
<div
|
|
230
|
+
className="border-success/30 bg-success/10 text-foreground space-y-2 rounded-md border px-3 py-3 text-sm"
|
|
231
|
+
role="status"
|
|
232
|
+
>
|
|
233
|
+
<p className="font-medium">Signing secret (shown once)</p>
|
|
234
|
+
<p className="text-muted-foreground text-xs">
|
|
235
|
+
Store this if your CRM verifies HMAC signatures. You cannot retrieve it again after
|
|
236
|
+
closing this panel.
|
|
237
|
+
</p>
|
|
238
|
+
<pre className="border-border bg-background overflow-x-auto rounded border px-2 py-1.5 font-mono text-xs">
|
|
239
|
+
{createdSecret}
|
|
240
|
+
</pre>
|
|
241
|
+
<button type="button" className={btnSecondary} onClick={() => setCreatedSecret(null)}>
|
|
242
|
+
Dismiss
|
|
243
|
+
</button>
|
|
244
|
+
</div>
|
|
245
|
+
)}
|
|
246
|
+
|
|
247
|
+
{webhooks.length === 0 ? (
|
|
248
|
+
<p className="text-muted-foreground text-sm">
|
|
249
|
+
No webhooks yet. Add a Catch Hook URL to send each submission to your CRM.
|
|
250
|
+
</p>
|
|
251
|
+
) : (
|
|
252
|
+
<ul className="space-y-3" aria-label="Configured webhooks">
|
|
253
|
+
{webhooks.map((webhook) => (
|
|
254
|
+
<li
|
|
255
|
+
key={webhook.id}
|
|
256
|
+
className="border-border flex flex-col gap-3 rounded-lg border p-3 sm:flex-row sm:items-center sm:justify-between"
|
|
257
|
+
>
|
|
258
|
+
<div className="min-w-0">
|
|
259
|
+
<p className="text-foreground truncate font-mono text-xs">{webhook.url}</p>
|
|
260
|
+
<p className="text-muted-foreground mt-1 text-xs">
|
|
261
|
+
Events: {webhook.events.join(', ') || 'form.submitted'}
|
|
262
|
+
{webhook.lastDeliveryAt
|
|
263
|
+
? ` · Last delivery: ${webhook.lastDeliveryStatus ?? 'unknown'}`
|
|
264
|
+
: ''}
|
|
265
|
+
</p>
|
|
266
|
+
</div>
|
|
267
|
+
<div className="flex shrink-0 flex-wrap items-center gap-2">
|
|
268
|
+
<Switch.Root
|
|
269
|
+
checked={webhook.enabled}
|
|
270
|
+
onCheckedChange={(v) => void toggleEnabled(webhook, v)}
|
|
271
|
+
aria-label={`Enable webhook ${webhook.url}`}
|
|
272
|
+
className="bg-destructive data-[state=checked]:bg-success focus-visible:ring-ring relative h-[18px] w-8 rounded-full transition-colors focus-visible:ring-2 focus-visible:outline-none"
|
|
273
|
+
>
|
|
274
|
+
<Switch.Thumb className="bg-background block h-3.5 w-3.5 translate-x-0.5 rounded-full shadow-sm transition-transform data-[state=checked]:translate-x-[14px]" />
|
|
275
|
+
</Switch.Root>
|
|
276
|
+
<button
|
|
277
|
+
type="button"
|
|
278
|
+
className={btnSecondary}
|
|
279
|
+
disabled={testingId === webhook.id}
|
|
280
|
+
onClick={() => void handleTest(webhook.id)}
|
|
281
|
+
>
|
|
282
|
+
{testingId === webhook.id ? 'Testing…' : 'Send test'}
|
|
283
|
+
</button>
|
|
284
|
+
<button
|
|
285
|
+
type="button"
|
|
286
|
+
className="text-destructive hover:bg-destructive/10 focus-visible:ring-ring inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-sm font-medium focus-visible:ring-2 focus-visible:outline-none"
|
|
287
|
+
aria-label="Remove webhook"
|
|
288
|
+
onClick={() => setPendingDelete(webhook)}
|
|
289
|
+
>
|
|
290
|
+
<Trash2 size={16} aria-hidden />
|
|
291
|
+
Remove
|
|
292
|
+
</button>
|
|
293
|
+
</div>
|
|
294
|
+
</li>
|
|
295
|
+
))}
|
|
296
|
+
</ul>
|
|
297
|
+
)}
|
|
298
|
+
|
|
299
|
+
<ConfirmDialog
|
|
300
|
+
open={!!pendingDelete}
|
|
301
|
+
onClose={() => setPendingDelete(null)}
|
|
302
|
+
onConfirm={() => void confirmDelete()}
|
|
303
|
+
title="Remove webhook?"
|
|
304
|
+
description="New submissions will no longer be sent to this URL. Existing Zapier Zaps are not deleted — disable them in Zapier if needed."
|
|
305
|
+
confirmLabel="Remove"
|
|
306
|
+
cancelLabel="Keep webhook"
|
|
307
|
+
destructive
|
|
308
|
+
/>
|
|
309
|
+
</div>
|
|
310
|
+
)
|
|
311
|
+
}
|
package/src/lib/forms-service.ts
CHANGED
|
@@ -17,6 +17,8 @@ import type {
|
|
|
17
17
|
FormField,
|
|
18
18
|
FormNotificationSettings,
|
|
19
19
|
FormEmbedSettings,
|
|
20
|
+
FormWebhookConfig,
|
|
21
|
+
FormWebhookEvent,
|
|
20
22
|
FormStatus,
|
|
21
23
|
FormStats,
|
|
22
24
|
FormsSidebarCount,
|
|
@@ -35,6 +37,8 @@ export type {
|
|
|
35
37
|
FieldValidationRules,
|
|
36
38
|
FormNotificationSettings,
|
|
37
39
|
FormEmbedSettings,
|
|
40
|
+
FormWebhookConfig,
|
|
41
|
+
FormWebhookEvent,
|
|
38
42
|
FormStatus,
|
|
39
43
|
FormStats,
|
|
40
44
|
FormsSidebarCount,
|
|
@@ -251,6 +255,83 @@ export async function updateEmbedSettings(
|
|
|
251
255
|
return { data: res.data, error: res.error }
|
|
252
256
|
}
|
|
253
257
|
|
|
258
|
+
// ─── Webhooks (CRM / Zapier) ───────────────────────────────────────────────
|
|
259
|
+
|
|
260
|
+
export interface WebhookTestResult {
|
|
261
|
+
ok: boolean
|
|
262
|
+
status: number
|
|
263
|
+
attempts: number
|
|
264
|
+
error?: string
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export interface CreateFormWebhookPayload {
|
|
268
|
+
url: string
|
|
269
|
+
events?: FormWebhookEvent[]
|
|
270
|
+
enabled?: boolean
|
|
271
|
+
retryCount?: number
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export interface UpdateFormWebhookPayload {
|
|
275
|
+
url?: string
|
|
276
|
+
events?: FormWebhookEvent[]
|
|
277
|
+
enabled?: boolean
|
|
278
|
+
retryCount?: number
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/** Plaintext secret is returned only on create — store it before closing the dialog. */
|
|
282
|
+
export type CreatedFormWebhook = FormWebhookConfig & { secret: string }
|
|
283
|
+
|
|
284
|
+
export async function fetchFormWebhooks(formId: string): Promise<FormWebhookConfig[]> {
|
|
285
|
+
const res = await cmsApi<FormWebhookConfig[]>(`/forms/${encodeURIComponent(formId)}/webhooks`)
|
|
286
|
+
throwIfError(res)
|
|
287
|
+
return res.data ?? []
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
export async function createFormWebhook(
|
|
291
|
+
formId: string,
|
|
292
|
+
payload: CreateFormWebhookPayload,
|
|
293
|
+
): Promise<{ data?: CreatedFormWebhook; error?: string }> {
|
|
294
|
+
const res = await cmsApi<CreatedFormWebhook>(`/forms/${encodeURIComponent(formId)}/webhooks`, {
|
|
295
|
+
method: 'POST',
|
|
296
|
+
body: JSON.stringify(payload),
|
|
297
|
+
})
|
|
298
|
+
return { data: res.data, error: res.error }
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export async function updateFormWebhook(
|
|
302
|
+
formId: string,
|
|
303
|
+
webhookId: string,
|
|
304
|
+
payload: UpdateFormWebhookPayload,
|
|
305
|
+
): Promise<{ data?: FormWebhookConfig; error?: string }> {
|
|
306
|
+
const res = await cmsApi<FormWebhookConfig>(
|
|
307
|
+
`/forms/${encodeURIComponent(formId)}/webhooks/${encodeURIComponent(webhookId)}`,
|
|
308
|
+
{ method: 'PATCH', body: JSON.stringify(payload) },
|
|
309
|
+
)
|
|
310
|
+
return { data: res.data, error: res.error }
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export async function deleteFormWebhook(
|
|
314
|
+
formId: string,
|
|
315
|
+
webhookId: string,
|
|
316
|
+
): Promise<{ error?: string }> {
|
|
317
|
+
const res = await cmsApi(
|
|
318
|
+
`/forms/${encodeURIComponent(formId)}/webhooks/${encodeURIComponent(webhookId)}`,
|
|
319
|
+
{ method: 'DELETE' },
|
|
320
|
+
)
|
|
321
|
+
return { error: res.error }
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
export async function testFormWebhook(
|
|
325
|
+
formId: string,
|
|
326
|
+
webhookId: string,
|
|
327
|
+
): Promise<{ data?: WebhookTestResult; error?: string }> {
|
|
328
|
+
const res = await cmsApi<WebhookTestResult>(
|
|
329
|
+
`/forms/${encodeURIComponent(formId)}/webhooks/${encodeURIComponent(webhookId)}/test`,
|
|
330
|
+
{ method: 'POST' },
|
|
331
|
+
)
|
|
332
|
+
return { data: res.data, error: res.error }
|
|
333
|
+
}
|
|
334
|
+
|
|
254
335
|
// ─── Entries (submissions) ─────────────────────────────────────────────────
|
|
255
336
|
|
|
256
337
|
/** A page of submissions as returned by `GET /forms/entries`. */
|