@zyphr-dev/webhook-portal 0.1.0 → 0.1.2

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/README.md ADDED
@@ -0,0 +1,299 @@
1
+ # @zyphr-dev/webhook-portal
2
+
3
+ An embeddable React component that lets your customers manage their own webhook endpoints and inspect delivery logs — powered by [Zyphr WaaS](https://zyphr.dev/docs/guides/waas-embedded-portal) (Webhooks-as-a-Service).
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@zyphr-dev/webhook-portal)](https://www.npmjs.com/package/@zyphr-dev/webhook-portal)
6
+ [![license](https://img.shields.io/npm/l/@zyphr-dev/webhook-portal)](./LICENSE)
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ npm install @zyphr-dev/webhook-portal
12
+ # or
13
+ yarn add @zyphr-dev/webhook-portal
14
+ ```
15
+
16
+ Then import the styles in your app's entry point:
17
+
18
+ ```tsx
19
+ import '@zyphr-dev/webhook-portal/styles.css';
20
+ ```
21
+
22
+ **Requirements:** React 17+ and React DOM 17+
23
+
24
+ ## Quick Start
25
+
26
+ Generate a portal token on your server, then render the portal:
27
+
28
+ ```tsx
29
+ import { WebhookPortal } from '@zyphr-dev/webhook-portal';
30
+ import '@zyphr-dev/webhook-portal/styles.css';
31
+
32
+ function WebhooksPage() {
33
+ return (
34
+ <WebhookPortal
35
+ token={portalToken}
36
+ theme={{ mode: 'light' }}
37
+ onEndpointCreated={(ep) => console.log('Created:', ep.url)}
38
+ />
39
+ );
40
+ }
41
+ ```
42
+
43
+ Your customers can now create endpoints, subscribe to events, view delivery logs, and retry failed deliveries — all from within your app.
44
+
45
+ ## How It Works
46
+
47
+ 1. **Your server** requests a portal token from the Zyphr API, scoped to a specific application
48
+ 2. **Your frontend** passes that token to `<WebhookPortal />`
49
+ 3. **The portal** authenticates directly with the Zyphr API using the token
50
+ 4. **Your customers** manage their webhook endpoints without ever leaving your app
51
+
52
+ ## Portal Props
53
+
54
+ ```tsx
55
+ <WebhookPortal
56
+ token="portal_token_xxx" // Required
57
+ baseUrl="https://api.zyphr.dev/v1/waas-portal" // Default
58
+ theme={{ mode: 'dark', accent: '#6366f1', borderRadius: 8 }}
59
+ locale="en"
60
+ preview={false}
61
+ className="my-portal"
62
+ onEndpointCreated={(endpoint) => {}}
63
+ onEndpointUpdated={(endpoint) => {}}
64
+ onEndpointDeleted={(endpoint) => {}}
65
+ onDeliveryRetried={(deliveryId) => {}}
66
+ onError={(error) => {}}
67
+ />
68
+ ```
69
+
70
+ | Prop | Type | Default | Description |
71
+ |------|------|---------|-------------|
72
+ | `token` | `string` | — | **Required.** Portal authentication token |
73
+ | `baseUrl` | `string` | `https://api.zyphr.dev/v1/waas-portal` | API base URL |
74
+ | `theme` | `PortalTheme` | `{ mode: 'light' }` | Theme configuration |
75
+ | `locale` | `string` | — | Locale identifier (future i18n support) |
76
+ | `preview` | `boolean` | `false` | Render with mock data, no API calls |
77
+ | `className` | `string` | — | CSS class for the portal wrapper |
78
+ | `onEndpointCreated` | `(endpoint: PortalEndpoint) => void` | — | Fires after an endpoint is created |
79
+ | `onEndpointUpdated` | `(endpoint: PortalEndpoint) => void` | — | Fires after an endpoint is updated |
80
+ | `onEndpointDeleted` | `(endpoint: PortalEndpoint) => void` | — | Fires after an endpoint is deleted |
81
+ | `onDeliveryRetried` | `(deliveryId: string) => void` | — | Fires after a delivery retry is queued |
82
+ | `onError` | `(error: Error) => void` | — | Fires on any API error |
83
+
84
+ ## Theming
85
+
86
+ Customize the portal's appearance with the `theme` prop:
87
+
88
+ ```tsx
89
+ <WebhookPortal
90
+ token={token}
91
+ theme={{
92
+ mode: 'dark', // 'light' | 'dark'
93
+ accent: '#8b5cf6', // Any CSS color value
94
+ borderRadius: 12, // Border radius in pixels
95
+ }}
96
+ />
97
+ ```
98
+
99
+ | Property | Type | Default | Description |
100
+ |----------|------|---------|-------------|
101
+ | `mode` | `'light' \| 'dark'` | `'light'` | Color scheme |
102
+ | `accent` | `string` | `#6366f1` | Primary accent color |
103
+ | `borderRadius` | `number` | `8` | Border radius in pixels |
104
+
105
+ ### CSS Variables
106
+
107
+ The portal uses CSS custom properties scoped under `.zwp-portal`, so styles won't leak into your app. You can override variables directly:
108
+
109
+ ```css
110
+ .zwp-portal {
111
+ --zwp-accent: #8b5cf6;
112
+ --zwp-radius: 12px;
113
+ --zwp-bg: #0f0f0f;
114
+ --zwp-text: #e5e5e5;
115
+ }
116
+ ```
117
+
118
+ **Available variables:**
119
+
120
+ | Variable | Description |
121
+ |----------|-------------|
122
+ | `--zwp-accent` | Primary accent color |
123
+ | `--zwp-radius` | Border radius |
124
+ | `--zwp-bg` | Background color |
125
+ | `--zwp-bg-secondary` | Secondary background (cards, inputs) |
126
+ | `--zwp-border` | Border color |
127
+ | `--zwp-text` | Primary text color |
128
+ | `--zwp-text-secondary` | Secondary/muted text |
129
+ | `--zwp-input-bg` | Input field background |
130
+ | `--zwp-hover` | Hover state background |
131
+ | `--zwp-font` | Font family |
132
+ | `--zwp-mono` | Monospace font family |
133
+
134
+ ## Features
135
+
136
+ ### Endpoint Management
137
+
138
+ Your customers can:
139
+ - **Create endpoints** with a URL, description, and event subscriptions
140
+ - **Pause/resume** endpoints without deleting them
141
+ - **Delete** endpoints they no longer need
142
+ - **Copy signing secrets** displayed once at creation time
143
+ - **Rotate signing secrets** for security key rotation
144
+
145
+ ### Delivery Logs
146
+
147
+ For each endpoint, customers can:
148
+ - **Browse delivery history** with pagination (20 per page)
149
+ - **Filter by status** — delivered, failed, exhausted, retrying, pending
150
+ - **Inspect delivery details** — event type, attempt count, HTTP response status, latency
151
+ - **Retry failed deliveries** — requeue `failed` or `exhausted` deliveries
152
+
153
+ ### Status Indicators
154
+
155
+ Deliveries and endpoints use color-coded badges:
156
+
157
+ | Status | Color | Meaning |
158
+ |--------|-------|---------|
159
+ | `active` / `delivered` | Green | Healthy |
160
+ | `paused` / `retrying` / `pending` | Yellow | Attention needed |
161
+ | `disabled` / `failed` / `exhausted` | Red | Action required |
162
+
163
+ ## Using the API Hook
164
+
165
+ For advanced use cases, the `usePortalApi` hook gives you direct access to the portal API:
166
+
167
+ ```tsx
168
+ import { usePortalApi } from '@zyphr-dev/webhook-portal';
169
+
170
+ function CustomPortal({ token }: { token: string }) {
171
+ const api = usePortalApi({ token });
172
+
173
+ const loadEndpoints = async () => {
174
+ const { endpoints, total } = await api.listEndpoints(20, 0);
175
+ console.log(`${total} endpoints:`, endpoints);
176
+ };
177
+
178
+ const createEndpoint = async () => {
179
+ const endpoint = await api.createEndpoint({
180
+ url: 'https://example.com/webhooks',
181
+ events: ['order.created', 'order.updated'],
182
+ description: 'Production webhook',
183
+ });
184
+ // endpoint.secret is only available at creation time
185
+ console.log('Signing secret:', endpoint.secret);
186
+ };
187
+
188
+ const retryDelivery = async (endpointId: string, deliveryId: string) => {
189
+ await api.retryDelivery(endpointId, deliveryId);
190
+ };
191
+ }
192
+ ```
193
+
194
+ ### API Methods
195
+
196
+ | Method | Description |
197
+ |--------|-------------|
198
+ | `listEventTypes()` | Get available event types |
199
+ | `listEndpoints(limit?, offset?)` | List endpoints with pagination |
200
+ | `createEndpoint({ url, events, description? })` | Create a new endpoint (returns signing secret) |
201
+ | `updateEndpoint(id, { url?, events?, status?, description? })` | Update an endpoint |
202
+ | `deleteEndpoint(id)` | Delete an endpoint |
203
+ | `rotateSecret(id)` | Generate a new signing secret |
204
+ | `listDeliveries(endpointId, { limit?, offset?, status? })` | List deliveries with filtering |
205
+ | `getDelivery(endpointId, deliveryId)` | Get delivery details (includes payload and response) |
206
+ | `retryDelivery(endpointId, deliveryId)` | Retry a failed/exhausted delivery |
207
+
208
+ All methods throw an `Error` on HTTP failure with the server's error message.
209
+
210
+ ## Types
211
+
212
+ All types are exported for TypeScript consumers:
213
+
214
+ ```tsx
215
+ import type {
216
+ WebhookPortalProps,
217
+ PortalTheme,
218
+ PortalEventType,
219
+ PortalEndpoint,
220
+ PortalEndpointWithSecret,
221
+ PortalDelivery,
222
+ PortalDeliveryDetail,
223
+ } from '@zyphr-dev/webhook-portal';
224
+ ```
225
+
226
+ ### Key Types
227
+
228
+ ```typescript
229
+ interface PortalEndpoint {
230
+ id: string;
231
+ url: string;
232
+ description?: string;
233
+ events: string[];
234
+ status: 'active' | 'paused' | 'disabled';
235
+ retry_policy?: { max_attempts?: number; intervals?: number[] };
236
+ consecutive_failures?: number;
237
+ last_failure_at?: string;
238
+ disabled_at?: string;
239
+ disabled_reason?: string;
240
+ created_at: string;
241
+ updated_at: string;
242
+ }
243
+
244
+ interface PortalEndpointWithSecret extends PortalEndpoint {
245
+ secret: string; // Only returned at creation time
246
+ }
247
+
248
+ interface PortalDelivery {
249
+ id: string;
250
+ event_id: string;
251
+ event_type: string;
252
+ status: 'pending' | 'delivering' | 'delivered' | 'failed' | 'retrying' | 'exhausted';
253
+ attempts: number;
254
+ max_attempts: number;
255
+ last_response_status?: number;
256
+ latency_ms?: number;
257
+ last_error?: string;
258
+ first_attempted_at?: string;
259
+ last_attempted_at?: string;
260
+ completed_at?: string;
261
+ created_at: string;
262
+ }
263
+
264
+ interface PortalDeliveryDetail extends PortalDelivery {
265
+ payload?: Record<string, unknown>;
266
+ last_response_body?: string;
267
+ }
268
+
269
+ interface PortalEventType {
270
+ event_type: string;
271
+ name: string;
272
+ description?: string;
273
+ category?: string;
274
+ example_payload?: Record<string, unknown>;
275
+ }
276
+ ```
277
+
278
+ ## Preview Mode
279
+
280
+ Pass `preview={true}` to render the portal with mock data and no API calls. Useful for prototyping, testing themes, or building documentation:
281
+
282
+ ```tsx
283
+ <WebhookPortal token="preview" preview={true} theme={{ mode: 'dark' }} />
284
+ ```
285
+
286
+ ## Bundle
287
+
288
+ Dual-format build — works with both ESM and CommonJS bundlers:
289
+
290
+ - **ESM:** `dist/index.js`
291
+ - **CommonJS:** `dist/index.cjs`
292
+ - **Types:** `dist/index.d.ts`
293
+ - **Styles:** `dist/styles.css`
294
+
295
+ Zero runtime dependencies beyond React.
296
+
297
+ ## License
298
+
299
+ MIT
package/dist/index.cjs CHANGED
@@ -75,7 +75,7 @@ function usePortalApi({ token, baseUrl }) {
75
75
  method: 'POST',
76
76
  });
77
77
  }, [request]);
78
- return {
78
+ return react.useMemo(() => ({
79
79
  listEventTypes,
80
80
  listEndpoints,
81
81
  createEndpoint,
@@ -85,7 +85,17 @@ function usePortalApi({ token, baseUrl }) {
85
85
  listDeliveries,
86
86
  getDelivery,
87
87
  retryDelivery,
88
- };
88
+ }), [
89
+ listEventTypes,
90
+ listEndpoints,
91
+ createEndpoint,
92
+ updateEndpoint,
93
+ deleteEndpoint,
94
+ rotateSecret,
95
+ listDeliveries,
96
+ getDelivery,
97
+ retryDelivery,
98
+ ]);
89
99
  }
90
100
 
91
101
  function EndpointList({ api, eventTypes, onSelect, onCreated, onDeleted, onUpdated, onError, }) {
@@ -122,6 +132,7 @@ function EndpointList({ api, eventTypes, onSelect, onCreated, onDeleted, onUpdat
122
132
  description: newDesc || undefined,
123
133
  });
124
134
  setCreatedSecret(endpoint.secret);
135
+ setShowCreate(false);
125
136
  setNewUrl('');
126
137
  setNewEvents([]);
127
138
  setNewDesc('');
@@ -170,7 +181,7 @@ function EndpointList({ api, eventTypes, onSelect, onCreated, onDeleted, onUpdat
170
181
  if (isLoading) {
171
182
  return jsxRuntime.jsx("div", { className: "zwp-loading", children: "Loading endpoints..." });
172
183
  }
173
- return (jsxRuntime.jsxs("div", { className: "zwp-endpoint-list", children: [jsxRuntime.jsxs("div", { className: "zwp-section-header", children: [jsxRuntime.jsx("h3", { className: "zwp-heading", children: "Endpoints" }), jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--primary", onClick: () => { setShowCreate(!showCreate); setCreatedSecret(null); }, children: showCreate ? 'Cancel' : 'Add Endpoint' })] }), createdSecret && (jsxRuntime.jsxs("div", { className: "zwp-alert zwp-alert--warning", children: [jsxRuntime.jsx("strong", { children: "Signing Secret" }), jsxRuntime.jsx("p", { children: "Store this secret securely. It will not be shown again." }), jsxRuntime.jsx("code", { className: "zwp-secret", children: createdSecret }), jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--sm", onClick: () => { navigator.clipboard.writeText(createdSecret); }, children: "Copy" })] })), showCreate && (jsxRuntime.jsxs("div", { className: "zwp-create-form", children: [jsxRuntime.jsxs("div", { className: "zwp-field", children: [jsxRuntime.jsx("label", { className: "zwp-label", children: "URL" }), jsxRuntime.jsx("input", { className: "zwp-input", type: "url", placeholder: "https://your-app.com/webhooks", value: newUrl, onChange: e => setNewUrl(e.target.value) })] }), jsxRuntime.jsxs("div", { className: "zwp-field", children: [jsxRuntime.jsx("label", { className: "zwp-label", children: "Description (optional)" }), jsxRuntime.jsx("input", { className: "zwp-input", type: "text", placeholder: "Production endpoint", value: newDesc, onChange: e => setNewDesc(e.target.value) })] }), jsxRuntime.jsxs("div", { className: "zwp-field", children: [jsxRuntime.jsx("label", { className: "zwp-label", children: "Events" }), jsxRuntime.jsx("div", { className: "zwp-event-picker", children: eventTypes.map(et => (jsxRuntime.jsxs("label", { className: "zwp-checkbox-label", children: [jsxRuntime.jsx("input", { type: "checkbox", checked: newEvents.includes(et.event_type), onChange: () => toggleEvent(et.event_type) }), jsxRuntime.jsx("span", { className: "zwp-event-name", children: et.name }), jsxRuntime.jsx("span", { className: "zwp-event-type", children: et.event_type })] }, et.event_type))) })] }), jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--primary", onClick: handleCreate, disabled: isCreating || !newUrl || newEvents.length === 0, children: isCreating ? 'Creating...' : 'Create Endpoint' })] })), endpoints.length === 0 ? (jsxRuntime.jsxs("div", { className: "zwp-empty", children: [jsxRuntime.jsx("p", { children: "No endpoints configured yet." }), jsxRuntime.jsx("p", { children: "Add an endpoint to start receiving webhook deliveries." })] })) : (jsxRuntime.jsx("div", { className: "zwp-list", children: endpoints.map(ep => (jsxRuntime.jsxs("div", { className: "zwp-endpoint-card", onClick: () => onSelect(ep), children: [jsxRuntime.jsxs("div", { className: "zwp-endpoint-header", children: [jsxRuntime.jsx("code", { className: "zwp-endpoint-url", children: ep.url }), jsxRuntime.jsx("span", { className: statusBadgeClass(ep.status), children: ep.status })] }), ep.description && (jsxRuntime.jsx("p", { className: "zwp-endpoint-desc", children: ep.description })), jsxRuntime.jsxs("div", { className: "zwp-endpoint-meta", children: [jsxRuntime.jsxs("span", { children: [ep.events.length, " event", ep.events.length !== 1 ? 's' : ''] }), jsxRuntime.jsxs("span", { children: ["Created ", new Date(ep.created_at).toLocaleDateString()] })] }), jsxRuntime.jsxs("div", { className: "zwp-endpoint-actions", onClick: e => e.stopPropagation(), children: [jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--sm zwp-btn--ghost", onClick: () => handleToggleStatus(ep), children: ep.status === 'active' ? 'Pause' : 'Resume' }), jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--sm zwp-btn--danger", onClick: () => handleDelete(ep), children: "Delete" })] })] }, ep.id))) }))] }));
184
+ return (jsxRuntime.jsxs("div", { className: "zwp-endpoint-list", children: [jsxRuntime.jsxs("div", { className: "zwp-section-header", children: [jsxRuntime.jsx("h3", { className: "zwp-heading", children: "Endpoints" }), jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--primary", onClick: () => { setShowCreate(!showCreate); setCreatedSecret(null); }, children: showCreate ? 'Cancel' : 'Add Endpoint' })] }), createdSecret && (jsxRuntime.jsxs("div", { className: "zwp-alert zwp-alert--warning", children: [jsxRuntime.jsx("button", { className: "zwp-alert-close", onClick: () => setCreatedSecret(null), children: "\u00D7" }), jsxRuntime.jsx("strong", { children: "Signing Secret" }), jsxRuntime.jsx("p", { children: "Store this secret securely. It will not be shown again." }), jsxRuntime.jsx("code", { className: "zwp-secret", children: createdSecret }), jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--sm", onClick: () => { navigator.clipboard.writeText(createdSecret); }, children: "Copy" })] })), showCreate && (jsxRuntime.jsxs("div", { className: "zwp-create-form", children: [jsxRuntime.jsxs("div", { className: "zwp-field", children: [jsxRuntime.jsx("label", { className: "zwp-label", children: "URL" }), jsxRuntime.jsx("input", { className: "zwp-input", type: "url", placeholder: "https://your-app.com/webhooks", value: newUrl, onChange: e => setNewUrl(e.target.value) })] }), jsxRuntime.jsxs("div", { className: "zwp-field", children: [jsxRuntime.jsx("label", { className: "zwp-label", children: "Description (optional)" }), jsxRuntime.jsx("input", { className: "zwp-input", type: "text", placeholder: "Production endpoint", value: newDesc, onChange: e => setNewDesc(e.target.value) })] }), jsxRuntime.jsxs("div", { className: "zwp-field", children: [jsxRuntime.jsx("label", { className: "zwp-label", children: "Events" }), jsxRuntime.jsx("div", { className: "zwp-event-picker", children: eventTypes.map(et => (jsxRuntime.jsxs("label", { className: "zwp-checkbox-label", children: [jsxRuntime.jsx("input", { type: "checkbox", checked: newEvents.includes(et.event_type), onChange: () => toggleEvent(et.event_type) }), jsxRuntime.jsx("span", { className: "zwp-event-name", children: et.name }), jsxRuntime.jsx("span", { className: "zwp-event-type", children: et.event_type })] }, et.event_type))) })] }), jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--primary", onClick: handleCreate, disabled: isCreating || !newUrl || newEvents.length === 0, children: isCreating ? 'Creating...' : 'Create Endpoint' })] })), endpoints.length === 0 ? (jsxRuntime.jsxs("div", { className: "zwp-empty", children: [jsxRuntime.jsx("p", { children: "No endpoints configured yet." }), jsxRuntime.jsx("p", { children: "Add an endpoint to start receiving webhook deliveries." })] })) : (jsxRuntime.jsx("div", { className: "zwp-list", children: endpoints.map(ep => (jsxRuntime.jsxs("div", { className: "zwp-endpoint-card", onClick: () => onSelect(ep), children: [jsxRuntime.jsxs("div", { className: "zwp-endpoint-header", children: [jsxRuntime.jsx("code", { className: "zwp-endpoint-url", children: ep.url }), jsxRuntime.jsx("span", { className: statusBadgeClass(ep.status), children: ep.status })] }), ep.description && (jsxRuntime.jsx("p", { className: "zwp-endpoint-desc", children: ep.description })), jsxRuntime.jsxs("div", { className: "zwp-endpoint-meta", children: [jsxRuntime.jsxs("span", { children: [ep.events.length, " event", ep.events.length !== 1 ? 's' : ''] }), jsxRuntime.jsxs("span", { children: ["Created ", new Date(ep.created_at).toLocaleDateString()] })] }), jsxRuntime.jsxs("div", { className: "zwp-endpoint-actions", onClick: e => e.stopPropagation(), children: [jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--sm zwp-btn--ghost", onClick: () => handleToggleStatus(ep), children: ep.status === 'active' ? 'Pause' : 'Resume' }), jsxRuntime.jsx("button", { className: "zwp-btn zwp-btn--sm zwp-btn--danger", onClick: () => handleDelete(ep), children: "Delete" })] })] }, ep.id))) }))] }));
174
185
  }
