@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 +299 -0
- package/dist/index.cjs +19 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +20 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
+
[](https://www.npmjs.com/package/@zyphr-dev/webhook-portal)
|
|
6
|
+
[](./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
|
-
|
|
294
|
+
onErrorRef.current?.(e);
|
|
281
295
|
});
|
|
282
|
-
}, [api,
|
|
296
|
+
}, [api, preview]);
|
|
283
297
|
const handleError = (err) => {
|
|
284
298
|
setError(err.message);
|
|
285
299
|
onError?.(err);
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 ← 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)}>×</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)}>×</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 ← 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)}>×</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
|
-
|
|
292
|
+
onErrorRef.current?.(e);
|
|
279
293
|
});
|
|
280
|
-
}, [api,
|
|
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 ← 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)}>×</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)}>×</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 ← 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)}>×</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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"}
|