@bigbinary/neeto-webhooks-frontend 3.0.11 → 3.0.13

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.
@@ -0,0 +1,1186 @@
1
+ import { pluck, assoc, mergeRight } from 'ramda';
2
+ import { useRouteMatch, useHistory, useParams, Switch as Switch$1, Route } from 'react-router-dom';
3
+ import { q as queryClient, u as useRedeliverWebhook, a as useShowDelivery, b as useFetchDeliveries, g as getDeliveriesPath, c as getDeliveryDetailsPath, d as useUpdateWebhook, v as v4, e as useCreateWebhook, f as useShowWebhook, h as useFetchEvents, i as useFetchWebhooks, j as useDestroyWebhook, H as HELP_LINK_URLS } from '../main-CfvmjDDj.js';
4
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
5
+ import { Typography, Badge, Tabs, Sheet, Spinner, Button, DataTable, Empty, Checkbox, Switch, Label, Alert } from '@bigbinary/neeto-atoms';
6
+ import { Send, Plus, Webhook } from 'lucide-react';
7
+ import { isPresent, removeBy, isNotEmpty, findIndexBy, removeById, findBy } from '@bigbinary/neeto-cist';
8
+ import { SINGULAR, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_INDEX, PLURAL } from '@bigbinary/neeto-commons-frontend/v2/constants';
9
+ import { useQueryParams, withT } from '@bigbinary/neeto-commons-frontend/v2/react-utils';
10
+ import { buildUrl } from '@bigbinary/neeto-commons-frontend/v2/utils';
11
+ import Container from '@bigbinary/neeto-molecules/v2/Container';
12
+ import Header$2 from '@bigbinary/neeto-molecules/v2/Header';
13
+ import TableWrapper from '@bigbinary/neeto-molecules/v2/TableWrapper';
14
+ import { useTranslation } from 'react-i18next';
15
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
16
+ import { QueryClientProvider } from '@tanstack/react-query';
17
+ import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
18
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
19
+ import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
20
+ import _regeneratorRuntime from '@babel/runtime/regenerator';
21
+ import DateFormat from '@bigbinary/neeto-molecules/v2/DateFormat';
22
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
23
+ import { useState, useRef, useMemo, useEffect, memo, useCallback } from 'react';
24
+ import { t } from 'i18next';
25
+ import { Form, Textarea, Input, ActionBlock } from '@bigbinary/neeto-atoms/formik';
26
+ import { FieldArray, ErrorMessage } from 'formik';
27
+ import HelpPopover from '@bigbinary/neeto-molecules/v2/HelpPopover';
28
+ import MoreDropdown from '@bigbinary/neeto-molecules/v2/MoreDropdown';
29
+ import * as yup from 'yup';
30
+ import SubHeader from '@bigbinary/neeto-molecules/v2/SubHeader';
31
+ import '@bigbinary/neeto-commons-frontend/initializers';
32
+ import '@bigbinary/neeto-commons-frontend/constants';
33
+ import 'axios';
34
+ import '@bigbinary/neeto-commons-frontend/react-utils';
35
+
36
+ function ownKeys$3(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
37
+ function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$3(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$3(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
38
+ var withReactQuery = function withReactQuery(Component) {
39
+ var QueryWrapper = function QueryWrapper(props) {
40
+ return /*#__PURE__*/jsxs(QueryClientProvider, {
41
+ client: queryClient,
42
+ children: [/*#__PURE__*/jsx(Component, _objectSpread$3({}, props)), /*#__PURE__*/jsx(ReactQueryDevtools, {
43
+ initialIsOpen: false,
44
+ position: "bottom"
45
+ })]
46
+ });
47
+ };
48
+ return QueryWrapper;
49
+ };
50
+
51
+ var DELIVERY_TAB = {
52
+ response: "response",
53
+ request: "request"
54
+ };
55
+
56
+ var Snippet = function Snippet(_ref) {
57
+ var children = _ref.children,
58
+ _ref$dataTestid = _ref.dataTestid,
59
+ dataTestid = _ref$dataTestid === void 0 ? "" : _ref$dataTestid;
60
+ return /*#__PURE__*/jsx("div", {
61
+ className: "my-2 whitespace-pre-wrap break-all rounded-lg border border-border bg-muted p-4",
62
+ "data-testid": dataTestid,
63
+ children: children
64
+ });
65
+ };
66
+
67
+ var TransactionDetails = function TransactionDetails(_ref) {
68
+ var delivery = _ref.delivery;
69
+ var _useState = useState(DELIVERY_TAB.request),
70
+ _useState2 = _slicedToArray(_useState, 2),
71
+ activeHeader = _useState2[0],
72
+ setActiveHeader = _useState2[1];
73
+ var _useTranslation = useTranslation(),
74
+ t = _useTranslation.t;
75
+ var status = delivery.status,
76
+ identifier = delivery.identifier,
77
+ responseStatusCode = delivery.responseStatusCode,
78
+ sid = delivery.sid;
79
+ var renderPayload = function renderPayload() {
80
+ try {
81
+ return JSON.stringify(JSON.parse(delivery.requestBody), null, 2);
82
+ } catch (_unused) {
83
+ return "";
84
+ }
85
+ };
86
+ return /*#__PURE__*/jsxs("div", {
87
+ className: "sticky top-0 mb-2 flex w-full flex-col bg-background",
88
+ children: [/*#__PURE__*/jsxs("div", {
89
+ className: "flex w-full flex-col space-y-2 pb-4",
90
+ children: [/*#__PURE__*/jsxs("span", {
91
+ className: "flex items-center space-x-1",
92
+ children: [t("neetoWebhooks.delivery.sid"), ":", /*#__PURE__*/jsx(Typography, {
93
+ className: "px-2",
94
+ "data-testid": "delivery-sid",
95
+ variant: "body2",
96
+ weight: "bold",
97
+ children: sid
98
+ })]
99
+ }), /*#__PURE__*/jsxs("span", {
100
+ className: "flex items-center space-x-1",
101
+ children: [t("neetoWebhooks.delivery.deliveryId"), ":", /*#__PURE__*/jsx(Typography, {
102
+ className: "px-2",
103
+ "data-testid": "delivery-identifier",
104
+ variant: "body2",
105
+ weight: "bold",
106
+ children: identifier
107
+ })]
108
+ }), /*#__PURE__*/jsxs("span", {
109
+ className: "flex items-center",
110
+ children: [t("neetoWebhooks.common.responseStatus"), ":", /*#__PURE__*/jsx(Typography, {
111
+ className: "px-2",
112
+ "data-testid": "delivery-response-code",
113
+ variant: "body2",
114
+ weight: "bold",
115
+ children: responseStatusCode
116
+ }), /*#__PURE__*/jsx(Badge, {
117
+ variant: status === "success" ? "green" : "amber",
118
+ children: status
119
+ })]
120
+ })]
121
+ }), /*#__PURE__*/jsxs(Tabs, {
122
+ value: activeHeader,
123
+ onValueChange: setActiveHeader,
124
+ children: [/*#__PURE__*/jsxs(Tabs.List, {
125
+ children: [/*#__PURE__*/jsx(Tabs.Item, {
126
+ value: DELIVERY_TAB.request,
127
+ children: t("neetoWebhooks.delivery.request")
128
+ }), /*#__PURE__*/jsx(Tabs.Item, {
129
+ value: DELIVERY_TAB.response,
130
+ children: t("neetoWebhooks.delivery.response")
131
+ })]
132
+ }), /*#__PURE__*/jsx(Tabs.Content, {
133
+ value: DELIVERY_TAB.request,
134
+ children: /*#__PURE__*/jsxs("div", {
135
+ className: "mt-2 w-full space-y-4",
136
+ children: [/*#__PURE__*/jsxs("div", {
137
+ children: [/*#__PURE__*/jsx(Typography, {
138
+ variant: "h5",
139
+ children: t("neetoWebhooks.delivery.header")
140
+ }), /*#__PURE__*/jsx(Snippet, {
141
+ dataTestid: "delivery-request-header",
142
+ children: delivery.requestHeader
143
+ })]
144
+ }), /*#__PURE__*/jsxs("div", {
145
+ children: [/*#__PURE__*/jsx(Typography, {
146
+ variant: "h5",
147
+ children: t("neetoWebhooks.delivery.payload")
148
+ }), /*#__PURE__*/jsx(Snippet, {
149
+ dataTestid: "delivery-request-payload",
150
+ children: renderPayload()
151
+ })]
152
+ })]
153
+ })
154
+ }), /*#__PURE__*/jsx(Tabs.Content, {
155
+ value: DELIVERY_TAB.response,
156
+ children: /*#__PURE__*/jsxs("div", {
157
+ className: "mt-2 w-full space-y-4",
158
+ children: [/*#__PURE__*/jsxs("div", {
159
+ children: [/*#__PURE__*/jsx(Typography, {
160
+ variant: "h5",
161
+ children: t("neetoWebhooks.delivery.header")
162
+ }), /*#__PURE__*/jsx(Snippet, {
163
+ dataTestid: "delivery-response-header",
164
+ children: delivery.responseHeader
165
+ })]
166
+ }), /*#__PURE__*/jsxs("div", {
167
+ children: [/*#__PURE__*/jsx(Typography, {
168
+ variant: "h5",
169
+ children: t("neetoWebhooks.delivery.body")
170
+ }), /*#__PURE__*/jsx(Snippet, {
171
+ dataTestid: "delivery-response-body",
172
+ children: delivery.responseBody
173
+ })]
174
+ })]
175
+ })
176
+ })]
177
+ })]
178
+ });
179
+ };
180
+
181
+ var Details = function Details(_ref) {
182
+ var _delivery$webhook;
183
+ var onClose = _ref.onClose,
184
+ deliveryId = _ref.deliveryId,
185
+ webhookSid = _ref.webhookSid;
186
+ var _useTranslation = useTranslation(),
187
+ t = _useTranslation.t;
188
+ var _useRedeliverWebhook = useRedeliverWebhook(deliveryId, webhookSid),
189
+ isRedelivering = _useRedeliverWebhook.isPending,
190
+ redeliverWebhook = _useRedeliverWebhook.mutateAsync;
191
+ var _useShowDelivery = useShowDelivery(deliveryId, webhookSid),
192
+ isLoading = _useShowDelivery.isPending,
193
+ _useShowDelivery$data = _useShowDelivery.data,
194
+ _useShowDelivery$data2 = _useShowDelivery$data === void 0 ? {} : _useShowDelivery$data,
195
+ delivery = _useShowDelivery$data2.delivery;
196
+ var handleRedeliverClick = /*#__PURE__*/function () {
197
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
198
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
199
+ while (1) switch (_context.prev = _context.next) {
200
+ case 0:
201
+ _context.next = 2;
202
+ return redeliverWebhook();
203
+ case 2:
204
+ case "end":
205
+ return _context.stop();
206
+ }
207
+ }, _callee);
208
+ }));
209
+ return function handleRedeliverClick() {
210
+ return _ref2.apply(this, arguments);
211
+ };
212
+ }();
213
+ return /*#__PURE__*/jsx(Sheet, {
214
+ onClose: onClose,
215
+ isOpen: isPresent(deliveryId),
216
+ size: "large",
217
+ children: /*#__PURE__*/jsx(Fragment, {
218
+ children: isLoading ? /*#__PURE__*/jsx("div", {
219
+ className: "flex h-full w-full items-center justify-center",
220
+ children: /*#__PURE__*/jsx(Spinner, {})
221
+ }) : /*#__PURE__*/jsxs(Fragment, {
222
+ children: [/*#__PURE__*/jsx(Sheet.Header, {
223
+ children: /*#__PURE__*/jsxs(Sheet.Title, {
224
+ children: [/*#__PURE__*/jsx(DateFormat.Date, {
225
+ date: delivery.createdAt,
226
+ tooltipProps: {
227
+ disabled: true
228
+ },
229
+ typographyProps: {
230
+ variant: null
231
+ }
232
+ }), /*#__PURE__*/jsx("span", {
233
+ children: " \u2022 "
234
+ }), /*#__PURE__*/jsx(DateFormat.Time, {
235
+ date: delivery.createdAt,
236
+ tooltipProps: {
237
+ disabled: true
238
+ },
239
+ typographyProps: {
240
+ variant: null,
241
+ weight: "normal"
242
+ }
243
+ })]
244
+ })
245
+ }), /*#__PURE__*/jsx(Sheet.Body, {
246
+ children: isPresent(delivery) && /*#__PURE__*/jsx(TransactionDetails, {
247
+ delivery: delivery
248
+ })
249
+ }), /*#__PURE__*/jsxs(Sheet.Footer, {
250
+ className: "gap-x-2",
251
+ children: [(delivery === null || delivery === void 0 ? void 0 : delivery.eventId) && /*#__PURE__*/jsx(Button, {
252
+ disabled: isRedelivering || ((_delivery$webhook = delivery.webhook) === null || _delivery$webhook === void 0 ? void 0 : _delivery$webhook.versionExpired),
253
+ label: t("neetoWebhooks.delivery.redeliver"),
254
+ loading: isRedelivering,
255
+ onClick: handleRedeliverClick
256
+ }), /*#__PURE__*/jsx(Button, {
257
+ label: t("neetoWebhooks.buttons.cancel"),
258
+ variant: "ghost",
259
+ onClick: onClose
260
+ })]
261
+ })]
262
+ })
263
+ })
264
+ });
265
+ };
266
+
267
+ var buildColumns$1 = function buildColumns(_ref) {
268
+ var deliveryDetailsPath = _ref.deliveryDetailsPath,
269
+ page = _ref.page;
270
+ return [{
271
+ id: "identifier",
272
+ accessorKey: "identifier",
273
+ header: t("neetoWebhooks.delivery.deliveryId"),
274
+ size: 390,
275
+ cell: function cell(_ref2) {
276
+ var row = _ref2.row;
277
+ var delivery = row.original;
278
+ return /*#__PURE__*/jsxs("div", {
279
+ className: "flex items-center gap-x-3",
280
+ children: [/*#__PURE__*/jsx(Button, {
281
+ className: "min-w-0 shrink justify-start text-left [&>span]:min-w-0 [&>span>span]:truncate",
282
+ title: delivery.identifier,
283
+ variant: "link",
284
+ to: buildUrl(deliveryDetailsPath, {
285
+ deliveryId: delivery.sid,
286
+ page: page
287
+ }),
288
+ children: delivery.identifier
289
+ }), delivery.redelivery && /*#__PURE__*/jsx(Badge, {
290
+ className: "shrink-0",
291
+ variant: "blue",
292
+ children: t("neetoWebhooks.delivery.redelivery")
293
+ })]
294
+ });
295
+ }
296
+ }, {
297
+ id: "createdAt",
298
+ accessorKey: "createdAt",
299
+ header: t("neetoWebhooks.tableHeaders.createdAt"),
300
+ size: 280,
301
+ cell: function cell(_ref3) {
302
+ var getValue = _ref3.getValue;
303
+ return /*#__PURE__*/jsx(DateFormat.DateTime, {
304
+ date: getValue()
305
+ });
306
+ }
307
+ }, {
308
+ id: "responseStatusCode",
309
+ header: t("neetoWebhooks.common.responseStatus"),
310
+ size: 250,
311
+ cell: function cell(_ref4) {
312
+ var row = _ref4.row;
313
+ var _row$original = row.original,
314
+ responseStatusCode = _row$original.responseStatusCode,
315
+ status = _row$original.status;
316
+ return /*#__PURE__*/jsxs("span", {
317
+ className: "flex items-center gap-x-2",
318
+ children: [/*#__PURE__*/jsx(Badge, {
319
+ variant: status === "success" ? "green" : "amber",
320
+ children: status
321
+ }), /*#__PURE__*/jsx(Typography, {
322
+ variant: "body2",
323
+ children: responseStatusCode
324
+ })]
325
+ });
326
+ }
327
+ }, {
328
+ id: "event",
329
+ accessorKey: "event",
330
+ header: t("neetoWebhooks.common.event", SINGULAR),
331
+ size: 270,
332
+ cell: function cell(_ref5) {
333
+ var _getValue;
334
+ var getValue = _ref5.getValue;
335
+ return (_getValue = getValue()) === null || _getValue === void 0 ? void 0 : _getValue.label;
336
+ }
337
+ }];
338
+ };
339
+
340
+ var Deliveries$1 = function Deliveries(_ref) {
341
+ var webhooksUrl = _ref.webhooksUrl,
342
+ hostBreadcrumbs = _ref.breadcrumbs,
343
+ helpLink = _ref.helpLink;
344
+ var _useRouteMatch = useRouteMatch(),
345
+ deliveriesUrl = _useRouteMatch.url;
346
+ var history = useHistory();
347
+ var _useTranslation = useTranslation(),
348
+ t = _useTranslation.t;
349
+ var _useParams = useParams(),
350
+ webhookId = _useParams.webhookId,
351
+ deliveryId = _useParams.deliveryId;
352
+ var _useQueryParams = useQueryParams(),
353
+ _useQueryParams$page = _useQueryParams.page,
354
+ page = _useQueryParams$page === void 0 ? DEFAULT_PAGE_INDEX : _useQueryParams$page;
355
+ var deliveriesPath = getDeliveriesPath(webhooksUrl);
356
+ var deliveryDetailsPath = getDeliveryDetailsPath(deliveriesUrl);
357
+ var _useFetchDeliveries = useFetchDeliveries(webhookId, {
358
+ page: page,
359
+ pageSize: DEFAULT_PAGE_SIZE
360
+ }),
361
+ isLoading = _useFetchDeliveries.isLoading,
362
+ isFetching = _useFetchDeliveries.isFetching,
363
+ _useFetchDeliveries$d = _useFetchDeliveries.data,
364
+ _useFetchDeliveries$d2 = _useFetchDeliveries$d === void 0 ? {} : _useFetchDeliveries$d,
365
+ totalCount = _useFetchDeliveries$d2.totalCount,
366
+ _useFetchDeliveries$d3 = _useFetchDeliveries$d2.deliveries,
367
+ deliveries = _useFetchDeliveries$d3 === void 0 ? [] : _useFetchDeliveries$d3;
368
+ var breadcrumbsWithoutWebhooksTitle = removeBy({
369
+ text: t("neetoWebhooks.webhook.title")
370
+ }, hostBreadcrumbs);
371
+ var breadcrumbs = [].concat(_toConsumableArray(breadcrumbsWithoutWebhooksTitle), [{
372
+ link: webhooksUrl,
373
+ text: t("neetoWebhooks.webhook.title")
374
+ }, {
375
+ link: window.location.pathname,
376
+ text: t("neetoWebhooks.delivery.title")
377
+ }]);
378
+ if (isLoading) {
379
+ return /*#__PURE__*/jsx("div", {
380
+ className: "flex justify-center items-center w-full h-screen",
381
+ children: /*#__PURE__*/jsx(Spinner, {})
382
+ });
383
+ }
384
+ return /*#__PURE__*/jsxs(Container, {
385
+ className: "w-full",
386
+ children: [/*#__PURE__*/jsx(Header$2, {
387
+ breadcrumbs: breadcrumbs,
388
+ title: t("neetoWebhooks.delivery.title"),
389
+ titleHelpPopoverProps: {
390
+ title: t("neetoWebhooks.delivery.title"),
391
+ description: t("neetoWebhooks.delivery.helpDescription"),
392
+ helpLinkProps: {
393
+ href: helpLink
394
+ }
395
+ }
396
+ }), isNotEmpty(deliveries) ? /*#__PURE__*/jsx(TableWrapper, {
397
+ hasPagination: totalCount > DEFAULT_PAGE_SIZE,
398
+ children: /*#__PURE__*/jsx(DataTable, {
399
+ totalCount: totalCount,
400
+ columns: buildColumns$1({
401
+ deliveryDetailsPath: deliveryDetailsPath,
402
+ page: page
403
+ }),
404
+ currentPage: Number(page),
405
+ data: deliveries,
406
+ loading: isFetching,
407
+ pageSize: DEFAULT_PAGE_SIZE
408
+ })
409
+ }) : /*#__PURE__*/jsx("div", {
410
+ className: "flex justify-center items-center w-full h-full",
411
+ children: /*#__PURE__*/jsx(Empty, {
412
+ description: t("neetoWebhooks.delivery.empty.description"),
413
+ icon: Send,
414
+ title: t("neetoWebhooks.delivery.empty.title")
415
+ })
416
+ }), /*#__PURE__*/jsx(Details, {
417
+ deliveryId: deliveryId,
418
+ webhookSid: webhookId,
419
+ onClose: function onClose() {
420
+ return history.replace(buildUrl(deliveriesPath, {
421
+ webhookId: webhookId,
422
+ page: page
423
+ }));
424
+ }
425
+ })]
426
+ });
427
+ };
428
+ var Deliveries = withReactQuery(Deliveries$1);
429
+
430
+ var MENU_ITEMS = {
431
+ EDIT: "edit",
432
+ DELETE: "delete"
433
+ };
434
+ var WEBHOOK_INITIAL_VALUES = {
435
+ endpoint: "",
436
+ events: [],
437
+ secret: "",
438
+ isActive: true
439
+ };
440
+
441
+ var EventCheckbox = function EventCheckbox(_ref) {
442
+ var events = _ref.events,
443
+ values = _ref.values,
444
+ arrayHelpers = _ref.arrayHelpers,
445
+ onEventsChange = _ref.onEventsChange;
446
+ var handleToggle = function handleToggle(isSelected, index, event) {
447
+ if (isSelected) {
448
+ arrayHelpers.remove(index);
449
+ } else {
450
+ arrayHelpers.push(event);
451
+ }
452
+ onEventsChange === null || onEventsChange === void 0 || onEventsChange();
453
+ };
454
+ return /*#__PURE__*/jsx("div", {
455
+ children: events.map(function (event) {
456
+ var _values$events;
457
+ var index = findIndexBy(event, (_values$events = values.events) !== null && _values$events !== void 0 ? _values$events : []);
458
+ var isSelected = index > -1;
459
+ return /*#__PURE__*/jsx(Checkbox, {
460
+ checked: isSelected,
461
+ className: "my-4",
462
+ label: event.label,
463
+ onCheckedChange: function onCheckedChange() {
464
+ return handleToggle(isSelected, index, event);
465
+ }
466
+ }, event.identifier);
467
+ })
468
+ });
469
+ };
470
+
471
+ var ToggleActiveSwitch = function ToggleActiveSwitch(_ref) {
472
+ var isActive = _ref.isActive,
473
+ webhookId = _ref.webhookId;
474
+ var _useState = useState(isActive),
475
+ _useState2 = _slicedToArray(_useState, 2),
476
+ status = _useState2[0],
477
+ setStatus = _useState2[1];
478
+ var previousStatusRef = useRef(isActive);
479
+ var _useUpdateWebhook = useUpdateWebhook(webhookId, {
480
+ onError: function onError() {
481
+ // Revert to the previous state
482
+ setStatus(previousStatusRef.current);
483
+ },
484
+ onSuccess: function onSuccess() {
485
+ // Update the previous status ref on successful update
486
+ previousStatusRef.current = status;
487
+ }
488
+ }),
489
+ updateWebhook = _useUpdateWebhook.mutate;
490
+ var handleToggle = function handleToggle(updatedStatus) {
491
+ // Store the current status as previous before changing
492
+ previousStatusRef.current = status;
493
+ setStatus(updatedStatus);
494
+ updateWebhook({
495
+ id: webhookId,
496
+ payload: {
497
+ isActive: updatedStatus
498
+ }
499
+ });
500
+ };
501
+ return /*#__PURE__*/jsx(Switch, {
502
+ checked: status,
503
+ onCheckedChange: handleToggle
504
+ });
505
+ };
506
+
507
+ function ownKeys$2(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
508
+ function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$2(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$2(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
509
+ var getMenuItems = function getMenuItems(_ref) {
510
+ var onEdit = _ref.onEdit,
511
+ onDelete = _ref.onDelete;
512
+ return [{
513
+ key: MENU_ITEMS.EDIT,
514
+ label: t("neetoWebhooks.buttons.edit"),
515
+ "data-testid": "neeto-webhooks-edit-button",
516
+ onClick: onEdit
517
+ }, {
518
+ key: MENU_ITEMS.DELETE,
519
+ label: t("neetoWebhooks.buttons.delete"),
520
+ "data-testid": "neeto-webhooks-delete-button",
521
+ onClick: onDelete
522
+ }];
523
+ };
524
+ var getValidationSchema = function getValidationSchema(webhooks) {
525
+ return yup.object().shape({
526
+ endpoint: yup.string().trim().matches(/^(https?):\/\//i, t("neetoWebhooks.errors.webhook.invalidUrlProtocol")).url(t("neetoWebhooks.errors.webhook.invalidUrl")).required(t("neetoWebhooks.errors.webhook.required")).test("Is endpoint unique", t("neetoWebhooks.errors.webhook.urlNotUnique"), function (endpoint, ctx) {
527
+ return !pluck("endpoint", removeById(ctx.parent.id, webhooks)).includes(endpoint === null || endpoint === void 0 ? void 0 : endpoint.trim());
528
+ }),
529
+ events: yup.array()["default"]([]).min(1, t("neetoWebhooks.errors.webhook.events.required")),
530
+ secret: yup.string().trim().nullable()
531
+ });
532
+ };
533
+ var buildPayload = function buildPayload(_ref2) {
534
+ var _initialValues$events;
535
+ var isEditing = _ref2.isEditing,
536
+ values = _ref2.values,
537
+ initialValues = _ref2.initialValues;
538
+ var events = values.events.map(function (_ref3) {
539
+ var identifier = _ref3.identifier;
540
+ return {
541
+ identifier: identifier
542
+ };
543
+ });
544
+ if (!isEditing) return _objectSpread$2(_objectSpread$2({}, values), {}, {
545
+ eventsAttributes: events
546
+ });
547
+ var deletable = ((_initialValues$events = initialValues.events) !== null && _initialValues$events !== void 0 ? _initialValues$events : []).filter(function (_ref4) {
548
+ var identifier = _ref4.identifier;
549
+ return !findBy({
550
+ identifier: identifier
551
+ }, values.events);
552
+ }).map(assoc("_destroy", true));
553
+ var creatable = values.events.filter(function (_ref5) {
554
+ var identifier = _ref5.identifier;
555
+ return !findBy({
556
+ identifier: identifier
557
+ }, initialValues.events);
558
+ });
559
+ return _objectSpread$2(_objectSpread$2({}, values), {}, {
560
+ eventsAttributes: [].concat(_toConsumableArray(creatable), _toConsumableArray(deletable))
561
+ });
562
+ };
563
+ var formatTimeUntilExpiration = function formatTimeUntilExpiration(expiresAt) {
564
+ if (!expiresAt) return null;
565
+ var now = new Date();
566
+ var expiry = new Date(expiresAt);
567
+ var diffMs = expiry - now;
568
+ if (diffMs <= 0) return null;
569
+ var diffHours = Math.floor(diffMs / (1000 * 60 * 60));
570
+ var diffDays = Math.floor(diffHours / 24);
571
+ if (diffDays > 0) {
572
+ return t("neetoWebhooks.webhook.versionStatus.expiresIn.days", {
573
+ count: diffDays
574
+ });
575
+ }
576
+ var remainingHours = diffHours;
577
+ var remainingMinutes = Math.floor(diffMs % (1000 * 60 * 60) / (1000 * 60));
578
+ return t("neetoWebhooks.webhook.versionStatus.expiresIn.hoursAndMinutes", {
579
+ hours: remainingHours,
580
+ hoursPlural: remainingHours !== 1 ? "s" : "",
581
+ minutes: remainingMinutes,
582
+ minutesPlural: remainingMinutes !== 1 ? "s" : ""
583
+ });
584
+ };
585
+ var formatExpiredDate = function formatExpiredDate(expiresAt) {
586
+ if (!expiresAt) return null;
587
+ var expiry = new Date(expiresAt);
588
+ return t("neetoWebhooks.webhook.versionStatus.expiredOn", {
589
+ date: expiry.toLocaleDateString()
590
+ });
591
+ };
592
+ var buildColumns = function buildColumns(_ref6) {
593
+ var handleDelete = _ref6.handleDelete,
594
+ handleEdit = _ref6.handleEdit,
595
+ deliveriesPath = _ref6.deliveriesPath;
596
+ return [{
597
+ id: "endpoint",
598
+ accessorKey: "endpoint",
599
+ header: t("neetoWebhooks.common.endpoint"),
600
+ size: 700,
601
+ cell: function cell(_ref7) {
602
+ var row = _ref7.row,
603
+ getValue = _ref7.getValue;
604
+ var webhook = row.original;
605
+ return /*#__PURE__*/jsxs("div", {
606
+ className: "flex items-center justify-between gap-3 w-full",
607
+ children: [/*#__PURE__*/jsx(Button, {
608
+ className: "min-w-0 justify-start text-left [&>span]:min-w-0 [&>span>span]:truncate shrink",
609
+ title: getValue(),
610
+ to: buildUrl(deliveriesPath, {
611
+ webhookId: webhook.sid
612
+ }),
613
+ variant: "link",
614
+ children: getValue()
615
+ }), /*#__PURE__*/jsx(MoreDropdown, {
616
+ menuItems: getMenuItems({
617
+ onEdit: function onEdit() {
618
+ return handleEdit(webhook.id);
619
+ },
620
+ onDelete: function onDelete() {
621
+ return handleDelete(webhook.id);
622
+ }
623
+ })
624
+ })]
625
+ });
626
+ }
627
+ }, {
628
+ id: "isActive",
629
+ accessorKey: "isActive",
630
+ header: t("neetoWebhooks.webhook.active"),
631
+ size: 150,
632
+ cell: function cell(_ref8) {
633
+ var row = _ref8.row,
634
+ getValue = _ref8.getValue;
635
+ return /*#__PURE__*/jsx(ToggleActiveSwitch, {
636
+ isActive: getValue(),
637
+ webhookId: row.original.id
638
+ });
639
+ }
640
+ }, {
641
+ id: "version",
642
+ accessorKey: "version",
643
+ header: t("neetoWebhooks.webhook.version"),
644
+ size: 200,
645
+ cell: function cell(_ref9) {
646
+ var row = _ref9.row,
647
+ getValue = _ref9.getValue;
648
+ var webhook = row.original;
649
+ var timeMessage = webhook.versionExpired ? formatExpiredDate(webhook.versionExpiresAt) : formatTimeUntilExpiration(webhook.versionExpiresAt);
650
+ return /*#__PURE__*/jsxs("div", {
651
+ className: "flex flex-col space-y-1",
652
+ children: [/*#__PURE__*/jsxs("div", {
653
+ className: "flex items-center space-x-2",
654
+ children: [/*#__PURE__*/jsx("span", {
655
+ children: getValue()
656
+ }), webhook.versionExpired && /*#__PURE__*/jsx(Badge, {
657
+ variant: "red",
658
+ children: "expired"
659
+ }), webhook.versionDeprecated && !webhook.versionExpired && /*#__PURE__*/jsx(Badge, {
660
+ variant: "amber",
661
+ children: "deprecated"
662
+ })]
663
+ }), timeMessage && /*#__PURE__*/jsxs(Typography, {
664
+ color: "muted",
665
+ variant: "caption",
666
+ children: [timeMessage, ".", " ", /*#__PURE__*/jsx("a", {
667
+ className: "text-primary underline decoration-primary/40 underline-offset-4 hover:decoration-primary",
668
+ href: webhook.defaultVersionPayloadDocUrl,
669
+ rel: "noopener noreferrer",
670
+ target: "_blank",
671
+ children: t("neetoWebhooks.webhook.versionStatus.moreDetails")
672
+ }), "."]
673
+ })]
674
+ });
675
+ }
676
+ }, {
677
+ id: "events",
678
+ accessorKey: "events",
679
+ header: t("neetoWebhooks.common.event", PLURAL),
680
+ size: 300,
681
+ cell: function cell(_ref10) {
682
+ var getValue = _ref10.getValue;
683
+ return /*#__PURE__*/jsx("span", {
684
+ className: "whitespace-normal",
685
+ children: pluck("label", getValue()).sort().join(", ")
686
+ });
687
+ }
688
+ }];
689
+ };
690
+ var generateRandomSecret = function generateRandomSecret() {
691
+ return v4().replace(/-/g, "");
692
+ };
693
+
694
+ function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
695
+ function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
696
+ var AddWebhookPane = function AddWebhookPane(_ref) {
697
+ var editingWebhookId = _ref.editingWebhookId,
698
+ entityId = _ref.entityId,
699
+ entityType = _ref.entityType,
700
+ isOpen = _ref.isOpen,
701
+ onClose = _ref.onClose,
702
+ onCreate = _ref.onCreate,
703
+ webhooks = _ref.webhooks,
704
+ webhooksHelpLink = _ref.webhooksHelpLink,
705
+ secretsHelpLink = _ref.secretsHelpLink;
706
+ var _useTranslation = useTranslation(),
707
+ t = _useTranslation.t;
708
+ var _useState = useState(false),
709
+ _useState2 = _slicedToArray(_useState, 2),
710
+ isSecretInputFieldVisible = _useState2[0],
711
+ setIsSecretInputFieldVisible = _useState2[1];
712
+ var _useCreateWebhook = useCreateWebhook({
713
+ onSuccess: function onSuccess() {
714
+ onClose();
715
+ onCreate === null || onCreate === void 0 || onCreate();
716
+ }
717
+ }),
718
+ createWebhook = _useCreateWebhook.mutate;
719
+ var _useShowWebhook = useShowWebhook(editingWebhookId),
720
+ _useShowWebhook$data = _useShowWebhook.data,
721
+ _useShowWebhook$data2 = _useShowWebhook$data === void 0 ? {} : _useShowWebhook$data,
722
+ _useShowWebhook$data3 = _useShowWebhook$data2.webhook,
723
+ webhook = _useShowWebhook$data3 === void 0 ? {} : _useShowWebhook$data3;
724
+ var _useUpdateWebhook = useUpdateWebhook(editingWebhookId, {
725
+ onSuccess: onClose
726
+ }),
727
+ updateWebhook = _useUpdateWebhook.mutate;
728
+ var endpointRef = useRef();
729
+ var _useFetchEvents = useFetchEvents(),
730
+ _useFetchEvents$data = _useFetchEvents.data,
731
+ events = _useFetchEvents$data === void 0 ? [] : _useFetchEvents$data,
732
+ isLoading = _useFetchEvents.isLoading;
733
+ var initialValues = useMemo(function () {
734
+ return editingWebhookId ? _objectSpread$1(_objectSpread$1(_objectSpread$1({}, WEBHOOK_INITIAL_VALUES), webhook), {}, {
735
+ events: Array.isArray(webhook === null || webhook === void 0 ? void 0 : webhook.events) ? webhook === null || webhook === void 0 ? void 0 : webhook.events : []
736
+ }) : _objectSpread$1(_objectSpread$1({}, WEBHOOK_INITIAL_VALUES), {}, {
737
+ events: events
738
+ });
739
+ }, [editingWebhookId, webhook, events]);
740
+ var isWebhookExpiredOrDeprecated = editingWebhookId && (webhook.versionExpired || webhook.versionDeprecated);
741
+ var handleSubmit = function handleSubmit(values) {
742
+ // Check if webhook is expired or deprecated before allowing edit
743
+ if (editingWebhookId && (webhook.versionExpired || webhook.versionDeprecated)) {
744
+ return;
745
+ }
746
+ var payload = buildPayload({
747
+ isEditing: editingWebhookId,
748
+ values: values,
749
+ initialValues: initialValues
750
+ });
751
+ editingWebhookId ? updateWebhook({
752
+ id: editingWebhookId,
753
+ payload: payload,
754
+ entityId: entityId
755
+ }) : createWebhook(_objectSpread$1(_objectSpread$1({}, payload), {}, {
756
+ entityId: entityId,
757
+ entityType: entityType
758
+ }));
759
+ };
760
+ var handleClick = function handleClick(setFieldValue) {
761
+ var randomWebhookSecret = generateRandomSecret();
762
+ setFieldValue("secret", randomWebhookSecret);
763
+ setIsSecretInputFieldVisible(true);
764
+ };
765
+ var handleRegenerate = function handleRegenerate(setFieldValue) {
766
+ var randomWebhookSecret = generateRandomSecret();
767
+ setFieldValue("secret", randomWebhookSecret);
768
+ };
769
+ var handleDelete = function handleDelete(setFieldValue) {
770
+ setFieldValue("secret", null);
771
+ setIsSecretInputFieldVisible(false);
772
+ };
773
+ useEffect(function () {
774
+ if (webhook !== null && webhook !== void 0 && webhook.secret) {
775
+ setIsSecretInputFieldVisible(true);
776
+ }
777
+ }, [webhook]);
778
+ return /*#__PURE__*/jsx(Form, {
779
+ formikProps: {
780
+ enableReinitialize: true,
781
+ validationSchema: getValidationSchema(webhooks),
782
+ initialValues: initialValues,
783
+ onSubmit: function onSubmit(values) {
784
+ return handleSubmit(getValidationSchema().cast(values));
785
+ }
786
+ },
787
+ children: function children(_ref2) {
788
+ var setFieldValue = _ref2.setFieldValue,
789
+ setFieldTouched = _ref2.setFieldTouched,
790
+ values = _ref2.values,
791
+ isValid = _ref2.isValid,
792
+ dirty = _ref2.dirty;
793
+ return /*#__PURE__*/jsxs(Sheet, {
794
+ isOpen: isOpen,
795
+ onClose: onClose,
796
+ initialFocusRef: endpointRef,
797
+ size: "large",
798
+ children: [/*#__PURE__*/jsx(Sheet.Header, {
799
+ children: /*#__PURE__*/jsxs(Sheet.Title, {
800
+ className: "flex items-center gap-2",
801
+ "data-testid": "add-new-webhook-pane-header",
802
+ children: [editingWebhookId ? t("neetoWebhooks.webhook.edit") : t("neetoWebhooks.webhook.add"), /*#__PURE__*/jsx(HelpPopover, {
803
+ description: t("neetoWebhooks.webhook.helpDescription"),
804
+ helpLinkProps: {
805
+ href: webhooksHelpLink
806
+ },
807
+ title: t("neetoWebhooks.webhook.title")
808
+ })]
809
+ })
810
+ }), isLoading ? /*#__PURE__*/jsx(Sheet.Body, {
811
+ children: /*#__PURE__*/jsx("div", {
812
+ className: "flex items-center justify-center",
813
+ children: /*#__PURE__*/jsx(Spinner, {})
814
+ })
815
+ }) : /*#__PURE__*/jsxs(Fragment, {
816
+ children: [/*#__PURE__*/jsx(Sheet.Body, {
817
+ className: "pb-6",
818
+ children: /*#__PURE__*/jsxs("div", {
819
+ className: "w-full space-y-4 md:space-y-6",
820
+ children: [/*#__PURE__*/jsx(Typography, {
821
+ className: "mb-4",
822
+ variant: "body2",
823
+ children: t("neetoWebhooks.webhook.postRequestIsSentToEndpointURL")
824
+ }), /*#__PURE__*/jsx(Textarea, {
825
+ required: true,
826
+ className: "[&_textarea]:[field-sizing:content]!",
827
+ "data-testid": "endpoint-input-field",
828
+ label: t("neetoWebhooks.webhook.endpoint"),
829
+ name: "endpoint",
830
+ placeholder: t("neetoWebhooks.webhook.endpointPlaceholder"),
831
+ ref: endpointRef,
832
+ resize: "none",
833
+ size: "small"
834
+ }), /*#__PURE__*/jsxs("div", {
835
+ className: "space-y-2",
836
+ children: [/*#__PURE__*/jsxs("div", {
837
+ className: "flex items-center gap-x-2",
838
+ children: [/*#__PURE__*/jsx(Label, {
839
+ children: t("neetoWebhooks.webhook.secret")
840
+ }), /*#__PURE__*/jsx(HelpPopover, {
841
+ helpLinkProps: {
842
+ href: secretsHelpLink
843
+ },
844
+ popoverProps: {
845
+ position: "bottom"
846
+ },
847
+ title: t("neetoWebhooks.webhook.secretkeyHelpTitle"),
848
+ description: t("neetoWebhooks.webhook.secretkeyHelpDescription")
849
+ })]
850
+ }), isSecretInputFieldVisible ? /*#__PURE__*/jsxs("div", {
851
+ className: "flex items-center justify-between space-x-2",
852
+ children: [/*#__PURE__*/jsx(Input, {
853
+ "data-testid": "secret-key-input-field",
854
+ name: "secret",
855
+ placeholder: t("neetoWebhooks.webhook.secretPlaceholder")
856
+ }), /*#__PURE__*/jsx(MoreDropdown, {
857
+ menuItems: [{
858
+ key: "regenerate-secret",
859
+ label: t("neetoWebhooks.buttons.regenerate"),
860
+ "data-testid": "regenerate-secret",
861
+ onClick: function onClick() {
862
+ return handleRegenerate(setFieldValue);
863
+ }
864
+ }, {
865
+ key: "delete-secret",
866
+ label: t("neetoWebhooks.buttons.delete"),
867
+ "data-testid": "delete-secret",
868
+ onClick: function onClick() {
869
+ return handleDelete(setFieldValue);
870
+ }
871
+ }]
872
+ })]
873
+ }) : /*#__PURE__*/jsx(Button, {
874
+ "data-testid": "add-secret-key",
875
+ icon: Plus,
876
+ iconPosition: "left",
877
+ label: t("neetoWebhooks.buttons.generateSecretKey"),
878
+ variant: "link",
879
+ onClick: function onClick() {
880
+ return handleClick(setFieldValue);
881
+ }
882
+ })]
883
+ }), /*#__PURE__*/jsxs("div", {
884
+ className: "space-y-2",
885
+ children: [/*#__PURE__*/jsx(Label, {
886
+ required: true,
887
+ children: t("neetoWebhooks.common.event", PLURAL)
888
+ }), /*#__PURE__*/jsx(FieldArray, {
889
+ name: "events",
890
+ render: function render(arrayHelpers) {
891
+ return /*#__PURE__*/jsx(EventCheckbox, {
892
+ arrayHelpers: arrayHelpers,
893
+ events: events,
894
+ values: values,
895
+ onEventsChange: function onEventsChange() {
896
+ return setFieldTouched("events", true);
897
+ }
898
+ });
899
+ }
900
+ }), /*#__PURE__*/jsx(ErrorMessage, {
901
+ name: "events",
902
+ render: function render(msg) {
903
+ return /*#__PURE__*/jsx(Typography, {
904
+ className: "mt-1",
905
+ color: "destructive",
906
+ "data-testid": "event-error-text",
907
+ variant: "caption",
908
+ children: msg
909
+ });
910
+ }
911
+ })]
912
+ })]
913
+ })
914
+ }), /*#__PURE__*/jsx(Sheet.Footer, {
915
+ children: /*#__PURE__*/jsx(ActionBlock, {
916
+ cancelButtonProps: {
917
+ onClick: onClose
918
+ },
919
+ submitButtonProps: {
920
+ disabled: isWebhookExpiredOrDeprecated || !isValid || editingWebhookId && !dirty
921
+ }
922
+ })
923
+ })]
924
+ })]
925
+ });
926
+ }
927
+ });
928
+ };
929
+
930
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
931
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
932
+ var Header$1 = withT(function (_ref) {
933
+ var t = _ref.t,
934
+ breadcrumbs = _ref.breadcrumbs,
935
+ title = _ref.title,
936
+ titleHelpPopoverProps = _ref.titleHelpPopoverProps,
937
+ setIsAddWebhookPaneOpen = _ref.setIsAddWebhookPaneOpen,
938
+ headerSize = _ref.headerSize,
939
+ webhooks = _ref.webhooks,
940
+ webhooksHelpLink = _ref.webhooksHelpLink;
941
+ return /*#__PURE__*/jsxs(Fragment, {
942
+ children: [/*#__PURE__*/jsx(Header$2, {
943
+ breadcrumbs: breadcrumbs,
944
+ size: headerSize,
945
+ title: title || t("neetoWebhooks.webhook.title"),
946
+ actionBlock: /*#__PURE__*/jsx(Button, {
947
+ "data-testid": "add-new-webhook-button",
948
+ label: t("neetoWebhooks.webhook.add"),
949
+ onClick: function onClick() {
950
+ return setIsAddWebhookPaneOpen(true);
951
+ }
952
+ }),
953
+ titleHelpPopoverProps: _objectSpread({
954
+ description: t("neetoWebhooks.webhook.helpDescription"),
955
+ helpLinkProps: {
956
+ href: webhooksHelpLink
957
+ },
958
+ title: t("neetoWebhooks.webhook.title")
959
+ }, titleHelpPopoverProps)
960
+ }), isNotEmpty(webhooks) && /*#__PURE__*/jsx(SubHeader, {
961
+ leftActionBlock: /*#__PURE__*/jsx(Typography, {
962
+ as: "h6",
963
+ variant: "h6",
964
+ children: t("neetoWebhooks.common.webhookWithCount", {
965
+ count: webhooks.length
966
+ })
967
+ })
968
+ })]
969
+ });
970
+ });
971
+ var Header = /*#__PURE__*/memo(Header$1);
972
+
973
+ var Webhooks$1 = function Webhooks(_ref) {
974
+ var deliveriesPath = _ref.deliveriesPath,
975
+ entityType = _ref.entityType,
976
+ breadcrumbs = _ref.breadcrumbs,
977
+ title = _ref.title,
978
+ titleHelpPopoverProps = _ref.titleHelpPopoverProps,
979
+ entityId = _ref.entityId,
980
+ onCreate = _ref.onCreate,
981
+ onDelete = _ref.onDelete,
982
+ headerSize = _ref.headerSize,
983
+ _ref$containerClassNa = _ref.containerClassName,
984
+ containerClassName = _ref$containerClassNa === void 0 ? "" : _ref$containerClassNa,
985
+ webhooksHelpLink = _ref.webhooksHelpLink,
986
+ secretsHelpLink = _ref.secretsHelpLink;
987
+ var _useState = useState(null),
988
+ _useState2 = _slicedToArray(_useState, 2),
989
+ editingWebhookId = _useState2[0],
990
+ setEditingWebhookId = _useState2[1];
991
+ var _useState3 = useState(null),
992
+ _useState4 = _slicedToArray(_useState3, 2),
993
+ deletingWebhookId = _useState4[0],
994
+ setDeletingWebhookId = _useState4[1];
995
+ var _useState5 = useState(false),
996
+ _useState6 = _slicedToArray(_useState5, 2),
997
+ isAddWebhookPaneOpen = _useState6[0],
998
+ setIsAddWebhookPaneOpen = _useState6[1];
999
+ var _useState7 = useState(false),
1000
+ _useState8 = _slicedToArray(_useState7, 2),
1001
+ isDeleteAlertOpen = _useState8[0],
1002
+ setIsDeleteAlertOpen = _useState8[1];
1003
+ var _useTranslation = useTranslation(),
1004
+ t = _useTranslation.t;
1005
+ var _useQueryParams = useQueryParams(),
1006
+ _useQueryParams$page = _useQueryParams.page,
1007
+ page = _useQueryParams$page === void 0 ? DEFAULT_PAGE_INDEX : _useQueryParams$page;
1008
+ var _useFetchWebhooks = useFetchWebhooks({
1009
+ entityId: entityId,
1010
+ page: page,
1011
+ pageSize: DEFAULT_PAGE_SIZE
1012
+ }),
1013
+ isLoading = _useFetchWebhooks.isLoading,
1014
+ isFetching = _useFetchWebhooks.isFetching,
1015
+ _useFetchWebhooks$dat = _useFetchWebhooks.data,
1016
+ _useFetchWebhooks$dat2 = _useFetchWebhooks$dat === void 0 ? {} : _useFetchWebhooks$dat,
1017
+ _useFetchWebhooks$dat3 = _useFetchWebhooks$dat2.webhooks,
1018
+ webhooks = _useFetchWebhooks$dat3 === void 0 ? [] : _useFetchWebhooks$dat3,
1019
+ _useFetchWebhooks$dat4 = _useFetchWebhooks$dat2.totalCount,
1020
+ totalCount = _useFetchWebhooks$dat4 === void 0 ? 0 : _useFetchWebhooks$dat4;
1021
+ var _useDestroyWebhook = useDestroyWebhook({
1022
+ onSuccess: function onSuccess() {
1023
+ setIsDeleteAlertOpen(false);
1024
+ onDelete === null || onDelete === void 0 || onDelete();
1025
+ }
1026
+ }),
1027
+ isDeleting = _useDestroyWebhook.isPending,
1028
+ destroyWebhook = _useDestroyWebhook.mutate;
1029
+ var handlePaneClose = function handlePaneClose() {
1030
+ setEditingWebhookId(null);
1031
+ setIsAddWebhookPaneOpen(false);
1032
+ };
1033
+ var handleEdit = useCallback(function (id) {
1034
+ setEditingWebhookId(id);
1035
+ setIsAddWebhookPaneOpen(true);
1036
+ }, []);
1037
+ var handleDelete = useCallback(function (id) {
1038
+ setDeletingWebhookId(id);
1039
+ setIsDeleteAlertOpen(true);
1040
+ }, []);
1041
+ if (isLoading) {
1042
+ return /*#__PURE__*/jsx("div", {
1043
+ className: "flex justify-center items-center w-full h-screen",
1044
+ children: /*#__PURE__*/jsx(Spinner, {})
1045
+ });
1046
+ }
1047
+ return /*#__PURE__*/jsxs(Container, {
1048
+ className: containerClassName,
1049
+ children: [/*#__PURE__*/jsx(Header, {
1050
+ breadcrumbs: breadcrumbs,
1051
+ headerSize: headerSize,
1052
+ setIsAddWebhookPaneOpen: setIsAddWebhookPaneOpen,
1053
+ title: title,
1054
+ titleHelpPopoverProps: titleHelpPopoverProps,
1055
+ webhooks: webhooks,
1056
+ webhooksHelpLink: webhooksHelpLink
1057
+ }), isNotEmpty(webhooks) ? /*#__PURE__*/jsx(TableWrapper, {
1058
+ hasPagination: totalCount > DEFAULT_PAGE_SIZE,
1059
+ children: /*#__PURE__*/jsx(DataTable, {
1060
+ totalCount: totalCount,
1061
+ currentPage: Number(page),
1062
+ data: webhooks,
1063
+ loading: isFetching,
1064
+ pageSize: DEFAULT_PAGE_SIZE,
1065
+ columns: buildColumns({
1066
+ handleDelete: handleDelete,
1067
+ handleEdit: handleEdit,
1068
+ deliveriesPath: deliveriesPath
1069
+ })
1070
+ })
1071
+ }) : /*#__PURE__*/jsx("div", {
1072
+ className: "flex justify-center items-center w-full h-full",
1073
+ children: /*#__PURE__*/jsx(Empty, {
1074
+ icon: Webhook,
1075
+ title: t("neetoWebhooks.webhook.empty"),
1076
+ description: /*#__PURE__*/jsx(Button, {
1077
+ href: webhooksHelpLink,
1078
+ label: t("neetoWebhooks.webhook.emptyHelpText"),
1079
+ rel: "noreferrer",
1080
+ target: "_blank",
1081
+ variant: "link"
1082
+ }),
1083
+ primaryButtonProps: {
1084
+ label: t("neetoWebhooks.webhook.add"),
1085
+ onClick: function onClick() {
1086
+ return setIsAddWebhookPaneOpen(true);
1087
+ }
1088
+ }
1089
+ })
1090
+ }), /*#__PURE__*/jsx(AddWebhookPane, {
1091
+ editingWebhookId: editingWebhookId,
1092
+ entityId: entityId,
1093
+ entityType: entityType,
1094
+ onCreate: onCreate,
1095
+ secretsHelpLink: secretsHelpLink,
1096
+ webhooks: webhooks,
1097
+ webhooksHelpLink: webhooksHelpLink,
1098
+ isOpen: isAddWebhookPaneOpen,
1099
+ onClose: handlePaneClose
1100
+ }), /*#__PURE__*/jsx(Alert, {
1101
+ isOpen: isDeleteAlertOpen,
1102
+ isSubmitting: isDeleting,
1103
+ submitButtonLabel: t("neetoWebhooks.buttons.delete"),
1104
+ message: t("neetoWebhooks.alert.delete.message", {
1105
+ entity: t("neetoWebhooks.entity.webhook")
1106
+ }),
1107
+ title: t("neetoWebhooks.alert.delete.title", {
1108
+ entity: t("neetoWebhooks.entity.webhook")
1109
+ }),
1110
+ onClose: function onClose() {
1111
+ return setIsDeleteAlertOpen(false);
1112
+ },
1113
+ onSubmit: function onSubmit() {
1114
+ return destroyWebhook(deletingWebhookId, {
1115
+ entityId: entityId
1116
+ });
1117
+ }
1118
+ })]
1119
+ });
1120
+ };
1121
+ var Webhooks = withReactQuery(Webhooks$1);
1122
+
1123
+ var NeetoWebhooks = function NeetoWebhooks(_ref) {
1124
+ var entityType = _ref.entityType,
1125
+ entityId = _ref.entityId,
1126
+ _ref$breadcrumbs = _ref.breadcrumbs,
1127
+ breadcrumbs = _ref$breadcrumbs === void 0 ? [] : _ref$breadcrumbs,
1128
+ title = _ref.title,
1129
+ titleHelpPopoverProps = _ref.titleHelpPopoverProps,
1130
+ onCreate = _ref.onCreate,
1131
+ onDelete = _ref.onDelete,
1132
+ headerSize = _ref.headerSize,
1133
+ containerClassName = _ref.containerClassName,
1134
+ _ref$helpLinkUrls = _ref.helpLinkUrls,
1135
+ helpLinkUrls = _ref$helpLinkUrls === void 0 ? {} : _ref$helpLinkUrls;
1136
+ var _useRouteMatch = useRouteMatch(),
1137
+ webhooksPath = _useRouteMatch.path,
1138
+ webhooksUrl = _useRouteMatch.url;
1139
+ var deliveriesPath = getDeliveriesPath(webhooksUrl);
1140
+ var deliveryDetailsPath = getDeliveryDetailsPath(deliveriesPath);
1141
+ var helpLinks = mergeRight(HELP_LINK_URLS, helpLinkUrls);
1142
+ return /*#__PURE__*/jsxs(Switch$1, {
1143
+ children: [/*#__PURE__*/jsx(Route, {
1144
+ exact: true,
1145
+ path: webhooksPath,
1146
+ component: function component() {
1147
+ return /*#__PURE__*/jsx(Webhooks, {
1148
+ breadcrumbs: breadcrumbs,
1149
+ containerClassName: containerClassName,
1150
+ deliveriesPath: deliveriesPath,
1151
+ entityId: entityId,
1152
+ entityType: entityType,
1153
+ headerSize: headerSize,
1154
+ onCreate: onCreate,
1155
+ onDelete: onDelete,
1156
+ title: title,
1157
+ titleHelpPopoverProps: titleHelpPopoverProps,
1158
+ secretsHelpLink: helpLinks.secrets,
1159
+ webhooksHelpLink: helpLinks.webhooks
1160
+ });
1161
+ }
1162
+ }), /*#__PURE__*/jsx(Route, {
1163
+ exact: true,
1164
+ path: deliveryDetailsPath,
1165
+ render: function render() {
1166
+ return /*#__PURE__*/jsx(Deliveries, {
1167
+ breadcrumbs: breadcrumbs,
1168
+ webhooksUrl: webhooksUrl,
1169
+ helpLink: helpLinks.deliveries
1170
+ });
1171
+ }
1172
+ }), /*#__PURE__*/jsx(Route, {
1173
+ path: deliveriesPath,
1174
+ render: function render() {
1175
+ return /*#__PURE__*/jsx(Deliveries, {
1176
+ breadcrumbs: breadcrumbs,
1177
+ webhooksUrl: webhooksUrl,
1178
+ helpLink: helpLinks.deliveries
1179
+ });
1180
+ }
1181
+ })]
1182
+ });
1183
+ };
1184
+
1185
+ export { NeetoWebhooks as default };
1186
+ //# sourceMappingURL=NeetoWebhooks.js.map