175
186
 
176
187
  function EndpointDetail({ api, endpoint, onBack, onRetried, onError }) {
@@ -269,6 +280,9 @@ function WebhookPortal({ token, baseUrl, theme, preview, onEndpointCreated, onEn
269
280
  const [eventTypes, setEventTypes] = react.useState([]);
270
281
  const [selectedEndpoint, setSelectedEndpoint] = react.useState(null);
271
282
  const [error, setError] = react.useState(null);
283
+ // Stable ref for onError to avoid re-triggering the fetch effect
284
+ const onErrorRef = react.useRef(onError);
285
+ onErrorRef.current = onError;
272
286
  react.useEffect(() => {
273
287
  if (preview)
274
288
  return;
@@ -277,9 +291,9 @@ function WebhookPortal({ token, baseUrl, theme, preview, onEndpointCreated, onEn
277
291
  .catch(err => {
278
292
  const e = err instanceof Error ? err : new Error('Failed to load event types');
279
293
  setError(e.message);
280
- onError?.(e);
294
+ onErrorRef.current?.(e);
281
295
  });
282
- }, [api, onError, preview]);
296
+ }, [api, preview]);
283
297
  const handleError = (err) => {
284
298
  setError(err.message);
285
299
  onError?.(err);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/hooks/usePortalApi.ts","../src/components/EndpointList.tsx","../src/components/EndpointDetail.tsx","../src/components/WebhookPortal.tsx"],"sourcesContent":["import { useCallback, useRef } from 'react';\nimport type {\n PortalApiResponse,\n PortalEventType,\n PortalEndpoint,\n PortalEndpointWithSecret,\n PortalDelivery,\n PortalDeliveryDetail,\n} from '../types';\n\nconst DEFAULT_BASE_URL = 'https://api.zyphr.dev/v1/waas-portal';\n\ninterface UsePortalApiOptions {\n token: string;\n baseUrl?: string;\n}\n\nexport function usePortalApi({ token, baseUrl }: UsePortalApiOptions) {\n const base = baseUrl || DEFAULT_BASE_URL;\n const tokenRef = useRef(token);\n tokenRef.current = token;\n\n const request = useCallback(async <T>(path: string, options?: RequestInit): Promise<T> => {\n const res = await fetch(`${base}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${tokenRef.current}`,\n ...options?.headers,\n },\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error?.message || `Request failed: ${res.status}`);\n }\n\n if (res.status === 204) return undefined as T;\n return res.json();\n }, [base]);\n\n const listEventTypes = useCallback(async () => {\n const res = await request<PortalApiResponse<PortalEventType[]>>('/event-types');\n return res.data;\n }, [request]);\n\n const listEndpoints = useCallback(async (limit = 20, offset = 0) => {\n const res = await request<PortalApiResponse<PortalEndpoint[]>>(\n `/endpoints?limit=${limit}&offset=${offset}`\n );\n return { endpoints: res.data, total: res.meta.total || 0 };\n }, [request]);\n\n const createEndpoint = useCallback(async (data: {\n url: string;\n events: string[];\n description?: string;\n }) => {\n const res = await request<PortalApiResponse<PortalEndpointWithSecret>>('/endpoints', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return res.data;\n }, [request]);\n\n const updateEndpoint = useCallback(async (endpointId: string, data: {\n url?: string;\n events?: string[];\n status?: 'active' | 'paused' | 'disabled';\n description?: string;\n }) => {\n const res = await request<PortalApiResponse<PortalEndpoint>>(`/endpoints/${endpointId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n return res.data;\n }, [request]);\n\n const deleteEndpoint = useCallback(async (endpointId: string) => {\n await request(`/endpoints/${endpointId}`, { method: 'DELETE' });\n }, [request]);\n\n const rotateSecret = useCallback(async (endpointId: string) => {\n const res = await request<PortalApiResponse<{ secret: string }>>(\n `/endpoints/${endpointId}/rotate-secret`,\n { method: 'POST' }\n );\n return res.data.secret;\n }, [request]);\n\n const listDeliveries = useCallback(async (endpointId: string, params?: {\n limit?: number;\n offset?: number;\n status?: string;\n }) => {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n if (params?.status) query.set('status', params.status);\n const qs = query.toString();\n\n const res = await request<PortalApiResponse<PortalDelivery[]>>(\n `/endpoints/${endpointId}/deliveries${qs ? `?${qs}` : ''}`\n );\n return { deliveries: res.data, total: res.meta.total || 0 };\n }, [request]);\n\n const getDelivery = useCallback(async (endpointId: string, deliveryId: string) => {\n const res = await request<PortalApiResponse<PortalDeliveryDetail>>(\n `/endpoints/${endpointId}/deliveries/${deliveryId}`\n );\n return res.data;\n }, [request]);\n\n const retryDelivery = useCallback(async (endpointId: string, deliveryId: string) => {\n await request(`/endpoints/${endpointId}/deliveries/${deliveryId}/retry`, {\n method: 'POST',\n });\n }, [request]);\n\n return {\n listEventTypes,\n listEndpoints,\n createEndpoint,\n updateEndpoint,\n deleteEndpoint,\n rotateSecret,\n listDeliveries,\n getDelivery,\n retryDelivery,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { PortalEndpoint, PortalEventType } from '../types';\nimport type { usePortalApi } from '../hooks/usePortalApi';\n\ninterface EndpointListProps {\n api: ReturnType<typeof usePortalApi>;\n eventTypes: PortalEventType[];\n onSelect: (endpoint: PortalEndpoint) => void;\n onCreated?: (endpoint: PortalEndpoint) => void;\n onDeleted?: (endpoint: PortalEndpoint) => void;\n onUpdated?: (endpoint: PortalEndpoint) => void;\n onError?: (error: Error) => void;\n}\n\nexport function EndpointList({\n api,\n eventTypes,\n onSelect,\n onCreated,\n onDeleted,\n onUpdated,\n onError,\n}: EndpointListProps) {\n const [endpoints, setEndpoints] = useState<PortalEndpoint[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [showCreate, setShowCreate] = useState(false);\n const [newUrl, setNewUrl] = useState('');\n const [newEvents, setNewEvents] = useState<string[]>([]);\n const [newDesc, setNewDesc] = useState('');\n const [isCreating, setIsCreating] = useState(false);\n const [createdSecret, setCreatedSecret] = useState<string | null>(null);\n\n const fetchEndpoints = useCallback(async () => {\n try {\n setIsLoading(true);\n const result = await api.listEndpoints(100, 0);\n setEndpoints(result.endpoints);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to load endpoints'));\n } finally {\n setIsLoading(false);\n }\n }, [api, onError]);\n\n useEffect(() => { fetchEndpoints(); }, [fetchEndpoints]);\n\n const handleCreate = async () => {\n if (!newUrl || newEvents.length === 0) return;\n setIsCreating(true);\n try {\n const endpoint = await api.createEndpoint({\n url: newUrl,\n events: newEvents,\n description: newDesc || undefined,\n });\n setCreatedSecret(endpoint.secret);\n setNewUrl('');\n setNewEvents([]);\n setNewDesc('');\n await fetchEndpoints();\n onCreated?.(endpoint);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to create endpoint'));\n } finally {\n setIsCreating(false);\n }\n };\n\n const handleDelete = async (ep: PortalEndpoint) => {\n try {\n await api.deleteEndpoint(ep.id);\n await fetchEndpoints();\n onDeleted?.(ep);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to delete endpoint'));\n }\n };\n\n const handleToggleStatus = async (ep: PortalEndpoint) => {\n const newStatus = ep.status === 'active' ? 'paused' : 'active';\n try {\n const updated = await api.updateEndpoint(ep.id, { status: newStatus });\n await fetchEndpoints();\n onUpdated?.(updated);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to update endpoint'));\n }\n };\n\n const toggleEvent = (eventType: string) => {\n setNewEvents(prev =>\n prev.includes(eventType) ? prev.filter(e => e !== eventType) : [...prev, eventType]\n );\n };\n\n const statusBadgeClass = (status: string) => {\n switch (status) {\n case 'active': return 'zwp-badge zwp-badge--green';\n case 'paused': return 'zwp-badge zwp-badge--yellow';\n case 'disabled': return 'zwp-badge zwp-badge--red';\n default: return 'zwp-badge';\n }\n };\n\n if (isLoading) {\n return <div className=\"zwp-loading\">Loading endpoints...</div>;\n }\n\n return (\n <div className=\"zwp-endpoint-list\">\n <div className=\"zwp-section-header\">\n <h3 className=\"zwp-heading\">Endpoints</h3>\n <button\n className=\"zwp-btn zwp-btn--primary\"\n onClick={() => { setShowCreate(!showCreate); setCreatedSecret(null); }}\n >\n {showCreate ? 'Cancel' : 'Add Endpoint'}\n </button>\n </div>\n\n {createdSecret && (\n <div className=\"zwp-alert zwp-alert--warning\">\n <strong>Signing Secret</strong>\n <p>Store this secret securely. It will not be shown again.</p>\n <code className=\"zwp-secret\">{createdSecret}</code>\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => { navigator.clipboard.writeText(createdSecret); }}\n >\n Copy\n </button>\n </div>\n )}\n\n {showCreate && (\n <div className=\"zwp-create-form\">\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">URL</label>\n <input\n className=\"zwp-input\"\n type=\"url\"\n placeholder=\"https://your-app.com/webhooks\"\n value={newUrl}\n onChange={e => setNewUrl(e.target.value)}\n />\n </div>\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">Description (optional)</label>\n <input\n className=\"zwp-input\"\n type=\"text\"\n placeholder=\"Production endpoint\"\n value={newDesc}\n onChange={e => setNewDesc(e.target.value)}\n />\n </div>\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">Events</label>\n <div className=\"zwp-event-picker\">\n {eventTypes.map(et => (\n <label key={et.event_type} className=\"zwp-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={newEvents.includes(et.event_type)}\n onChange={() => toggleEvent(et.event_type)}\n />\n <span className=\"zwp-event-name\">{et.name}</span>\n <span className=\"zwp-event-type\">{et.event_type}</span>\n </label>\n ))}\n </div>\n </div>\n <button\n className=\"zwp-btn zwp-btn--primary\"\n onClick={handleCreate}\n disabled={isCreating || !newUrl || newEvents.length === 0}\n >\n {isCreating ? 'Creating...' : 'Create Endpoint'}\n </button>\n </div>\n )}\n\n {endpoints.length === 0 ? (\n <div className=\"zwp-empty\">\n <p>No endpoints configured yet.</p>\n <p>Add an endpoint to start receiving webhook deliveries.</p>\n </div>\n ) : (\n <div className=\"zwp-list\">\n {endpoints.map(ep => (\n <div key={ep.id} className=\"zwp-endpoint-card\" onClick={() => onSelect(ep)}>\n <div className=\"zwp-endpoint-header\">\n <code className=\"zwp-endpoint-url\">{ep.url}</code>\n <span className={statusBadgeClass(ep.status)}>{ep.status}</span>\n </div>\n {ep.description && (\n <p className=\"zwp-endpoint-desc\">{ep.description}</p>\n )}\n <div className=\"zwp-endpoint-meta\">\n <span>{ep.events.length} event{ep.events.length !== 1 ? 's' : ''}</span>\n <span>Created {new Date(ep.created_at).toLocaleDateString()}</span>\n </div>\n <div className=\"zwp-endpoint-actions\" onClick={e => e.stopPropagation()}>\n <button\n className=\"zwp-btn zwp-btn--sm zwp-btn--ghost\"\n onClick={() => handleToggleStatus(ep)}\n >\n {ep.status === 'active' ? 'Pause' : 'Resume'}\n </button>\n <button\n className=\"zwp-btn zwp-btn--sm zwp-btn--danger\"\n onClick={() => handleDelete(ep)}\n >\n Delete\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { PortalEndpoint, PortalDelivery } from '../types';\nimport type { usePortalApi } from '../hooks/usePortalApi';\n\ninterface EndpointDetailProps {\n api: ReturnType<typeof usePortalApi>;\n endpoint: PortalEndpoint;\n onBack: () => void;\n onRetried?: (deliveryId: string) => void;\n onError?: (error: Error) => void;\n}\n\nexport function EndpointDetail({ api, endpoint, onBack, onRetried, onError }: EndpointDetailProps) {\n const [deliveries, setDeliveries] = useState<PortalDelivery[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(true);\n const [statusFilter, setStatusFilter] = useState('');\n const [page, setPage] = useState(0);\n const [retrying, setRetrying] = useState<string | null>(null);\n const PAGE_SIZE = 20;\n\n const fetchDeliveries = useCallback(async () => {\n try {\n setIsLoading(true);\n const result = await api.listDeliveries(endpoint.id, {\n limit: PAGE_SIZE,\n offset: page * PAGE_SIZE,\n status: statusFilter || undefined,\n });\n setDeliveries(result.deliveries);\n setTotal(result.total);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to load deliveries'));\n } finally {\n setIsLoading(false);\n }\n }, [api, endpoint.id, page, statusFilter, onError]);\n\n useEffect(() => { fetchDeliveries(); }, [fetchDeliveries]);\n\n const handleRetry = async (deliveryId: string) => {\n setRetrying(deliveryId);\n try {\n await api.retryDelivery(endpoint.id, deliveryId);\n await fetchDeliveries();\n onRetried?.(deliveryId);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to retry delivery'));\n } finally {\n setRetrying(null);\n }\n };\n\n const handleRotateSecret = async () => {\n try {\n const secret = await api.rotateSecret(endpoint.id);\n alert(`New secret: ${secret}\\n\\nStore this securely. It will not be shown again.`);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to rotate secret'));\n }\n };\n\n const statusBadgeClass = (status: string) => {\n switch (status) {\n case 'delivered': return 'zwp-badge zwp-badge--green';\n case 'failed': case 'exhausted': return 'zwp-badge zwp-badge--red';\n case 'retrying': case 'pending': return 'zwp-badge zwp-badge--yellow';\n default: return 'zwp-badge';\n }\n };\n\n const canRetry = (status: string) => status === 'failed' || status === 'exhausted';\n const totalPages = Math.ceil(total / PAGE_SIZE);\n\n return (\n <div className=\"zwp-endpoint-detail\">\n <button className=\"zwp-btn zwp-btn--ghost zwp-back-btn\" onClick={onBack}>\n &larr; Back to endpoints\n </button>\n\n <div className=\"zwp-detail-header\">\n <div>\n <code className=\"zwp-endpoint-url\">{endpoint.url}</code>\n <div className=\"zwp-endpoint-meta\">\n <span>{endpoint.events.length} event{endpoint.events.length !== 1 ? 's' : ''}</span>\n <span>Status: {endpoint.status}</span>\n </div>\n </div>\n <button className=\"zwp-btn zwp-btn--sm\" onClick={handleRotateSecret}>\n Rotate Secret\n </button>\n </div>\n\n <div className=\"zwp-events-list\">\n <h4 className=\"zwp-subheading\">Subscribed Events</h4>\n <div className=\"zwp-tags\">\n {endpoint.events.map(e => (\n <span key={e} className=\"zwp-tag\">{e}</span>\n ))}\n </div>\n </div>\n\n <div className=\"zwp-deliveries\">\n <div className=\"zwp-section-header\">\n <h4 className=\"zwp-subheading\">Delivery Log</h4>\n <select\n className=\"zwp-select\"\n value={statusFilter}\n onChange={e => { setStatusFilter(e.target.value); setPage(0); }}\n >\n <option value=\"\">All statuses</option>\n <option value=\"delivered\">Delivered</option>\n <option value=\"failed\">Failed</option>\n <option value=\"exhausted\">Exhausted</option>\n <option value=\"retrying\">Retrying</option>\n <option value=\"pending\">Pending</option>\n </select>\n </div>\n\n {isLoading ? (\n <div className=\"zwp-loading\">Loading deliveries...</div>\n ) : deliveries.length === 0 ? (\n <div className=\"zwp-empty\">\n <p>No deliveries yet.</p>\n </div>\n ) : (\n <>\n <table className=\"zwp-table\">\n <thead>\n <tr>\n <th>Event</th>\n <th>Status</th>\n <th>Attempts</th>\n <th>Response</th>\n <th>Time</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {deliveries.map(d => (\n <tr key={d.id}>\n <td><code className=\"zwp-event-code\">{d.event_type}</code></td>\n <td><span className={statusBadgeClass(d.status)}>{d.status}</span></td>\n <td>{d.attempts}/{d.max_attempts}</td>\n <td>{d.last_response_status || '—'}</td>\n <td className=\"zwp-time\">\n {d.last_attempted_at\n ? new Date(d.last_attempted_at).toLocaleString()\n : new Date(d.created_at).toLocaleString()}\n </td>\n <td>\n {canRetry(d.status) && (\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => handleRetry(d.id)}\n disabled={retrying === d.id}\n >\n {retrying === d.id ? '...' : 'Retry'}\n </button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n\n {totalPages > 1 && (\n <div className=\"zwp-pagination\">\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => setPage(p => p - 1)}\n disabled={page === 0}\n >\n Previous\n </button>\n <span className=\"zwp-page-info\">\n Page {page + 1} of {totalPages}\n </span>\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => setPage(p => p + 1)}\n disabled={page >= totalPages - 1}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport type { WebhookPortalProps, PortalEndpoint, PortalEventType } from '../types';\nimport { usePortalApi } from '../hooks/usePortalApi';\nimport { EndpointList } from './EndpointList';\nimport { EndpointDetail } from './EndpointDetail';\n\nconst PREVIEW_ENDPOINTS: PortalEndpoint[] = [\n {\n id: 'preview-1',\n url: 'https://api.example.com/webhooks',\n description: 'Production endpoint',\n events: ['order.created', 'order.updated', 'payment.completed'],\n status: 'active',\n consecutive_failures: 0,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n },\n {\n id: 'preview-2',\n url: 'https://staging.example.com/hooks',\n events: ['order.created'],\n status: 'paused',\n consecutive_failures: 0,\n created_at: new Date(Date.now() - 86400000).toISOString(),\n updated_at: new Date(Date.now() - 86400000).toISOString(),\n },\n];\n\nfunction PreviewEndpointList() {\n return (\n <div className=\"zwp-endpoint-list\">\n <div className=\"zwp-section-header\">\n <h3 className=\"zwp-heading\">Endpoints</h3>\n <button className=\"zwp-btn zwp-btn--primary\" disabled>Add Endpoint</button>\n </div>\n <div className=\"zwp-list\">\n {PREVIEW_ENDPOINTS.map(ep => (\n <div key={ep.id} className=\"zwp-endpoint-card\" style={{ cursor: 'default' }}>\n <div className=\"zwp-endpoint-header\">\n <code className=\"zwp-endpoint-url\">{ep.url}</code>\n <span className={`zwp-badge ${ep.status === 'active' ? 'zwp-badge--green' : 'zwp-badge--yellow'}`}>\n {ep.status}\n </span>\n </div>\n {ep.description && <p className=\"zwp-endpoint-desc\">{ep.description}</p>}\n <div className=\"zwp-endpoint-meta\">\n <span>{ep.events.length} event{ep.events.length !== 1 ? 's' : ''}</span>\n <span>Created {new Date(ep.created_at).toLocaleDateString()}</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport function WebhookPortal({\n token,\n baseUrl,\n theme,\n preview,\n onEndpointCreated,\n onEndpointDeleted,\n onEndpointUpdated,\n onDeliveryRetried,\n onError,\n className,\n}: WebhookPortalProps) {\n const api = usePortalApi({ token, baseUrl });\n const [eventTypes, setEventTypes] = useState<PortalEventType[]>([]);\n const [selectedEndpoint, setSelectedEndpoint] = useState<PortalEndpoint | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (preview) return;\n api.listEventTypes()\n .then(setEventTypes)\n .catch(err => {\n const e = err instanceof Error ? err : new Error('Failed to load event types');\n setError(e.message);\n onError?.(e);\n });\n }, [api, onError, preview]);\n\n const handleError = (err: Error) => {\n setError(err.message);\n onError?.(err);\n setTimeout(() => setError(null), 5000);\n };\n\n const style: Record<string, string> = {};\n if (theme?.accent) {\n style['--zwp-accent'] = theme.accent;\n }\n if (theme?.borderRadius !== undefined) {\n style['--zwp-radius'] = `${theme.borderRadius}px`;\n }\n\n const themeClass = theme?.mode === 'dark' ? 'zwp-dark' : 'zwp-light';\n\n return (\n <div\n className={`zwp-portal ${themeClass} ${className || ''}`}\n style={style}\n >\n {error && (\n <div className=\"zwp-alert zwp-alert--error\">\n {error}\n <button className=\"zwp-alert-close\" onClick={() => setError(null)}>&times;</button>\n </div>\n )}\n\n {preview ? (\n <PreviewEndpointList />\n ) : selectedEndpoint ? (\n <EndpointDetail\n api={api}\n endpoint={selectedEndpoint}\n onBack={() => setSelectedEndpoint(null)}\n onRetried={onDeliveryRetried}\n onError={handleError}\n />\n ) : (\n <EndpointList\n api={api}\n eventTypes={eventTypes}\n onSelect={setSelectedEndpoint}\n onCreated={onEndpointCreated}\n onDeleted={onEndpointDeleted}\n onUpdated={onEndpointUpdated}\n onError={handleError}\n />\n )}\n </div>\n );\n}\n"],"names":["useRef","useCallback","useState","useEffect","_jsx","_jsxs","_Fragment"],"mappings":";;;;;AAUA,MAAM,gBAAgB,GAAG,sCAAsC;SAO/C,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAuB,EAAA;AAClE,IAAA,MAAM,IAAI,GAAG,OAAO,IAAI,gBAAgB;AACxC,IAAA,MAAM,QAAQ,GAAGA,YAAM,CAAC,KAAK,CAAC;AAC9B,IAAA,QAAQ,CAAC,OAAO,GAAG,KAAK;IAExB,MAAM,OAAO,GAAGC,iBAAW,CAAC,OAAU,IAAY,EAAE,OAAqB,KAAgB;QACvF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAE,EAAE;AACxC,YAAA,GAAG,OAAO;AACV,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,aAAa,EAAE,CAAA,OAAA,EAAU,QAAQ,CAAC,OAAO,CAAA,CAAE;gBAC3C,GAAG,OAAO,EAAE,OAAO;AACpB,aAAA;AACF,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;AACX,YAAA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/C,YAAA,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,mBAAmB,GAAG,CAAC,MAAM,CAAA,CAAE,CAAC;QAC1E;AAEA,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;AAAE,YAAA,OAAO,SAAc;AAC7C,QAAA,OAAO,GAAG,CAAC,IAAI,EAAE;AACnB,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AAEV,IAAA,MAAM,cAAc,GAAGA,iBAAW,CAAC,YAAW;AAC5C,QAAA,MAAM,GAAG,GAAG,MAAM,OAAO,CAAuC,cAAc,CAAC;QAC/E,OAAO,GAAG,CAAC,IAAI;AACjB,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAEb,IAAA,MAAM,aAAa,GAAGA,iBAAW,CAAC,OAAO,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,KAAI;QACjE,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,CAAA,iBAAA,EAAoB,KAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAC7C;AACD,QAAA,OAAO,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE;AAC5D,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEb,MAAM,cAAc,GAAGA,iBAAW,CAAC,OAAO,IAIzC,KAAI;AACH,QAAA,MAAM,GAAG,GAAG,MAAM,OAAO,CAA8C,YAAY,EAAE;AACnF,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAC3B,SAAA,CAAC;QACF,OAAO,GAAG,CAAC,IAAI;AACjB,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEb,MAAM,cAAc,GAAGA,iBAAW,CAAC,OAAO,UAAkB,EAAE,IAK7D,KAAI;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAoC,CAAA,WAAA,EAAc,UAAU,EAAE,EAAE;AACvF,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAC3B,SAAA,CAAC;QACF,OAAO,GAAG,CAAC,IAAI;AACjB,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEb,MAAM,cAAc,GAAGA,iBAAW,CAAC,OAAO,UAAkB,KAAI;AAC9D,QAAA,MAAM,OAAO,CAAC,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACjE,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEb,MAAM,YAAY,GAAGA,iBAAW,CAAC,OAAO,UAAkB,KAAI;AAC5D,QAAA,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,CAAA,WAAA,EAAc,UAAU,CAAA,cAAA,CAAgB,EACxC,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB;AACD,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM;AACxB,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEb,MAAM,cAAc,GAAGA,iBAAW,CAAC,OAAO,UAAkB,EAAE,MAI7D,KAAI;AACH,QAAA,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE;QACnC,IAAI,MAAM,EAAE,KAAK;AAAE,YAAA,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,MAAM,EAAE,MAAM;AAAE,YAAA,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,MAAM,EAAE,MAAM;YAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;AACtD,QAAA,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE;QAE3B,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,CAAA,WAAA,EAAc,UAAU,cAAc,EAAE,GAAG,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE,CAC3D;AACD,QAAA,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE;AAC7D,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEb,MAAM,WAAW,GAAGA,iBAAW,CAAC,OAAO,UAAkB,EAAE,UAAkB,KAAI;QAC/E,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,CAAA,WAAA,EAAc,UAAU,CAAA,YAAA,EAAe,UAAU,CAAA,CAAE,CACpD;QACD,OAAO,GAAG,CAAC,IAAI;AACjB,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEb,MAAM,aAAa,GAAGA,iBAAW,CAAC,OAAO,UAAkB,EAAE,UAAkB,KAAI;AACjF,QAAA,MAAM,OAAO,CAAC,CAAA,WAAA,EAAc,UAAU,CAAA,YAAA,EAAe,UAAU,QAAQ,EAAE;AACvE,YAAA,MAAM,EAAE,MAAM;AACf,SAAA,CAAC;AACJ,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAEb,OAAO;QACL,cAAc;QACd,aAAa;QACb,cAAc;QACd,cAAc;QACd,cAAc;QACd,YAAY;QACZ,cAAc;QACd,WAAW;QACX,aAAa;KACd;AACH;;SCrHgB,YAAY,CAAC,EAC3B,GAAG,EACH,UAAU,EACV,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,OAAO,GACW,EAAA;IAClB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGC,cAAQ,CAAmB,EAAE,CAAC;IAChE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAC,IAAI,CAAC;IAChD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC;IACxC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAW,EAAE,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC;IAC1C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGA,cAAQ,CAAC,KAAK,CAAC;IACnD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;AAEvE,IAAA,MAAM,cAAc,GAAGD,iBAAW,CAAC,YAAW;AAC5C,QAAA,IAAI;YACF,YAAY,CAAC,IAAI,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9C,YAAA,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC;QAChC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC/E;gBAAU;YACR,YAAY,CAAC,KAAK,CAAC;QACrB;AACF,IAAA,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAElB,IAAAE,eAAS,CAAC,MAAK,EAAG,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;AAExD,IAAA,MAAM,YAAY,GAAG,YAAW;AAC9B,QAAA,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE;QACvC,aAAa,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC;AACxC,gBAAA,GAAG,EAAE,MAAM;AACX,gBAAA,MAAM,EAAE,SAAS;gBACjB,WAAW,EAAE,OAAO,IAAI,SAAS;AAClC,aAAA,CAAC;AACF,YAAA,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjC,SAAS,CAAC,EAAE,CAAC;YACb,YAAY,CAAC,EAAE,CAAC;YAChB,UAAU,CAAC,EAAE,CAAC;YACd,MAAM,cAAc,EAAE;AACtB,YAAA,SAAS,GAAG,QAAQ,CAAC;QACvB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAChF;gBAAU;YACR,aAAa,CAAC,KAAK,CAAC;QACtB;AACF,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,OAAO,EAAkB,KAAI;AAChD,QAAA,IAAI;YACF,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,MAAM,cAAc,EAAE;AACtB,YAAA,SAAS,GAAG,EAAE,CAAC;QACjB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAChF;AACF,IAAA,CAAC;AAED,IAAA,MAAM,kBAAkB,GAAG,OAAO,EAAkB,KAAI;AACtD,QAAA,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ;AAC9D,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACtE,MAAM,cAAc,EAAE;AACtB,YAAA,SAAS,GAAG,OAAO,CAAC;QACtB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAChF;AACF,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,SAAiB,KAAI;AACxC,QAAA,YAAY,CAAC,IAAI,IACf,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,SAAS,CAAC,CACpF;AACH,IAAA,CAAC;AAED,IAAA,MAAM,gBAAgB,GAAG,CAAC,MAAc,KAAI;QAC1C,QAAQ,MAAM;AACZ,YAAA,KAAK,QAAQ,EAAE,OAAO,4BAA4B;AAClD,YAAA,KAAK,QAAQ,EAAE,OAAO,6BAA6B;AACnD,YAAA,KAAK,UAAU,EAAE,OAAO,0BAA0B;AAClD,YAAA,SAAS,OAAO,WAAW;;AAE/B,IAAA,CAAC;IAED,IAAI,SAAS,EAAE;AACb,QAAA,OAAOC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,aAAa,qCAA2B;IAChE;AAEA,IAAA,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAAA,CAChCA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAA,CACjCD,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,WAAA,EAAA,CAAe,EAC1CA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,0BAA0B,EACpC,OAAO,EAAE,MAAK,EAAG,aAAa,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAA,QAAA,EAErE,UAAU,GAAG,QAAQ,GAAG,cAAc,EAAA,CAChC,CAAA,EAAA,CACL,EAEL,aAAa,KACZC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,8BAA8B,EAAA,QAAA,EAAA,CAC3CD,wDAA+B,EAC/BA,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,yDAAA,EAAA,CAA8D,EAC9DA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,YAAY,EAAA,QAAA,EAAE,aAAa,EAAA,CAAQ,EACnDA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,qBAAqB,EAC/B,OAAO,EAAE,MAAK,EAAG,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,qBAGzD,CAAA,EAAA,CACL,CACP,EAEA,UAAU,KACTC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAA,CAC9BA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,0BAAO,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,KAAA,EAAA,CAAY,EACxCA,cAAA,CAAA,OAAA,EAAA,EACE,SAAS,EAAC,WAAW,EACrB,IAAI,EAAC,KAAK,EACV,WAAW,EAAC,+BAA+B,EAC3C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAA,CACxC,CAAA,EAAA,CACE,EACNC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,cAAA,CAAA,OAAA,EAAA,EAAO,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,wBAAA,EAAA,CAA+B,EAC3DA,cAAA,CAAA,OAAA,EAAA,EACE,SAAS,EAAC,WAAW,EACrB,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,qBAAqB,EACjC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAA,CACzC,CAAA,EAAA,CACE,EACNC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,cAAA,CAAA,OAAA,EAAA,EAAO,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,QAAA,EAAA,CAAe,EAC3CA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAC9B,UAAU,CAAC,GAAG,CAAC,EAAE,KAChBC,eAAA,CAAA,OAAA,EAAA,EAA2B,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAA,CACvDD,cAAA,CAAA,OAAA,EAAA,EACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,EAC1C,QAAQ,EAAE,MAAM,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,EAAA,CAC1C,EACFA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAE,EAAE,CAAC,IAAI,GAAQ,EACjDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAE,EAAE,CAAC,UAAU,EAAA,CAAQ,CAAA,EAAA,EAP7C,EAAE,CAAC,UAAU,CAQjB,CACT,CAAC,EAAA,CACE,CAAA,EAAA,CACF,EACNA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,0BAA0B,EACpC,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,UAAU,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAA,QAAA,EAExD,UAAU,GAAG,aAAa,GAAG,iBAAiB,EAAA,CACxC,CAAA,EAAA,CACL,CACP,EAEA,SAAS,CAAC,MAAM,KAAK,CAAC,IACrBC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,CAAmC,EACnCA,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,CAA6D,CAAA,EAAA,CACzD,KAENA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EACtB,SAAS,CAAC,GAAG,CAAC,EAAE,KACfC,eAAA,CAAA,KAAA,EAAA,EAAiB,SAAS,EAAC,mBAAmB,EAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,EAAE,CAAC,EAAA,QAAA,EAAA,CACxEA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,CAClCD,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAE,EAAE,CAAC,GAAG,EAAA,CAAQ,EAClDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,gBAAgB,CAAC,EAAE,CAAC,MAAM,CAAC,EAAA,QAAA,EAAG,EAAE,CAAC,MAAM,EAAA,CAAQ,CAAA,EAAA,CAC5D,EACL,EAAE,CAAC,WAAW,KACbA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAAE,EAAE,CAAC,WAAW,EAAA,CAAK,CACtD,EACDC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAAA,CAChCA,eAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAO,EAAE,CAAC,MAAM,CAAC,MAAM,EAAA,QAAA,EAAQ,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAA,EAAA,CAAQ,EACxEA,eAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAe,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,CAAA,EAAA,CAAQ,CAAA,EAAA,CAC/D,EACNA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,EAAA,QAAA,EAAA,CACrED,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,oCAAoC,EAC9C,OAAO,EAAE,MAAM,kBAAkB,CAAC,EAAE,CAAC,EAAA,QAAA,EAEpC,EAAE,CAAC,MAAM,KAAK,QAAQ,GAAG,OAAO,GAAG,QAAQ,EAAA,CACrC,EACTA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,qCAAqC,EAC/C,OAAO,EAAE,MAAM,YAAY,CAAC,EAAE,CAAC,EAAA,QAAA,EAAA,QAAA,EAAA,CAGxB,CAAA,EAAA,CACL,CAAA,EAAA,EAzBE,EAAE,CAAC,EAAE,CA0BT,CACP,CAAC,EAAA,CACE,CACP,CAAA,EAAA,CACG;AAEV;;AClNM,SAAU,cAAc,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAuB,EAAA;IAC/F,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGF,cAAQ,CAAmB,EAAE,CAAC;IAClE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGA,cAAQ,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAGA,cAAQ,CAAC,IAAI,CAAC;IAChD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAGA,cAAQ,CAAC,EAAE,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAGA,cAAQ,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;IAC7D,MAAM,SAAS,GAAG,EAAE;AAEpB,IAAA,MAAM,eAAe,GAAGD,iBAAW,CAAC,YAAW;AAC7C,QAAA,IAAI;YACF,YAAY,CAAC,IAAI,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE;AACnD,gBAAA,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,IAAI,GAAG,SAAS;gBACxB,MAAM,EAAE,YAAY,IAAI,SAAS;AAClC,aAAA,CAAC;AACF,YAAA,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;AAChC,YAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QACxB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAChF;gBAAU;YACR,YAAY,CAAC,KAAK,CAAC;QACrB;AACF,IAAA,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;AAEnD,IAAAE,eAAS,CAAC,MAAK,EAAG,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;AAE1D,IAAA,MAAM,WAAW,GAAG,OAAO,UAAkB,KAAI;QAC/C,WAAW,CAAC,UAAU,CAAC;AACvB,QAAA,IAAI;YACF,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;YAChD,MAAM,eAAe,EAAE;AACvB,YAAA,SAAS,GAAG,UAAU,CAAC;QACzB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC/E;gBAAU;YACR,WAAW,CAAC,IAAI,CAAC;QACnB;AACF,IAAA,CAAC;AAED,IAAA,MAAM,kBAAkB,GAAG,YAAW;AACpC,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;AAClD,YAAA,KAAK,CAAC,CAAA,YAAA,EAAe,MAAM,CAAA,oDAAA,CAAsD,CAAC;QACpF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC9E;AACF,IAAA,CAAC;AAED,IAAA,MAAM,gBAAgB,GAAG,CAAC,MAAc,KAAI;QAC1C,QAAQ,MAAM;AACZ,YAAA,KAAK,WAAW,EAAE,OAAO,4BAA4B;AACrD,YAAA,KAAK,QAAQ;AAAE,YAAA,KAAK,WAAW,EAAE,OAAO,0BAA0B;AAClE,YAAA,KAAK,UAAU;AAAE,YAAA,KAAK,SAAS,EAAE,OAAO,6BAA6B;AACrE,YAAA,SAAS,OAAO,WAAW;;AAE/B,IAAA,CAAC;AAED,IAAA,MAAM,QAAQ,GAAG,CAAC,MAAc,KAAK,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,WAAW;IAClF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;AAE/C,IAAA,QACEE,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,aAClCD,cAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAC,qCAAqC,EAAC,OAAO,EAAE,MAAM,EAAA,QAAA,EAAA,0BAAA,EAAA,CAE9D,EAETC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mBAAmB,aAChCA,eAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACED,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAE,QAAQ,CAAC,GAAG,GAAQ,EACxDC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mBAAmB,aAChCA,eAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAA,QAAA,EAAQ,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAA,EAAA,CAAQ,EACpFA,eAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAe,QAAQ,CAAC,MAAM,CAAA,EAAA,CAAQ,CAAA,EAAA,CAClC,IACF,EACND,cAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAC,qBAAqB,EAAC,OAAO,EAAE,kBAAkB,EAAA,QAAA,EAAA,eAAA,EAAA,CAE1D,IACL,EAENC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAA,CAC9BD,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,mBAAA,EAAA,CAAuB,EACrDA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,UAAU,EAAA,QAAA,EACtB,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KACpBA,cAAA,CAAA,MAAA,EAAA,EAAc,SAAS,EAAC,SAAS,EAAA,QAAA,EAAE,CAAC,EAAA,EAAzB,CAAC,CAAgC,CAC7C,CAAC,EAAA,CACE,CAAA,EAAA,CACF,EAENC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,aAC7BA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oBAAoB,aACjCD,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,gBAAgB,6BAAkB,EAChDC,eAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,YAAY,EACtB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAA,QAAA,EAAA,CAE/DD,cAAA,CAAA,QAAA,EAAA,EAAQ,KAAK,EAAC,EAAE,EAAA,QAAA,EAAA,cAAA,EAAA,CAAsB,EACtCA,cAAA,CAAA,QAAA,EAAA,EAAQ,KAAK,EAAC,WAAW,EAAA,QAAA,EAAA,WAAA,EAAA,CAAmB,EAC5CA,2BAAQ,KAAK,EAAC,QAAQ,EAAA,QAAA,EAAA,QAAA,EAAA,CAAgB,EACtCA,cAAA,CAAA,QAAA,EAAA,EAAQ,KAAK,EAAC,WAAW,0BAAmB,EAC5CA,cAAA,CAAA,QAAA,EAAA,EAAQ,KAAK,EAAC,UAAU,EAAA,QAAA,EAAA,UAAA,EAAA,CAAkB,EAC1CA,2BAAQ,KAAK,EAAC,SAAS,EAAA,QAAA,EAAA,SAAA,EAAA,CAAiB,CAAA,EAAA,CACjC,CAAA,EAAA,CACL,EAEL,SAAS,IACRA,wBAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,uBAAA,EAAA,CAA4B,IACtD,UAAU,CAAC,MAAM,KAAK,CAAC,IACzBA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EACxBA,cAAA,CAAA,GAAA,EAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,CAAyB,EAAA,CACrB,KAENC,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA,CACED,eAAA,CAAA,OAAA,EAAA,EAAO,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CAC1BD,cAAA,CAAA,OAAA,EAAA,EAAA,QAAA,EACEC,mCACED,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,OAAA,EAAA,CAAc,EACdA,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,QAAA,EAAA,CAAe,EACfA,8CAAiB,EACjBA,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,CAAiB,EACjBA,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAa,EACbA,cAAA,CAAA,IAAA,EAAA,EAAA,CAAS,CAAA,EAAA,CACN,GACC,EACRA,cAAA,CAAA,OAAA,EAAA,EAAA,QAAA,EACG,UAAU,CAAC,GAAG,CAAC,CAAC,KACfC,eAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAA,CACED,iCAAIA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,gBAAgB,YAAE,CAAC,CAAC,UAAU,EAAA,CAAQ,EAAA,CAAK,EAC/DA,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAIA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,EAAA,QAAA,EAAG,CAAC,CAAC,MAAM,GAAQ,EAAA,CAAK,EACvEC,mCAAK,CAAC,CAAC,QAAQ,EAAA,GAAA,EAAG,CAAC,CAAC,YAAY,IAAM,EACtCD,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EAAK,CAAC,CAAC,oBAAoB,IAAI,GAAG,EAAA,CAAM,EACxCA,uBAAI,SAAS,EAAC,UAAU,EAAA,QAAA,EACrB,CAAC,CAAC;0DACC,IAAI,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,cAAc;AAC9C,0DAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAA,CACxC,EACLA,cAAA,CAAA,IAAA,EAAA,EAAA,QAAA,EACG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KACjBA,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,qBAAqB,EAC/B,OAAO,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAChC,QAAQ,EAAE,QAAQ,KAAK,CAAC,CAAC,EAAE,EAAA,QAAA,EAE1B,QAAQ,KAAK,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,OAAO,GAC7B,CACV,EAAA,CACE,CAAA,EAAA,EApBE,CAAC,CAAC,EAAE,CAqBR,CACN,CAAC,GACI,CAAA,EAAA,CACF,EAEP,UAAU,GAAG,CAAC,KACbC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC7BD,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,qBAAqB,EAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAClC,QAAQ,EAAE,IAAI,KAAK,CAAC,EAAA,QAAA,EAAA,UAAA,EAAA,CAGb,EACTC,0BAAM,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAAA,OAAA,EACvB,IAAI,GAAG,CAAC,EAAA,MAAA,EAAM,UAAU,CAAA,EAAA,CACzB,EACPD,cAAA,CAAA,QAAA,EAAA,EACE,SAAS,EAAC,qBAAqB,EAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAClC,QAAQ,EAAE,IAAI,IAAI,UAAU,GAAG,CAAC,EAAA,QAAA,EAAA,MAAA,EAAA,CAGzB,IACL,CACP,CAAA,EAAA,CACA,CACJ,CAAA,EAAA,CACG,CAAA,EAAA,CACF;AAEV;;AC1LA,MAAM,iBAAiB,GAAqB;AAC1C,IAAA;AACE,QAAA,EAAE,EAAE,WAAW;AACf,QAAA,GAAG,EAAE,kCAAkC;AACvC,QAAA,WAAW,EAAE,qBAAqB;AAClC,QAAA,MAAM,EAAE,CAAC,eAAe,EAAE,eAAe,EAAE,mBAAmB,CAAC;AAC/D,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,oBAAoB,EAAE,CAAC;AACvB,QAAA,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACpC,QAAA,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACrC,KAAA;AACD,IAAA;AACE,QAAA,EAAE,EAAE,WAAW;AACf,QAAA,GAAG,EAAE,mCAAmC;QACxC,MAAM,EAAE,CAAC,eAAe,CAAC;AACzB,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,oBAAoB,EAAE,CAAC;AACvB,QAAA,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE;AACzD,QAAA,UAAU,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE;AAC1D,KAAA;CACF;AAED,SAAS,mBAAmB,GAAA;AAC1B,IAAA,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mBAAmB,aAChCA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,oBAAoB,aACjCD,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,aAAa,0BAAe,EAC1CA,cAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAC,0BAA0B,EAAC,QAAQ,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,CAAsB,CAAA,EAAA,CACvE,EACNA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,UAAU,YACtB,iBAAiB,CAAC,GAAG,CAAC,EAAE,KACvBC,yBAAiB,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAA,QAAA,EAAA,CACzEA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EAAA,CAClCD,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAE,EAAE,CAAC,GAAG,EAAA,CAAQ,EAClDA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,CAAA,UAAA,EAAa,EAAE,CAAC,MAAM,KAAK,QAAQ,GAAG,kBAAkB,GAAG,mBAAmB,CAAA,CAAE,YAC9F,EAAE,CAAC,MAAM,EAAA,CACL,IACH,EACL,EAAE,CAAC,WAAW,IAAIA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mBAAmB,YAAE,EAAE,CAAC,WAAW,EAAA,CAAK,EACxEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mBAAmB,aAChCA,eAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAO,EAAE,CAAC,MAAM,CAAC,MAAM,EAAA,QAAA,EAAQ,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAA,EAAA,CAAQ,EACxEA,eAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,UAAA,EAAe,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,IAAQ,CAAA,EAAA,CAC/D,CAAA,EAAA,EAXE,EAAE,CAAC,EAAE,CAYT,CACP,CAAC,EAAA,CACE,CAAA,EAAA,CACF;AAEV;AAEM,SAAU,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,EACP,KAAK,EACL,OAAO,EACP,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,OAAO,EACP,SAAS,GACU,EAAA;IACnB,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAGH,cAAQ,CAAoB,EAAE,CAAC;IACnE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAGA,cAAQ,CAAwB,IAAI,CAAC;IACrF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAGA,cAAQ,CAAgB,IAAI,CAAC;IAEvDC,eAAS,CAAC,MAAK;AACb,QAAA,IAAI,OAAO;YAAE;QACb,GAAG,CAAC,cAAc;aACf,IAAI,CAAC,aAAa;aAClB,KAAK,CAAC,GAAG,IAAG;AACX,YAAA,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAC;AAC9E,YAAA,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AACnB,YAAA,OAAO,GAAG,CAAC,CAAC;AACd,QAAA,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAE3B,IAAA,MAAM,WAAW,GAAG,CAAC,GAAU,KAAI;AACjC,QAAA,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;AACrB,QAAA,OAAO,GAAG,GAAG,CAAC;QACd,UAAU,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;AACxC,IAAA,CAAC;IAED,MAAM,KAAK,GAA2B,EAAE;AACxC,IAAA,IAAI,KAAK,EAAE,MAAM,EAAE;AACjB,QAAA,KAAK,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,MAAM;IACtC;AACA,IAAA,IAAI,KAAK,EAAE,YAAY,KAAK,SAAS,EAAE;QACrC,KAAK,CAAC,cAAc,CAAC,GAAG,GAAG,KAAK,CAAC,YAAY,CAAA,EAAA,CAAI;IACnD;AAEA,IAAA,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI,KAAK,MAAM,GAAG,UAAU,GAAG,WAAW;AAEpE,IAAA,QACEE,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,CAAA,WAAA,EAAc,UAAU,CAAA,CAAA,EAAI,SAAS,IAAI,EAAE,CAAA,CAAE,EACxD,KAAK,EAAE,KAAK,EAAA,QAAA,EAAA,CAEX,KAAK,KACJA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,CACxC,KAAK,EACND,cAAA,CAAA,QAAA,EAAA,EAAQ,SAAS,EAAC,iBAAiB,EAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAA,QAAA,EAAA,QAAA,EAAA,CAAkB,CAAA,EAAA,CAC/E,CACP,EAEA,OAAO,IACNA,cAAA,CAAC,mBAAmB,EAAA,EAAA,CAAG,IACrB,gBAAgB,IAClBA,eAAC,cAAc,EAAA,EACb,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,MAAM,mBAAmB,CAAC,IAAI,CAAC,EACvC,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,WAAW,EAAA,CACpB,KAEFA,cAAA,CAAC,YAAY,EAAA,EACX,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,iBAAiB,EAC5B,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE,WAAW,EAAA,CACpB,CACH,CAAA,EAAA,CACG;AAEV;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/hooks/usePortalApi.ts","../src/components/EndpointList.tsx","../src/components/EndpointDetail.tsx","../src/components/WebhookPortal.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef } from 'react';\nimport type {\n PortalApiResponse,\n PortalEventType,\n PortalEndpoint,\n PortalEndpointWithSecret,\n PortalDelivery,\n PortalDeliveryDetail,\n} from '../types';\n\nconst DEFAULT_BASE_URL = 'https://api.zyphr.dev/v1/waas-portal';\n\ninterface UsePortalApiOptions {\n token: string;\n baseUrl?: string;\n}\n\nexport function usePortalApi({ token, baseUrl }: UsePortalApiOptions) {\n const base = baseUrl || DEFAULT_BASE_URL;\n const tokenRef = useRef(token);\n tokenRef.current = token;\n\n const request = useCallback(async <T>(path: string, options?: RequestInit): Promise<T> => {\n const res = await fetch(`${base}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${tokenRef.current}`,\n ...options?.headers,\n },\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error?.message || `Request failed: ${res.status}`);\n }\n\n if (res.status === 204) return undefined as T;\n return res.json();\n }, [base]);\n\n const listEventTypes = useCallback(async () => {\n const res = await request<PortalApiResponse<PortalEventType[]>>('/event-types');\n return res.data;\n }, [request]);\n\n const listEndpoints = useCallback(async (limit = 20, offset = 0) => {\n const res = await request<PortalApiResponse<PortalEndpoint[]>>(\n `/endpoints?limit=${limit}&offset=${offset}`\n );\n return { endpoints: res.data, total: res.meta.total || 0 };\n }, [request]);\n\n const createEndpoint = useCallback(async (data: {\n url: string;\n events: string[];\n description?: string;\n }) => {\n const res = await request<PortalApiResponse<PortalEndpointWithSecret>>('/endpoints', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return res.data;\n }, [request]);\n\n const updateEndpoint = useCallback(async (endpointId: string, data: {\n url?: string;\n events?: string[];\n status?: 'active' | 'paused' | 'disabled';\n description?: string;\n }) => {\n const res = await request<PortalApiResponse<PortalEndpoint>>(`/endpoints/${endpointId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n return res.data;\n }, [request]);\n\n const deleteEndpoint = useCallback(async (endpointId: string) => {\n await request(`/endpoints/${endpointId}`, { method: 'DELETE' });\n }, [request]);\n\n const rotateSecret = useCallback(async (endpointId: string) => {\n const res = await request<PortalApiResponse<{ secret: string }>>(\n `/endpoints/${endpointId}/rotate-secret`,\n { method: 'POST' }\n );\n return res.data.secret;\n }, [request]);\n\n const listDeliveries = useCallback(async (endpointId: string, params?: {\n limit?: number;\n offset?: number;\n status?: string;\n }) => {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n if (params?.status) query.set('status', params.status);\n const qs = query.toString();\n\n const res = await request<PortalApiResponse<PortalDelivery[]>>(\n `/endpoints/${endpointId}/deliveries${qs ? `?${qs}` : ''}`\n );\n return { deliveries: res.data, total: res.meta.total || 0 };\n }, [request]);\n\n const getDelivery = useCallback(async (endpointId: string, deliveryId: string) => {\n const res = await request<PortalApiResponse<PortalDeliveryDetail>>(\n `/endpoints/${endpointId}/deliveries/${deliveryId}`\n );\n return res.data;\n }, [request]);\n\n const retryDelivery = useCallback(async (endpointId: string, deliveryId: string) => {\n await request(`/endpoints/${endpointId}/deliveries/${deliveryId}/retry`, {\n method: 'POST',\n });\n }, [request]);\n\n return useMemo(() => ({\n listEventTypes,\n listEndpoints,\n createEndpoint,\n updateEndpoint,\n deleteEndpoint,\n rotateSecret,\n listDeliveries,\n getDelivery,\n retryDelivery,\n }), [\n listEventTypes,\n listEndpoints,\n createEndpoint,\n updateEndpoint,\n deleteEndpoint,\n rotateSecret,\n listDeliveries,\n getDelivery,\n retryDelivery,\n ]);\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { PortalEndpoint, PortalEventType } from '../types';\nimport type { usePortalApi } from '../hooks/usePortalApi';\n\ninterface EndpointListProps {\n api: ReturnType<typeof usePortalApi>;\n eventTypes: PortalEventType[];\n onSelect: (endpoint: PortalEndpoint) => void;\n onCreated?: (endpoint: PortalEndpoint) => void;\n onDeleted?: (endpoint: PortalEndpoint) => void;\n onUpdated?: (endpoint: PortalEndpoint) => void;\n onError?: (error: Error) => void;\n}\n\nexport function EndpointList({\n api,\n eventTypes,\n onSelect,\n onCreated,\n onDeleted,\n onUpdated,\n onError,\n}: EndpointListProps) {\n const [endpoints, setEndpoints] = useState<PortalEndpoint[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [showCreate, setShowCreate] = useState(false);\n const [newUrl, setNewUrl] = useState('');\n const [newEvents, setNewEvents] = useState<string[]>([]);\n const [newDesc, setNewDesc] = useState('');\n const [isCreating, setIsCreating] = useState(false);\n const [createdSecret, setCreatedSecret] = useState<string | null>(null);\n\n const fetchEndpoints = useCallback(async () => {\n try {\n setIsLoading(true);\n const result = await api.listEndpoints(100, 0);\n setEndpoints(result.endpoints);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to load endpoints'));\n } finally {\n setIsLoading(false);\n }\n }, [api, onError]);\n\n useEffect(() => { fetchEndpoints(); }, [fetchEndpoints]);\n\n const handleCreate = async () => {\n if (!newUrl || newEvents.length === 0) return;\n setIsCreating(true);\n try {\n const endpoint = await api.createEndpoint({\n url: newUrl,\n events: newEvents,\n description: newDesc || undefined,\n });\n setCreatedSecret(endpoint.secret);\n setShowCreate(false);\n setNewUrl('');\n setNewEvents([]);\n setNewDesc('');\n await fetchEndpoints();\n onCreated?.(endpoint);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to create endpoint'));\n } finally {\n setIsCreating(false);\n }\n };\n\n const handleDelete = async (ep: PortalEndpoint) => {\n try {\n await api.deleteEndpoint(ep.id);\n await fetchEndpoints();\n onDeleted?.(ep);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to delete endpoint'));\n }\n };\n\n const handleToggleStatus = async (ep: PortalEndpoint) => {\n const newStatus = ep.status === 'active' ? 'paused' : 'active';\n try {\n const updated = await api.updateEndpoint(ep.id, { status: newStatus });\n await fetchEndpoints();\n onUpdated?.(updated);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to update endpoint'));\n }\n };\n\n const toggleEvent = (eventType: string) => {\n setNewEvents(prev =>\n prev.includes(eventType) ? prev.filter(e => e !== eventType) : [...prev, eventType]\n );\n };\n\n const statusBadgeClass = (status: string) => {\n switch (status) {\n case 'active': return 'zwp-badge zwp-badge--green';\n case 'paused': return 'zwp-badge zwp-badge--yellow';\n case 'disabled': return 'zwp-badge zwp-badge--red';\n default: return 'zwp-badge';\n }\n };\n\n if (isLoading) {\n return <div className=\"zwp-loading\">Loading endpoints...</div>;\n }\n\n return (\n <div className=\"zwp-endpoint-list\">\n <div className=\"zwp-section-header\">\n <h3 className=\"zwp-heading\">Endpoints</h3>\n <button\n className=\"zwp-btn zwp-btn--primary\"\n onClick={() => { setShowCreate(!showCreate); setCreatedSecret(null); }}\n >\n {showCreate ? 'Cancel' : 'Add Endpoint'}\n </button>\n </div>\n\n {createdSecret && (\n <div className=\"zwp-alert zwp-alert--warning\">\n <button className=\"zwp-alert-close\" onClick={() => setCreatedSecret(null)}>&times;</button>\n <strong>Signing Secret</strong>\n <p>Store this secret securely. It will not be shown again.</p>\n <code className=\"zwp-secret\">{createdSecret}</code>\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => { navigator.clipboard.writeText(createdSecret); }}\n >\n Copy\n </button>\n </div>\n )}\n\n {showCreate && (\n <div className=\"zwp-create-form\">\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">URL</label>\n <input\n className=\"zwp-input\"\n type=\"url\"\n placeholder=\"https://your-app.com/webhooks\"\n value={newUrl}\n onChange={e => setNewUrl(e.target.value)}\n />\n </div>\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">Description (optional)</label>\n <input\n className=\"zwp-input\"\n type=\"text\"\n placeholder=\"Production endpoint\"\n value={newDesc}\n onChange={e => setNewDesc(e.target.value)}\n />\n </div>\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">Events</label>\n <div className=\"zwp-event-picker\">\n {eventTypes.map(et => (\n <label key={et.event_type} className=\"zwp-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={newEvents.includes(et.event_type)}\n onChange={() => toggleEvent(et.event_type)}\n />\n <span className=\"zwp-event-name\">{et.name}</span>\n <span className=\"zwp-event-type\">{et.event_type}</span>\n </label>\n ))}\n </div>\n </div>\n <button\n className=\"zwp-btn zwp-btn--primary\"\n onClick={handleCreate}\n disabled={isCreating || !newUrl || newEvents.length === 0}\n >\n {isCreating ? 'Creating...' : 'Create Endpoint'}\n </button>\n </div>\n )}\n\n {endpoints.length === 0 ? (\n <div className=\"zwp-empty\">\n <p>No endpoints configured yet.</p>\n <p>Add an endpoint to start receiving webhook deliveries.</p>\n </div>\n ) : (\n <div className=\"zwp-list\">\n {endpoints.map(ep => (\n <div key={ep.id} className=\"zwp-endpoint-card\" onClick={() => onSelect(ep)}>\n <div className=\"zwp-endpoint-header\">\n <code className=\"zwp-endpoint-url\">{ep.url}</code>\n <span className={statusBadgeClass(ep.status)}>{ep.status}</span>\n </div>\n {ep.description && (\n <p className=\"zwp-endpoint-desc\">{ep.description}</p>\n )}\n <div className=\"zwp-endpoint-meta\">\n <span>{ep.events.length} event{ep.events.length !== 1 ? 's' : ''}</span>\n <span>Created {new Date(ep.created_at).toLocaleDateString()}</span>\n </div>\n <div className=\"zwp-endpoint-actions\" onClick={e => e.stopPropagation()}>\n <button\n className=\"zwp-btn zwp-btn--sm zwp-btn--ghost\"\n onClick={() => handleToggleStatus(ep)}\n >\n {ep.status === 'active' ? 'Pause' : 'Resume'}\n </button>\n <button\n className=\"zwp-btn zwp-btn--sm zwp-btn--danger\"\n onClick={() => handleDelete(ep)}\n >\n Delete\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { PortalEndpoint, PortalDelivery } from '../types';\nimport type { usePortalApi } from '../hooks/usePortalApi';\n\ninterface EndpointDetailProps {\n api: ReturnType<typeof usePortalApi>;\n endpoint: PortalEndpoint;\n onBack: () => void;\n onRetried?: (deliveryId: string) => void;\n onError?: (error: Error) => void;\n}\n\nexport function EndpointDetail({ api, endpoint, onBack, onRetried, onError }: EndpointDetailProps) {\n const [deliveries, setDeliveries] = useState<PortalDelivery[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(true);\n const [statusFilter, setStatusFilter] = useState('');\n const [page, setPage] = useState(0);\n const [retrying, setRetrying] = useState<string | null>(null);\n const PAGE_SIZE = 20;\n\n const fetchDeliveries = useCallback(async () => {\n try {\n setIsLoading(true);\n const result = await api.listDeliveries(endpoint.id, {\n limit: PAGE_SIZE,\n offset: page * PAGE_SIZE,\n status: statusFilter || undefined,\n });\n setDeliveries(result.deliveries);\n setTotal(result.total);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to load deliveries'));\n } finally {\n setIsLoading(false);\n }\n }, [api, endpoint.id, page, statusFilter, onError]);\n\n useEffect(() => { fetchDeliveries(); }, [fetchDeliveries]);\n\n const handleRetry = async (deliveryId: string) => {\n setRetrying(deliveryId);\n try {\n await api.retryDelivery(endpoint.id, deliveryId);\n await fetchDeliveries();\n onRetried?.(deliveryId);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to retry delivery'));\n } finally {\n setRetrying(null);\n }\n };\n\n const handleRotateSecret = async () => {\n try {\n const secret = await api.rotateSecret(endpoint.id);\n alert(`New secret: ${secret}\\n\\nStore this securely. It will not be shown again.`);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to rotate secret'));\n }\n };\n\n const statusBadgeClass = (status: string) => {\n switch (status) {\n case 'delivered': return 'zwp-badge zwp-badge--green';\n case 'failed': case 'exhausted': return 'zwp-badge zwp-badge--red';\n case 'retrying': case 'pending': return 'zwp-badge zwp-badge--yellow';\n default: return 'zwp-badge';\n }\n };\n\n const canRetry = (status: string) => status === 'failed' || status === 'exhausted';\n const totalPages = Math.ceil(total / PAGE_SIZE);\n\n return (\n <div className=\"zwp-endpoint-detail\">\n <button className=\"zwp-btn zwp-btn--ghost zwp-back-btn\" onClick={onBack}>\n &larr; Back to endpoints\n </button>\n\n <div className=\"zwp-detail-header\">\n <div>\n <code className=\"zwp-endpoint-url\">{endpoint.url}</code>\n <div className=\"zwp-endpoint-meta\">\n <span>{endpoint.events.length} event{endpoint.events.length !== 1 ? 's' : ''}</span>\n <span>Status: {endpoint.status}</span>\n </div>\n </div>\n <button className=\"zwp-btn zwp-btn--sm\" onClick={handleRotateSecret}>\n Rotate Secret\n </button>\n </div>\n\n <div className=\"zwp-events-list\">\n <h4 className=\"zwp-subheading\">Subscribed Events</h4>\n <div className=\"zwp-tags\">\n {endpoint.events.map(e => (\n <span key={e} className=\"zwp-tag\">{e}</span>\n ))}\n </div>\n </div>\n\n <div className=\"zwp-deliveries\">\n <div className=\"zwp-section-header\">\n <h4 className=\"zwp-subheading\">Delivery Log</h4>\n <select\n className=\"zwp-select\"\n value={statusFilter}\n onChange={e => { setStatusFilter(e.target.value); setPage(0); }}\n >\n <option value=\"\">All statuses</option>\n <option value=\"delivered\">Delivered</option>\n <option value=\"failed\">Failed</option>\n <option value=\"exhausted\">Exhausted</option>\n <option value=\"retrying\">Retrying</option>\n <option value=\"pending\">Pending</option>\n </select>\n </div>\n\n {isLoading ? (\n <div className=\"zwp-loading\">Loading deliveries...</div>\n ) : deliveries.length === 0 ? (\n <div className=\"zwp-empty\">\n <p>No deliveries yet.</p>\n </div>\n ) : (\n <>\n <table className=\"zwp-table\">\n <thead>\n <tr>\n <th>Event</th>\n <th>Status</th>\n <th>Attempts</th>\n <th>Response</th>\n <th>Time</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {deliveries.map(d => (\n <tr key={d.id}>\n <td><code className=\"zwp-event-code\">{d.event_type}</code></td>\n <td><span className={statusBadgeClass(d.status)}>{d.status}</span></td>\n <td>{d.attempts}/{d.max_attempts}</td>\n <td>{d.last_response_status || '—'}</td>\n <td className=\"zwp-time\">\n {d.last_attempted_at\n ? new Date(d.last_attempted_at).toLocaleString()\n : new Date(d.created_at).toLocaleString()}\n </td>\n <td>\n {canRetry(d.status) && (\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => handleRetry(d.id)}\n disabled={retrying === d.id}\n >\n {retrying === d.id ? '...' : 'Retry'}\n </button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n\n {totalPages > 1 && (\n <div className=\"zwp-pagination\">\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => setPage(p => p - 1)}\n disabled={page === 0}\n >\n Previous\n </button>\n <span className=\"zwp-page-info\">\n Page {page + 1} of {totalPages}\n </span>\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => setPage(p => p + 1)}\n disabled={page >= totalPages - 1}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport type { WebhookPortalProps, PortalEndpoint, PortalEventType } from '../types';\nimport { usePortalApi } from '../hooks/usePortalApi';\nimport { EndpointList } from './EndpointList';\nimport { EndpointDetail } from './EndpointDetail';\n\nconst PREVIEW_ENDPOINTS: PortalEndpoint[] = [\n {\n id: 'preview-1',\n url: 'https://api.example.com/webhooks',\n description: 'Production endpoint',\n events: ['order.created', 'order.updated', 'payment.completed'],\n status: 'active',\n consecutive_failures: 0,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n },\n {\n id: 'preview-2',\n url: 'https://staging.example.com/hooks',\n events: ['order.created'],\n status: 'paused',\n consecutive_failures: 0,\n created_at: new Date(Date.now() - 86400000).toISOString(),\n updated_at: new Date(Date.now() - 86400000).toISOString(),\n },\n];\n\nfunction PreviewEndpointList() {\n return (\n <div className=\"zwp-endpoint-list\">\n <div className=\"zwp-section-header\">\n <h3 className=\"zwp-heading\">Endpoints</h3>\n <button className=\"zwp-btn zwp-btn--primary\" disabled>Add Endpoint</button>\n </div>\n <div className=\"zwp-list\">\n {PREVIEW_ENDPOINTS.map(ep => (\n <div key={ep.id} className=\"zwp-endpoint-card\" style={{ cursor: 'default' }}>\n <div className=\"zwp-endpoint-header\">\n <code className=\"zwp-endpoint-url\">{ep.url}</code>\n <span className={`zwp-badge ${ep.status === 'active' ? 'zwp-badge--green' : 'zwp-badge--yellow'}`}>\n {ep.status}\n </span>\n </div>\n {ep.description && <p className=\"zwp-endpoint-desc\">{ep.description}</p>}\n <div className=\"zwp-endpoint-meta\">\n <span>{ep.events.length} event{ep.events.length !== 1 ? 's' : ''}</span>\n <span>Created {new Date(ep.created_at).toLocaleDateString()}</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport function WebhookPortal({\n token,\n baseUrl,\n theme,\n preview,\n onEndpointCreated,\n onEndpointDeleted,\n onEndpointUpdated,\n onDeliveryRetried,\n onError,\n className,\n}: WebhookPortalProps) {\n const api = usePortalApi({ token, baseUrl });\n const [eventTypes, setEventTypes] = useState<PortalEventType[]>([]);\n const [selectedEndpoint, setSelectedEndpoint] = useState<PortalEndpoint | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Stable ref for onError to avoid re-triggering the fetch effect\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (preview) return;\n api.listEventTypes()\n .then(setEventTypes)\n .catch(err => {\n const e = err instanceof Error ? err : new Error('Failed to load event types');\n setError(e.message);\n onErrorRef.current?.(e);\n });\n }, [api, preview]);\n\n const handleError = (err: Error) => {\n setError(err.message);\n onError?.(err);\n setTimeout(() => setError(null), 5000);\n };\n\n const style: Record<string, string> = {};\n if (theme?.accent) {\n style['--zwp-accent'] = theme.accent;\n }\n if (theme?.borderRadius !== undefined) {\n style['--zwp-radius'] = `${theme.borderRadius}px`;\n }\n\n const themeClass = theme?.mode === 'dark' ? 'zwp-dark' : 'zwp-light';\n\n return (\n <div\n className={`zwp-portal ${themeClass} ${className || ''}`}\n style={style}\n >\n {error && (\n <div className=\"zwp-alert zwp-alert--error\">\n {error}\n <button className=\"zwp-alert-close\" onClick={() => setError(null)}>&times;</button>\n </div>\n )}\n\n {preview ? (\n <PreviewEndpointList />\n ) : selectedEndpoint ? (\n <EndpointDetail\n api={api}\n endpoint={selectedEndpoint}\n onBack={() => setSelectedEndpoint(null)}\n onRetried={onDeliveryRetried}\n onError={handleError}\n />\n ) : (\n <EndpointList\n api={api}\n eventTypes={eventTypes}\n onSelect={setSelectedEndpoint}\n onCreated={onEndpointCreated}\n onDeleted={onEndpointDeleted}\n onUpdated={onEndpointUpdated}\n onError={handleError}\n />\n )}\n </div>\n );\n}\n"],"names":["useRef","useCallback","useMemo","useState","useEffect","_jsx","_jsxs","_Fragment"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { useRef, useCallback, useState, useEffect } from 'react';
2
+ import { useRef, useCallback, useMemo, useState, useEffect } from 'react';
3
3
 
4
4
  const DEFAULT_BASE_URL = 'https://api.zyphr.dev/v1/waas-portal';
5
5
  function usePortalApi({ token, baseUrl }) {
@@ -73,7 +73,7 @@ function usePortalApi({ token, baseUrl }) {
73
73
  method: 'POST',
74
74
  });
75
75
  }, [request]);
76
- return {
76
+ return useMemo(() => ({
77
77
  listEventTypes,
78
78
  listEndpoints,
79
79
  createEndpoint,
@@ -83,7 +83,17 @@ function usePortalApi({ token, baseUrl }) {
83
83
  listDeliveries,
84
84
  getDelivery,
85
85
  retryDelivery,
86
- };
86
+ }), [
87
+ listEventTypes,
88
+ listEndpoints,
89
+ createEndpoint,
90
+ updateEndpoint,
91
+ deleteEndpoint,
92
+ rotateSecret,
93
+ listDeliveries,
94
+ getDelivery,
95
+ retryDelivery,
96
+ ]);
87
97
  }
88
98
 
89
99
  function EndpointList({ api, eventTypes, onSelect, onCreated, onDeleted, onUpdated, onError, }) {
@@ -120,6 +130,7 @@ function EndpointList({ api, eventTypes, onSelect, onCreated, onDeleted, onUpdat
120
130
  description: newDesc || undefined,
121
131
  });
122
132
  setCreatedSecret(endpoint.secret);
133
+ setShowCreate(false);
123
134
  setNewUrl('');
124
135
  setNewEvents([]);
125
136
  setNewDesc('');
@@ -168,7 +179,7 @@ function EndpointList({ api, eventTypes, onSelect, onCreated, onDeleted, onUpdat
168
179
  if (isLoading) {
169
180
  return jsx("div", { className: "zwp-loading", children: "Loading endpoints..." });
170
181
  }
171
- return (jsxs("div", { className: "zwp-endpoint-list", children: [jsxs("div", { className: "zwp-section-header", children: [jsx("h3", { className: "zwp-heading", children: "Endpoints" }), jsx("button", { className: "zwp-btn zwp-btn--primary", onClick: () => { setShowCreate(!showCreate); setCreatedSecret(null); }, children: showCreate ? 'Cancel' : 'Add Endpoint' })] }), createdSecret && (jsxs("div", { className: "zwp-alert zwp-alert--warning", children: [jsx("strong", { children: "Signing Secret" }), jsx("p", { children: "Store this secret securely. It will not be shown again." }), jsx("code", { className: "zwp-secret", children: createdSecret }), jsx("button", { className: "zwp-btn zwp-btn--sm", onClick: () => { navigator.clipboard.writeText(createdSecret); }, children: "Copy" })] })), showCreate && (jsxs("div", { className: "zwp-create-form", children: [jsxs("div", { className: "zwp-field", children: [jsx("label", { className: "zwp-label", children: "URL" }), jsx("input", { className: "zwp-input", type: "url", placeholder: "https://your-app.com/webhooks", value: newUrl, onChange: e => setNewUrl(e.target.value) })] }), jsxs("div", { className: "zwp-field", children: [jsx("label", { className: "zwp-label", children: "Description (optional)" }), jsx("input", { className: "zwp-input", type: "text", placeholder: "Production endpoint", value: newDesc, onChange: e => setNewDesc(e.target.value) })] }), jsxs("div", { className: "zwp-field", children: [jsx("label", { className: "zwp-label", children: "Events" }), jsx("div", { className: "zwp-event-picker", children: eventTypes.map(et => (jsxs("label", { className: "zwp-checkbox-label", children: [jsx("input", { type: "checkbox", checked: newEvents.includes(et.event_type), onChange: () => toggleEvent(et.event_type) }), jsx("span", { className: "zwp-event-name", children: et.name }), jsx("span", { className: "zwp-event-type", children: et.event_type })] }, et.event_type))) })] }), jsx("button", { className: "zwp-btn zwp-btn--primary", onClick: handleCreate, disabled: isCreating || !newUrl || newEvents.length === 0, children: isCreating ? 'Creating...' : 'Create Endpoint' })] })), endpoints.length === 0 ? (jsxs("div", { className: "zwp-empty", children: [jsx("p", { children: "No endpoints configured yet." }), jsx("p", { children: "Add an endpoint to start receiving webhook deliveries." })] })) : (jsx("div", { className: "zwp-list", children: endpoints.map(ep => (jsxs("div", { className: "zwp-endpoint-card", onClick: () => onSelect(ep), children: [jsxs("div", { className: "zwp-endpoint-header", children: [jsx("code", { className: "zwp-endpoint-url", children: ep.url }), jsx("span", { className: statusBadgeClass(ep.status), children: ep.status })] }), ep.description && (jsx("p", { className: "zwp-endpoint-desc", children: ep.description })), jsxs("div", { className: "zwp-endpoint-meta", children: [jsxs("span", { children: [ep.events.length, " event", ep.events.length !== 1 ? 's' : ''] }), jsxs("span", { children: ["Created ", new Date(ep.created_at).toLocaleDateString()] })] }), jsxs("div", { className: "zwp-endpoint-actions", onClick: e => e.stopPropagation(), children: [jsx("button", { className: "zwp-btn zwp-btn--sm zwp-btn--ghost", onClick: () => handleToggleStatus(ep), children: ep.status === 'active' ? 'Pause' : 'Resume' }), jsx("button", { className: "zwp-btn zwp-btn--sm zwp-btn--danger", onClick: () => handleDelete(ep), children: "Delete" })] })] }, ep.id))) }))] }));
182
+ return (jsxs("div", { className: "zwp-endpoint-list", children: [jsxs("div", { className: "zwp-section-header", children: [jsx("h3", { className: "zwp-heading", children: "Endpoints" }), jsx("button", { className: "zwp-btn zwp-btn--primary", onClick: () => { setShowCreate(!showCreate); setCreatedSecret(null); }, children: showCreate ? 'Cancel' : 'Add Endpoint' })] }), createdSecret && (jsxs("div", { className: "zwp-alert zwp-alert--warning", children: [jsx("button", { className: "zwp-alert-close", onClick: () => setCreatedSecret(null), children: "\u00D7" }), jsx("strong", { children: "Signing Secret" }), jsx("p", { children: "Store this secret securely. It will not be shown again." }), jsx("code", { className: "zwp-secret", children: createdSecret }), jsx("button", { className: "zwp-btn zwp-btn--sm", onClick: () => { navigator.clipboard.writeText(createdSecret); }, children: "Copy" })] })), showCreate && (jsxs("div", { className: "zwp-create-form", children: [jsxs("div", { className: "zwp-field", children: [jsx("label", { className: "zwp-label", children: "URL" }), jsx("input", { className: "zwp-input", type: "url", placeholder: "https://your-app.com/webhooks", value: newUrl, onChange: e => setNewUrl(e.target.value) })] }), jsxs("div", { className: "zwp-field", children: [jsx("label", { className: "zwp-label", children: "Description (optional)" }), jsx("input", { className: "zwp-input", type: "text", placeholder: "Production endpoint", value: newDesc, onChange: e => setNewDesc(e.target.value) })] }), jsxs("div", { className: "zwp-field", children: [jsx("label", { className: "zwp-label", children: "Events" }), jsx("div", { className: "zwp-event-picker", children: eventTypes.map(et => (jsxs("label", { className: "zwp-checkbox-label", children: [jsx("input", { type: "checkbox", checked: newEvents.includes(et.event_type), onChange: () => toggleEvent(et.event_type) }), jsx("span", { className: "zwp-event-name", children: et.name }), jsx("span", { className: "zwp-event-type", children: et.event_type })] }, et.event_type))) })] }), jsx("button", { className: "zwp-btn zwp-btn--primary", onClick: handleCreate, disabled: isCreating || !newUrl || newEvents.length === 0, children: isCreating ? 'Creating...' : 'Create Endpoint' })] })), endpoints.length === 0 ? (jsxs("div", { className: "zwp-empty", children: [jsx("p", { children: "No endpoints configured yet." }), jsx("p", { children: "Add an endpoint to start receiving webhook deliveries." })] })) : (jsx("div", { className: "zwp-list", children: endpoints.map(ep => (jsxs("div", { className: "zwp-endpoint-card", onClick: () => onSelect(ep), children: [jsxs("div", { className: "zwp-endpoint-header", children: [jsx("code", { className: "zwp-endpoint-url", children: ep.url }), jsx("span", { className: statusBadgeClass(ep.status), children: ep.status })] }), ep.description && (jsx("p", { className: "zwp-endpoint-desc", children: ep.description })), jsxs("div", { className: "zwp-endpoint-meta", children: [jsxs("span", { children: [ep.events.length, " event", ep.events.length !== 1 ? 's' : ''] }), jsxs("span", { children: ["Created ", new Date(ep.created_at).toLocaleDateString()] })] }), jsxs("div", { className: "zwp-endpoint-actions", onClick: e => e.stopPropagation(), children: [jsx("button", { className: "zwp-btn zwp-btn--sm zwp-btn--ghost", onClick: () => handleToggleStatus(ep), children: ep.status === 'active' ? 'Pause' : 'Resume' }), jsx("button", { className: "zwp-btn zwp-btn--sm zwp-btn--danger", onClick: () => handleDelete(ep), children: "Delete" })] })] }, ep.id))) }))] }));
172
183
  }
173
184
 
174
185
  function EndpointDetail({ api, endpoint, onBack, onRetried, onError }) {
@@ -267,6 +278,9 @@ function WebhookPortal({ token, baseUrl, theme, preview, onEndpointCreated, onEn
267
278
  const [eventTypes, setEventTypes] = useState([]);
268
279
  const [selectedEndpoint, setSelectedEndpoint] = useState(null);
269
280
  const [error, setError] = useState(null);
281
+ // Stable ref for onError to avoid re-triggering the fetch effect
282
+ const onErrorRef = useRef(onError);
283
+ onErrorRef.current = onError;
270
284
  useEffect(() => {
271
285
  if (preview)
272
286
  return;
@@ -275,9 +289,9 @@ function WebhookPortal({ token, baseUrl, theme, preview, onEndpointCreated, onEn
275
289
  .catch(err => {
276
290
  const e = err instanceof Error ? err : new Error('Failed to load event types');
277
291
  setError(e.message);
278
- onError?.(e);
292
+ onErrorRef.current?.(e);
279
293
  });
280
- }, [api, onError, preview]);
294
+ }, [api, preview]);
281
295
  const handleError = (err) => {
282
296
  setError(err.message);
283
297
  onError?.(err);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/hooks/usePortalApi.ts","../src/components/EndpointList.tsx","../src/components/EndpointDetail.tsx","../src/components/WebhookPortal.tsx"],"sourcesContent":["import { useCallback, useRef } from 'react';\nimport type {\n PortalApiResponse,\n PortalEventType,\n PortalEndpoint,\n PortalEndpointWithSecret,\n PortalDelivery,\n PortalDeliveryDetail,\n} from '../types';\n\nconst DEFAULT_BASE_URL = 'https://api.zyphr.dev/v1/waas-portal';\n\ninterface UsePortalApiOptions {\n token: string;\n baseUrl?: string;\n}\n\nexport function usePortalApi({ token, baseUrl }: UsePortalApiOptions) {\n const base = baseUrl || DEFAULT_BASE_URL;\n const tokenRef = useRef(token);\n tokenRef.current = token;\n\n const request = useCallback(async <T>(path: string, options?: RequestInit): Promise<T> => {\n const res = await fetch(`${base}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${tokenRef.current}`,\n ...options?.headers,\n },\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error?.message || `Request failed: ${res.status}`);\n }\n\n if (res.status === 204) return undefined as T;\n return res.json();\n }, [base]);\n\n const listEventTypes = useCallback(async () => {\n const res = await request<PortalApiResponse<PortalEventType[]>>('/event-types');\n return res.data;\n }, [request]);\n\n const listEndpoints = useCallback(async (limit = 20, offset = 0) => {\n const res = await request<PortalApiResponse<PortalEndpoint[]>>(\n `/endpoints?limit=${limit}&offset=${offset}`\n );\n return { endpoints: res.data, total: res.meta.total || 0 };\n }, [request]);\n\n const createEndpoint = useCallback(async (data: {\n url: string;\n events: string[];\n description?: string;\n }) => {\n const res = await request<PortalApiResponse<PortalEndpointWithSecret>>('/endpoints', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return res.data;\n }, [request]);\n\n const updateEndpoint = useCallback(async (endpointId: string, data: {\n url?: string;\n events?: string[];\n status?: 'active' | 'paused' | 'disabled';\n description?: string;\n }) => {\n const res = await request<PortalApiResponse<PortalEndpoint>>(`/endpoints/${endpointId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n return res.data;\n }, [request]);\n\n const deleteEndpoint = useCallback(async (endpointId: string) => {\n await request(`/endpoints/${endpointId}`, { method: 'DELETE' });\n }, [request]);\n\n const rotateSecret = useCallback(async (endpointId: string) => {\n const res = await request<PortalApiResponse<{ secret: string }>>(\n `/endpoints/${endpointId}/rotate-secret`,\n { method: 'POST' }\n );\n return res.data.secret;\n }, [request]);\n\n const listDeliveries = useCallback(async (endpointId: string, params?: {\n limit?: number;\n offset?: number;\n status?: string;\n }) => {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n if (params?.status) query.set('status', params.status);\n const qs = query.toString();\n\n const res = await request<PortalApiResponse<PortalDelivery[]>>(\n `/endpoints/${endpointId}/deliveries${qs ? `?${qs}` : ''}`\n );\n return { deliveries: res.data, total: res.meta.total || 0 };\n }, [request]);\n\n const getDelivery = useCallback(async (endpointId: string, deliveryId: string) => {\n const res = await request<PortalApiResponse<PortalDeliveryDetail>>(\n `/endpoints/${endpointId}/deliveries/${deliveryId}`\n );\n return res.data;\n }, [request]);\n\n const retryDelivery = useCallback(async (endpointId: string, deliveryId: string) => {\n await request(`/endpoints/${endpointId}/deliveries/${deliveryId}/retry`, {\n method: 'POST',\n });\n }, [request]);\n\n return {\n listEventTypes,\n listEndpoints,\n createEndpoint,\n updateEndpoint,\n deleteEndpoint,\n rotateSecret,\n listDeliveries,\n getDelivery,\n retryDelivery,\n };\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { PortalEndpoint, PortalEventType } from '../types';\nimport type { usePortalApi } from '../hooks/usePortalApi';\n\ninterface EndpointListProps {\n api: ReturnType<typeof usePortalApi>;\n eventTypes: PortalEventType[];\n onSelect: (endpoint: PortalEndpoint) => void;\n onCreated?: (endpoint: PortalEndpoint) => void;\n onDeleted?: (endpoint: PortalEndpoint) => void;\n onUpdated?: (endpoint: PortalEndpoint) => void;\n onError?: (error: Error) => void;\n}\n\nexport function EndpointList({\n api,\n eventTypes,\n onSelect,\n onCreated,\n onDeleted,\n onUpdated,\n onError,\n}: EndpointListProps) {\n const [endpoints, setEndpoints] = useState<PortalEndpoint[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [showCreate, setShowCreate] = useState(false);\n const [newUrl, setNewUrl] = useState('');\n const [newEvents, setNewEvents] = useState<string[]>([]);\n const [newDesc, setNewDesc] = useState('');\n const [isCreating, setIsCreating] = useState(false);\n const [createdSecret, setCreatedSecret] = useState<string | null>(null);\n\n const fetchEndpoints = useCallback(async () => {\n try {\n setIsLoading(true);\n const result = await api.listEndpoints(100, 0);\n setEndpoints(result.endpoints);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to load endpoints'));\n } finally {\n setIsLoading(false);\n }\n }, [api, onError]);\n\n useEffect(() => { fetchEndpoints(); }, [fetchEndpoints]);\n\n const handleCreate = async () => {\n if (!newUrl || newEvents.length === 0) return;\n setIsCreating(true);\n try {\n const endpoint = await api.createEndpoint({\n url: newUrl,\n events: newEvents,\n description: newDesc || undefined,\n });\n setCreatedSecret(endpoint.secret);\n setNewUrl('');\n setNewEvents([]);\n setNewDesc('');\n await fetchEndpoints();\n onCreated?.(endpoint);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to create endpoint'));\n } finally {\n setIsCreating(false);\n }\n };\n\n const handleDelete = async (ep: PortalEndpoint) => {\n try {\n await api.deleteEndpoint(ep.id);\n await fetchEndpoints();\n onDeleted?.(ep);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to delete endpoint'));\n }\n };\n\n const handleToggleStatus = async (ep: PortalEndpoint) => {\n const newStatus = ep.status === 'active' ? 'paused' : 'active';\n try {\n const updated = await api.updateEndpoint(ep.id, { status: newStatus });\n await fetchEndpoints();\n onUpdated?.(updated);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to update endpoint'));\n }\n };\n\n const toggleEvent = (eventType: string) => {\n setNewEvents(prev =>\n prev.includes(eventType) ? prev.filter(e => e !== eventType) : [...prev, eventType]\n );\n };\n\n const statusBadgeClass = (status: string) => {\n switch (status) {\n case 'active': return 'zwp-badge zwp-badge--green';\n case 'paused': return 'zwp-badge zwp-badge--yellow';\n case 'disabled': return 'zwp-badge zwp-badge--red';\n default: return 'zwp-badge';\n }\n };\n\n if (isLoading) {\n return <div className=\"zwp-loading\">Loading endpoints...</div>;\n }\n\n return (\n <div className=\"zwp-endpoint-list\">\n <div className=\"zwp-section-header\">\n <h3 className=\"zwp-heading\">Endpoints</h3>\n <button\n className=\"zwp-btn zwp-btn--primary\"\n onClick={() => { setShowCreate(!showCreate); setCreatedSecret(null); }}\n >\n {showCreate ? 'Cancel' : 'Add Endpoint'}\n </button>\n </div>\n\n {createdSecret && (\n <div className=\"zwp-alert zwp-alert--warning\">\n <strong>Signing Secret</strong>\n <p>Store this secret securely. It will not be shown again.</p>\n <code className=\"zwp-secret\">{createdSecret}</code>\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => { navigator.clipboard.writeText(createdSecret); }}\n >\n Copy\n </button>\n </div>\n )}\n\n {showCreate && (\n <div className=\"zwp-create-form\">\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">URL</label>\n <input\n className=\"zwp-input\"\n type=\"url\"\n placeholder=\"https://your-app.com/webhooks\"\n value={newUrl}\n onChange={e => setNewUrl(e.target.value)}\n />\n </div>\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">Description (optional)</label>\n <input\n className=\"zwp-input\"\n type=\"text\"\n placeholder=\"Production endpoint\"\n value={newDesc}\n onChange={e => setNewDesc(e.target.value)}\n />\n </div>\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">Events</label>\n <div className=\"zwp-event-picker\">\n {eventTypes.map(et => (\n <label key={et.event_type} className=\"zwp-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={newEvents.includes(et.event_type)}\n onChange={() => toggleEvent(et.event_type)}\n />\n <span className=\"zwp-event-name\">{et.name}</span>\n <span className=\"zwp-event-type\">{et.event_type}</span>\n </label>\n ))}\n </div>\n </div>\n <button\n className=\"zwp-btn zwp-btn--primary\"\n onClick={handleCreate}\n disabled={isCreating || !newUrl || newEvents.length === 0}\n >\n {isCreating ? 'Creating...' : 'Create Endpoint'}\n </button>\n </div>\n )}\n\n {endpoints.length === 0 ? (\n <div className=\"zwp-empty\">\n <p>No endpoints configured yet.</p>\n <p>Add an endpoint to start receiving webhook deliveries.</p>\n </div>\n ) : (\n <div className=\"zwp-list\">\n {endpoints.map(ep => (\n <div key={ep.id} className=\"zwp-endpoint-card\" onClick={() => onSelect(ep)}>\n <div className=\"zwp-endpoint-header\">\n <code className=\"zwp-endpoint-url\">{ep.url}</code>\n <span className={statusBadgeClass(ep.status)}>{ep.status}</span>\n </div>\n {ep.description && (\n <p className=\"zwp-endpoint-desc\">{ep.description}</p>\n )}\n <div className=\"zwp-endpoint-meta\">\n <span>{ep.events.length} event{ep.events.length !== 1 ? 's' : ''}</span>\n <span>Created {new Date(ep.created_at).toLocaleDateString()}</span>\n </div>\n <div className=\"zwp-endpoint-actions\" onClick={e => e.stopPropagation()}>\n <button\n className=\"zwp-btn zwp-btn--sm zwp-btn--ghost\"\n onClick={() => handleToggleStatus(ep)}\n >\n {ep.status === 'active' ? 'Pause' : 'Resume'}\n </button>\n <button\n className=\"zwp-btn zwp-btn--sm zwp-btn--danger\"\n onClick={() => handleDelete(ep)}\n >\n Delete\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { PortalEndpoint, PortalDelivery } from '../types';\nimport type { usePortalApi } from '../hooks/usePortalApi';\n\ninterface EndpointDetailProps {\n api: ReturnType<typeof usePortalApi>;\n endpoint: PortalEndpoint;\n onBack: () => void;\n onRetried?: (deliveryId: string) => void;\n onError?: (error: Error) => void;\n}\n\nexport function EndpointDetail({ api, endpoint, onBack, onRetried, onError }: EndpointDetailProps) {\n const [deliveries, setDeliveries] = useState<PortalDelivery[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(true);\n const [statusFilter, setStatusFilter] = useState('');\n const [page, setPage] = useState(0);\n const [retrying, setRetrying] = useState<string | null>(null);\n const PAGE_SIZE = 20;\n\n const fetchDeliveries = useCallback(async () => {\n try {\n setIsLoading(true);\n const result = await api.listDeliveries(endpoint.id, {\n limit: PAGE_SIZE,\n offset: page * PAGE_SIZE,\n status: statusFilter || undefined,\n });\n setDeliveries(result.deliveries);\n setTotal(result.total);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to load deliveries'));\n } finally {\n setIsLoading(false);\n }\n }, [api, endpoint.id, page, statusFilter, onError]);\n\n useEffect(() => { fetchDeliveries(); }, [fetchDeliveries]);\n\n const handleRetry = async (deliveryId: string) => {\n setRetrying(deliveryId);\n try {\n await api.retryDelivery(endpoint.id, deliveryId);\n await fetchDeliveries();\n onRetried?.(deliveryId);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to retry delivery'));\n } finally {\n setRetrying(null);\n }\n };\n\n const handleRotateSecret = async () => {\n try {\n const secret = await api.rotateSecret(endpoint.id);\n alert(`New secret: ${secret}\\n\\nStore this securely. It will not be shown again.`);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to rotate secret'));\n }\n };\n\n const statusBadgeClass = (status: string) => {\n switch (status) {\n case 'delivered': return 'zwp-badge zwp-badge--green';\n case 'failed': case 'exhausted': return 'zwp-badge zwp-badge--red';\n case 'retrying': case 'pending': return 'zwp-badge zwp-badge--yellow';\n default: return 'zwp-badge';\n }\n };\n\n const canRetry = (status: string) => status === 'failed' || status === 'exhausted';\n const totalPages = Math.ceil(total / PAGE_SIZE);\n\n return (\n <div className=\"zwp-endpoint-detail\">\n <button className=\"zwp-btn zwp-btn--ghost zwp-back-btn\" onClick={onBack}>\n &larr; Back to endpoints\n </button>\n\n <div className=\"zwp-detail-header\">\n <div>\n <code className=\"zwp-endpoint-url\">{endpoint.url}</code>\n <div className=\"zwp-endpoint-meta\">\n <span>{endpoint.events.length} event{endpoint.events.length !== 1 ? 's' : ''}</span>\n <span>Status: {endpoint.status}</span>\n </div>\n </div>\n <button className=\"zwp-btn zwp-btn--sm\" onClick={handleRotateSecret}>\n Rotate Secret\n </button>\n </div>\n\n <div className=\"zwp-events-list\">\n <h4 className=\"zwp-subheading\">Subscribed Events</h4>\n <div className=\"zwp-tags\">\n {endpoint.events.map(e => (\n <span key={e} className=\"zwp-tag\">{e}</span>\n ))}\n </div>\n </div>\n\n <div className=\"zwp-deliveries\">\n <div className=\"zwp-section-header\">\n <h4 className=\"zwp-subheading\">Delivery Log</h4>\n <select\n className=\"zwp-select\"\n value={statusFilter}\n onChange={e => { setStatusFilter(e.target.value); setPage(0); }}\n >\n <option value=\"\">All statuses</option>\n <option value=\"delivered\">Delivered</option>\n <option value=\"failed\">Failed</option>\n <option value=\"exhausted\">Exhausted</option>\n <option value=\"retrying\">Retrying</option>\n <option value=\"pending\">Pending</option>\n </select>\n </div>\n\n {isLoading ? (\n <div className=\"zwp-loading\">Loading deliveries...</div>\n ) : deliveries.length === 0 ? (\n <div className=\"zwp-empty\">\n <p>No deliveries yet.</p>\n </div>\n ) : (\n <>\n <table className=\"zwp-table\">\n <thead>\n <tr>\n <th>Event</th>\n <th>Status</th>\n <th>Attempts</th>\n <th>Response</th>\n <th>Time</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {deliveries.map(d => (\n <tr key={d.id}>\n <td><code className=\"zwp-event-code\">{d.event_type}</code></td>\n <td><span className={statusBadgeClass(d.status)}>{d.status}</span></td>\n <td>{d.attempts}/{d.max_attempts}</td>\n <td>{d.last_response_status || '—'}</td>\n <td className=\"zwp-time\">\n {d.last_attempted_at\n ? new Date(d.last_attempted_at).toLocaleString()\n : new Date(d.created_at).toLocaleString()}\n </td>\n <td>\n {canRetry(d.status) && (\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => handleRetry(d.id)}\n disabled={retrying === d.id}\n >\n {retrying === d.id ? '...' : 'Retry'}\n </button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n\n {totalPages > 1 && (\n <div className=\"zwp-pagination\">\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => setPage(p => p - 1)}\n disabled={page === 0}\n >\n Previous\n </button>\n <span className=\"zwp-page-info\">\n Page {page + 1} of {totalPages}\n </span>\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => setPage(p => p + 1)}\n disabled={page >= totalPages - 1}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\nimport type { WebhookPortalProps, PortalEndpoint, PortalEventType } from '../types';\nimport { usePortalApi } from '../hooks/usePortalApi';\nimport { EndpointList } from './EndpointList';\nimport { EndpointDetail } from './EndpointDetail';\n\nconst PREVIEW_ENDPOINTS: PortalEndpoint[] = [\n {\n id: 'preview-1',\n url: 'https://api.example.com/webhooks',\n description: 'Production endpoint',\n events: ['order.created', 'order.updated', 'payment.completed'],\n status: 'active',\n consecutive_failures: 0,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n },\n {\n id: 'preview-2',\n url: 'https://staging.example.com/hooks',\n events: ['order.created'],\n status: 'paused',\n consecutive_failures: 0,\n created_at: new Date(Date.now() - 86400000).toISOString(),\n updated_at: new Date(Date.now() - 86400000).toISOString(),\n },\n];\n\nfunction PreviewEndpointList() {\n return (\n <div className=\"zwp-endpoint-list\">\n <div className=\"zwp-section-header\">\n <h3 className=\"zwp-heading\">Endpoints</h3>\n <button className=\"zwp-btn zwp-btn--primary\" disabled>Add Endpoint</button>\n </div>\n <div className=\"zwp-list\">\n {PREVIEW_ENDPOINTS.map(ep => (\n <div key={ep.id} className=\"zwp-endpoint-card\" style={{ cursor: 'default' }}>\n <div className=\"zwp-endpoint-header\">\n <code className=\"zwp-endpoint-url\">{ep.url}</code>\n <span className={`zwp-badge ${ep.status === 'active' ? 'zwp-badge--green' : 'zwp-badge--yellow'}`}>\n {ep.status}\n </span>\n </div>\n {ep.description && <p className=\"zwp-endpoint-desc\">{ep.description}</p>}\n <div className=\"zwp-endpoint-meta\">\n <span>{ep.events.length} event{ep.events.length !== 1 ? 's' : ''}</span>\n <span>Created {new Date(ep.created_at).toLocaleDateString()}</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport function WebhookPortal({\n token,\n baseUrl,\n theme,\n preview,\n onEndpointCreated,\n onEndpointDeleted,\n onEndpointUpdated,\n onDeliveryRetried,\n onError,\n className,\n}: WebhookPortalProps) {\n const api = usePortalApi({ token, baseUrl });\n const [eventTypes, setEventTypes] = useState<PortalEventType[]>([]);\n const [selectedEndpoint, setSelectedEndpoint] = useState<PortalEndpoint | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (preview) return;\n api.listEventTypes()\n .then(setEventTypes)\n .catch(err => {\n const e = err instanceof Error ? err : new Error('Failed to load event types');\n setError(e.message);\n onError?.(e);\n });\n }, [api, onError, preview]);\n\n const handleError = (err: Error) => {\n setError(err.message);\n onError?.(err);\n setTimeout(() => setError(null), 5000);\n };\n\n const style: Record<string, string> = {};\n if (theme?.accent) {\n style['--zwp-accent'] = theme.accent;\n }\n if (theme?.borderRadius !== undefined) {\n style['--zwp-radius'] = `${theme.borderRadius}px`;\n }\n\n const themeClass = theme?.mode === 'dark' ? 'zwp-dark' : 'zwp-light';\n\n return (\n <div\n className={`zwp-portal ${themeClass} ${className || ''}`}\n style={style}\n >\n {error && (\n <div className=\"zwp-alert zwp-alert--error\">\n {error}\n <button className=\"zwp-alert-close\" onClick={() => setError(null)}>&times;</button>\n </div>\n )}\n\n {preview ? (\n <PreviewEndpointList />\n ) : selectedEndpoint ? (\n <EndpointDetail\n api={api}\n endpoint={selectedEndpoint}\n onBack={() => setSelectedEndpoint(null)}\n onRetried={onDeliveryRetried}\n onError={handleError}\n />\n ) : (\n <EndpointList\n api={api}\n eventTypes={eventTypes}\n onSelect={setSelectedEndpoint}\n onCreated={onEndpointCreated}\n onDeleted={onEndpointDeleted}\n onUpdated={onEndpointUpdated}\n onError={handleError}\n />\n )}\n </div>\n );\n}\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/hooks/usePortalApi.ts","../src/components/EndpointList.tsx","../src/components/EndpointDetail.tsx","../src/components/WebhookPortal.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef } from 'react';\nimport type {\n PortalApiResponse,\n PortalEventType,\n PortalEndpoint,\n PortalEndpointWithSecret,\n PortalDelivery,\n PortalDeliveryDetail,\n} from '../types';\n\nconst DEFAULT_BASE_URL = 'https://api.zyphr.dev/v1/waas-portal';\n\ninterface UsePortalApiOptions {\n token: string;\n baseUrl?: string;\n}\n\nexport function usePortalApi({ token, baseUrl }: UsePortalApiOptions) {\n const base = baseUrl || DEFAULT_BASE_URL;\n const tokenRef = useRef(token);\n tokenRef.current = token;\n\n const request = useCallback(async <T>(path: string, options?: RequestInit): Promise<T> => {\n const res = await fetch(`${base}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${tokenRef.current}`,\n ...options?.headers,\n },\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new Error(body?.error?.message || `Request failed: ${res.status}`);\n }\n\n if (res.status === 204) return undefined as T;\n return res.json();\n }, [base]);\n\n const listEventTypes = useCallback(async () => {\n const res = await request<PortalApiResponse<PortalEventType[]>>('/event-types');\n return res.data;\n }, [request]);\n\n const listEndpoints = useCallback(async (limit = 20, offset = 0) => {\n const res = await request<PortalApiResponse<PortalEndpoint[]>>(\n `/endpoints?limit=${limit}&offset=${offset}`\n );\n return { endpoints: res.data, total: res.meta.total || 0 };\n }, [request]);\n\n const createEndpoint = useCallback(async (data: {\n url: string;\n events: string[];\n description?: string;\n }) => {\n const res = await request<PortalApiResponse<PortalEndpointWithSecret>>('/endpoints', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return res.data;\n }, [request]);\n\n const updateEndpoint = useCallback(async (endpointId: string, data: {\n url?: string;\n events?: string[];\n status?: 'active' | 'paused' | 'disabled';\n description?: string;\n }) => {\n const res = await request<PortalApiResponse<PortalEndpoint>>(`/endpoints/${endpointId}`, {\n method: 'PUT',\n body: JSON.stringify(data),\n });\n return res.data;\n }, [request]);\n\n const deleteEndpoint = useCallback(async (endpointId: string) => {\n await request(`/endpoints/${endpointId}`, { method: 'DELETE' });\n }, [request]);\n\n const rotateSecret = useCallback(async (endpointId: string) => {\n const res = await request<PortalApiResponse<{ secret: string }>>(\n `/endpoints/${endpointId}/rotate-secret`,\n { method: 'POST' }\n );\n return res.data.secret;\n }, [request]);\n\n const listDeliveries = useCallback(async (endpointId: string, params?: {\n limit?: number;\n offset?: number;\n status?: string;\n }) => {\n const query = new URLSearchParams();\n if (params?.limit) query.set('limit', String(params.limit));\n if (params?.offset) query.set('offset', String(params.offset));\n if (params?.status) query.set('status', params.status);\n const qs = query.toString();\n\n const res = await request<PortalApiResponse<PortalDelivery[]>>(\n `/endpoints/${endpointId}/deliveries${qs ? `?${qs}` : ''}`\n );\n return { deliveries: res.data, total: res.meta.total || 0 };\n }, [request]);\n\n const getDelivery = useCallback(async (endpointId: string, deliveryId: string) => {\n const res = await request<PortalApiResponse<PortalDeliveryDetail>>(\n `/endpoints/${endpointId}/deliveries/${deliveryId}`\n );\n return res.data;\n }, [request]);\n\n const retryDelivery = useCallback(async (endpointId: string, deliveryId: string) => {\n await request(`/endpoints/${endpointId}/deliveries/${deliveryId}/retry`, {\n method: 'POST',\n });\n }, [request]);\n\n return useMemo(() => ({\n listEventTypes,\n listEndpoints,\n createEndpoint,\n updateEndpoint,\n deleteEndpoint,\n rotateSecret,\n listDeliveries,\n getDelivery,\n retryDelivery,\n }), [\n listEventTypes,\n listEndpoints,\n createEndpoint,\n updateEndpoint,\n deleteEndpoint,\n rotateSecret,\n listDeliveries,\n getDelivery,\n retryDelivery,\n ]);\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { PortalEndpoint, PortalEventType } from '../types';\nimport type { usePortalApi } from '../hooks/usePortalApi';\n\ninterface EndpointListProps {\n api: ReturnType<typeof usePortalApi>;\n eventTypes: PortalEventType[];\n onSelect: (endpoint: PortalEndpoint) => void;\n onCreated?: (endpoint: PortalEndpoint) => void;\n onDeleted?: (endpoint: PortalEndpoint) => void;\n onUpdated?: (endpoint: PortalEndpoint) => void;\n onError?: (error: Error) => void;\n}\n\nexport function EndpointList({\n api,\n eventTypes,\n onSelect,\n onCreated,\n onDeleted,\n onUpdated,\n onError,\n}: EndpointListProps) {\n const [endpoints, setEndpoints] = useState<PortalEndpoint[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [showCreate, setShowCreate] = useState(false);\n const [newUrl, setNewUrl] = useState('');\n const [newEvents, setNewEvents] = useState<string[]>([]);\n const [newDesc, setNewDesc] = useState('');\n const [isCreating, setIsCreating] = useState(false);\n const [createdSecret, setCreatedSecret] = useState<string | null>(null);\n\n const fetchEndpoints = useCallback(async () => {\n try {\n setIsLoading(true);\n const result = await api.listEndpoints(100, 0);\n setEndpoints(result.endpoints);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to load endpoints'));\n } finally {\n setIsLoading(false);\n }\n }, [api, onError]);\n\n useEffect(() => { fetchEndpoints(); }, [fetchEndpoints]);\n\n const handleCreate = async () => {\n if (!newUrl || newEvents.length === 0) return;\n setIsCreating(true);\n try {\n const endpoint = await api.createEndpoint({\n url: newUrl,\n events: newEvents,\n description: newDesc || undefined,\n });\n setCreatedSecret(endpoint.secret);\n setShowCreate(false);\n setNewUrl('');\n setNewEvents([]);\n setNewDesc('');\n await fetchEndpoints();\n onCreated?.(endpoint);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to create endpoint'));\n } finally {\n setIsCreating(false);\n }\n };\n\n const handleDelete = async (ep: PortalEndpoint) => {\n try {\n await api.deleteEndpoint(ep.id);\n await fetchEndpoints();\n onDeleted?.(ep);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to delete endpoint'));\n }\n };\n\n const handleToggleStatus = async (ep: PortalEndpoint) => {\n const newStatus = ep.status === 'active' ? 'paused' : 'active';\n try {\n const updated = await api.updateEndpoint(ep.id, { status: newStatus });\n await fetchEndpoints();\n onUpdated?.(updated);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to update endpoint'));\n }\n };\n\n const toggleEvent = (eventType: string) => {\n setNewEvents(prev =>\n prev.includes(eventType) ? prev.filter(e => e !== eventType) : [...prev, eventType]\n );\n };\n\n const statusBadgeClass = (status: string) => {\n switch (status) {\n case 'active': return 'zwp-badge zwp-badge--green';\n case 'paused': return 'zwp-badge zwp-badge--yellow';\n case 'disabled': return 'zwp-badge zwp-badge--red';\n default: return 'zwp-badge';\n }\n };\n\n if (isLoading) {\n return <div className=\"zwp-loading\">Loading endpoints...</div>;\n }\n\n return (\n <div className=\"zwp-endpoint-list\">\n <div className=\"zwp-section-header\">\n <h3 className=\"zwp-heading\">Endpoints</h3>\n <button\n className=\"zwp-btn zwp-btn--primary\"\n onClick={() => { setShowCreate(!showCreate); setCreatedSecret(null); }}\n >\n {showCreate ? 'Cancel' : 'Add Endpoint'}\n </button>\n </div>\n\n {createdSecret && (\n <div className=\"zwp-alert zwp-alert--warning\">\n <button className=\"zwp-alert-close\" onClick={() => setCreatedSecret(null)}>&times;</button>\n <strong>Signing Secret</strong>\n <p>Store this secret securely. It will not be shown again.</p>\n <code className=\"zwp-secret\">{createdSecret}</code>\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => { navigator.clipboard.writeText(createdSecret); }}\n >\n Copy\n </button>\n </div>\n )}\n\n {showCreate && (\n <div className=\"zwp-create-form\">\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">URL</label>\n <input\n className=\"zwp-input\"\n type=\"url\"\n placeholder=\"https://your-app.com/webhooks\"\n value={newUrl}\n onChange={e => setNewUrl(e.target.value)}\n />\n </div>\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">Description (optional)</label>\n <input\n className=\"zwp-input\"\n type=\"text\"\n placeholder=\"Production endpoint\"\n value={newDesc}\n onChange={e => setNewDesc(e.target.value)}\n />\n </div>\n <div className=\"zwp-field\">\n <label className=\"zwp-label\">Events</label>\n <div className=\"zwp-event-picker\">\n {eventTypes.map(et => (\n <label key={et.event_type} className=\"zwp-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={newEvents.includes(et.event_type)}\n onChange={() => toggleEvent(et.event_type)}\n />\n <span className=\"zwp-event-name\">{et.name}</span>\n <span className=\"zwp-event-type\">{et.event_type}</span>\n </label>\n ))}\n </div>\n </div>\n <button\n className=\"zwp-btn zwp-btn--primary\"\n onClick={handleCreate}\n disabled={isCreating || !newUrl || newEvents.length === 0}\n >\n {isCreating ? 'Creating...' : 'Create Endpoint'}\n </button>\n </div>\n )}\n\n {endpoints.length === 0 ? (\n <div className=\"zwp-empty\">\n <p>No endpoints configured yet.</p>\n <p>Add an endpoint to start receiving webhook deliveries.</p>\n </div>\n ) : (\n <div className=\"zwp-list\">\n {endpoints.map(ep => (\n <div key={ep.id} className=\"zwp-endpoint-card\" onClick={() => onSelect(ep)}>\n <div className=\"zwp-endpoint-header\">\n <code className=\"zwp-endpoint-url\">{ep.url}</code>\n <span className={statusBadgeClass(ep.status)}>{ep.status}</span>\n </div>\n {ep.description && (\n <p className=\"zwp-endpoint-desc\">{ep.description}</p>\n )}\n <div className=\"zwp-endpoint-meta\">\n <span>{ep.events.length} event{ep.events.length !== 1 ? 's' : ''}</span>\n <span>Created {new Date(ep.created_at).toLocaleDateString()}</span>\n </div>\n <div className=\"zwp-endpoint-actions\" onClick={e => e.stopPropagation()}>\n <button\n className=\"zwp-btn zwp-btn--sm zwp-btn--ghost\"\n onClick={() => handleToggleStatus(ep)}\n >\n {ep.status === 'active' ? 'Pause' : 'Resume'}\n </button>\n <button\n className=\"zwp-btn zwp-btn--sm zwp-btn--danger\"\n onClick={() => handleDelete(ep)}\n >\n Delete\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport type { PortalEndpoint, PortalDelivery } from '../types';\nimport type { usePortalApi } from '../hooks/usePortalApi';\n\ninterface EndpointDetailProps {\n api: ReturnType<typeof usePortalApi>;\n endpoint: PortalEndpoint;\n onBack: () => void;\n onRetried?: (deliveryId: string) => void;\n onError?: (error: Error) => void;\n}\n\nexport function EndpointDetail({ api, endpoint, onBack, onRetried, onError }: EndpointDetailProps) {\n const [deliveries, setDeliveries] = useState<PortalDelivery[]>([]);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(true);\n const [statusFilter, setStatusFilter] = useState('');\n const [page, setPage] = useState(0);\n const [retrying, setRetrying] = useState<string | null>(null);\n const PAGE_SIZE = 20;\n\n const fetchDeliveries = useCallback(async () => {\n try {\n setIsLoading(true);\n const result = await api.listDeliveries(endpoint.id, {\n limit: PAGE_SIZE,\n offset: page * PAGE_SIZE,\n status: statusFilter || undefined,\n });\n setDeliveries(result.deliveries);\n setTotal(result.total);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to load deliveries'));\n } finally {\n setIsLoading(false);\n }\n }, [api, endpoint.id, page, statusFilter, onError]);\n\n useEffect(() => { fetchDeliveries(); }, [fetchDeliveries]);\n\n const handleRetry = async (deliveryId: string) => {\n setRetrying(deliveryId);\n try {\n await api.retryDelivery(endpoint.id, deliveryId);\n await fetchDeliveries();\n onRetried?.(deliveryId);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to retry delivery'));\n } finally {\n setRetrying(null);\n }\n };\n\n const handleRotateSecret = async () => {\n try {\n const secret = await api.rotateSecret(endpoint.id);\n alert(`New secret: ${secret}\\n\\nStore this securely. It will not be shown again.`);\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error('Failed to rotate secret'));\n }\n };\n\n const statusBadgeClass = (status: string) => {\n switch (status) {\n case 'delivered': return 'zwp-badge zwp-badge--green';\n case 'failed': case 'exhausted': return 'zwp-badge zwp-badge--red';\n case 'retrying': case 'pending': return 'zwp-badge zwp-badge--yellow';\n default: return 'zwp-badge';\n }\n };\n\n const canRetry = (status: string) => status === 'failed' || status === 'exhausted';\n const totalPages = Math.ceil(total / PAGE_SIZE);\n\n return (\n <div className=\"zwp-endpoint-detail\">\n <button className=\"zwp-btn zwp-btn--ghost zwp-back-btn\" onClick={onBack}>\n &larr; Back to endpoints\n </button>\n\n <div className=\"zwp-detail-header\">\n <div>\n <code className=\"zwp-endpoint-url\">{endpoint.url}</code>\n <div className=\"zwp-endpoint-meta\">\n <span>{endpoint.events.length} event{endpoint.events.length !== 1 ? 's' : ''}</span>\n <span>Status: {endpoint.status}</span>\n </div>\n </div>\n <button className=\"zwp-btn zwp-btn--sm\" onClick={handleRotateSecret}>\n Rotate Secret\n </button>\n </div>\n\n <div className=\"zwp-events-list\">\n <h4 className=\"zwp-subheading\">Subscribed Events</h4>\n <div className=\"zwp-tags\">\n {endpoint.events.map(e => (\n <span key={e} className=\"zwp-tag\">{e}</span>\n ))}\n </div>\n </div>\n\n <div className=\"zwp-deliveries\">\n <div className=\"zwp-section-header\">\n <h4 className=\"zwp-subheading\">Delivery Log</h4>\n <select\n className=\"zwp-select\"\n value={statusFilter}\n onChange={e => { setStatusFilter(e.target.value); setPage(0); }}\n >\n <option value=\"\">All statuses</option>\n <option value=\"delivered\">Delivered</option>\n <option value=\"failed\">Failed</option>\n <option value=\"exhausted\">Exhausted</option>\n <option value=\"retrying\">Retrying</option>\n <option value=\"pending\">Pending</option>\n </select>\n </div>\n\n {isLoading ? (\n <div className=\"zwp-loading\">Loading deliveries...</div>\n ) : deliveries.length === 0 ? (\n <div className=\"zwp-empty\">\n <p>No deliveries yet.</p>\n </div>\n ) : (\n <>\n <table className=\"zwp-table\">\n <thead>\n <tr>\n <th>Event</th>\n <th>Status</th>\n <th>Attempts</th>\n <th>Response</th>\n <th>Time</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {deliveries.map(d => (\n <tr key={d.id}>\n <td><code className=\"zwp-event-code\">{d.event_type}</code></td>\n <td><span className={statusBadgeClass(d.status)}>{d.status}</span></td>\n <td>{d.attempts}/{d.max_attempts}</td>\n <td>{d.last_response_status || '—'}</td>\n <td className=\"zwp-time\">\n {d.last_attempted_at\n ? new Date(d.last_attempted_at).toLocaleString()\n : new Date(d.created_at).toLocaleString()}\n </td>\n <td>\n {canRetry(d.status) && (\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => handleRetry(d.id)}\n disabled={retrying === d.id}\n >\n {retrying === d.id ? '...' : 'Retry'}\n </button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n\n {totalPages > 1 && (\n <div className=\"zwp-pagination\">\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => setPage(p => p - 1)}\n disabled={page === 0}\n >\n Previous\n </button>\n <span className=\"zwp-page-info\">\n Page {page + 1} of {totalPages}\n </span>\n <button\n className=\"zwp-btn zwp-btn--sm\"\n onClick={() => setPage(p => p + 1)}\n disabled={page >= totalPages - 1}\n >\n Next\n </button>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useState, useEffect, useRef } from 'react';\nimport type { WebhookPortalProps, PortalEndpoint, PortalEventType } from '../types';\nimport { usePortalApi } from '../hooks/usePortalApi';\nimport { EndpointList } from './EndpointList';\nimport { EndpointDetail } from './EndpointDetail';\n\nconst PREVIEW_ENDPOINTS: PortalEndpoint[] = [\n {\n id: 'preview-1',\n url: 'https://api.example.com/webhooks',\n description: 'Production endpoint',\n events: ['order.created', 'order.updated', 'payment.completed'],\n status: 'active',\n consecutive_failures: 0,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n },\n {\n id: 'preview-2',\n url: 'https://staging.example.com/hooks',\n events: ['order.created'],\n status: 'paused',\n consecutive_failures: 0,\n created_at: new Date(Date.now() - 86400000).toISOString(),\n updated_at: new Date(Date.now() - 86400000).toISOString(),\n },\n];\n\nfunction PreviewEndpointList() {\n return (\n <div className=\"zwp-endpoint-list\">\n <div className=\"zwp-section-header\">\n <h3 className=\"zwp-heading\">Endpoints</h3>\n <button className=\"zwp-btn zwp-btn--primary\" disabled>Add Endpoint</button>\n </div>\n <div className=\"zwp-list\">\n {PREVIEW_ENDPOINTS.map(ep => (\n <div key={ep.id} className=\"zwp-endpoint-card\" style={{ cursor: 'default' }}>\n <div className=\"zwp-endpoint-header\">\n <code className=\"zwp-endpoint-url\">{ep.url}</code>\n <span className={`zwp-badge ${ep.status === 'active' ? 'zwp-badge--green' : 'zwp-badge--yellow'}`}>\n {ep.status}\n </span>\n </div>\n {ep.description && <p className=\"zwp-endpoint-desc\">{ep.description}</p>}\n <div className=\"zwp-endpoint-meta\">\n <span>{ep.events.length} event{ep.events.length !== 1 ? 's' : ''}</span>\n <span>Created {new Date(ep.created_at).toLocaleDateString()}</span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport function WebhookPortal({\n token,\n baseUrl,\n theme,\n preview,\n onEndpointCreated,\n onEndpointDeleted,\n onEndpointUpdated,\n onDeliveryRetried,\n onError,\n className,\n}: WebhookPortalProps) {\n const api = usePortalApi({ token, baseUrl });\n const [eventTypes, setEventTypes] = useState<PortalEventType[]>([]);\n const [selectedEndpoint, setSelectedEndpoint] = useState<PortalEndpoint | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n // Stable ref for onError to avoid re-triggering the fetch effect\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n if (preview) return;\n api.listEventTypes()\n .then(setEventTypes)\n .catch(err => {\n const e = err instanceof Error ? err : new Error('Failed to load event types');\n setError(e.message);\n onErrorRef.current?.(e);\n });\n }, [api, preview]);\n\n const handleError = (err: Error) => {\n setError(err.message);\n onError?.(err);\n setTimeout(() => setError(null), 5000);\n };\n\n const style: Record<string, string> = {};\n if (theme?.accent) {\n style['--zwp-accent'] = theme.accent;\n }\n if (theme?.borderRadius !== undefined) {\n style['--zwp-radius'] = `${theme.borderRadius}px`;\n }\n\n const themeClass = theme?.mode === 'dark' ? 'zwp-dark' : 'zwp-light';\n\n return (\n <div\n className={`zwp-portal ${themeClass} ${className || ''}`}\n style={style}\n >\n {error && (\n <div className=\"zwp-alert zwp-alert--error\">\n {error}\n <button className=\"zwp-alert-close\" onClick={() => setError(null)}>&times;</button>\n </div>\n )}\n\n {preview ? (\n <PreviewEndpointList />\n ) : selectedEndpoint ? (\n <EndpointDetail\n api={api}\n endpoint={selectedEndpoint}\n onBack={() => setSelectedEndpoint(null)}\n onRetried={onDeliveryRetried}\n onError={handleError}\n />\n ) : (\n <EndpointList\n api={api}\n eventTypes={eventTypes}\n onSelect={setSelectedEndpoint}\n onCreated={onEndpointCreated}\n onDeleted={onEndpointDeleted}\n onUpdated={onEndpointUpdated}\n onError={handleError}\n />\n )}\n </div>\n );\n}\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zyphr-dev/webhook-portal",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Embeddable webhook management portal for Zyphr WaaS",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",