@bigbinary/neeto-webhooks-frontend 1.6.8 → 1.6.10

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/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import React, { useState, useRef, useCallback } from 'react';
1
+ import React, { useState, useRef, useEffect, useCallback } from 'react';
2
2
  import { useParams, useRouteMatch, Switch as Switch$1, Route } from 'react-router-dom';
3
3
  import { isPresent, removeBy, isNotEmpty, removeById, findBy } from '@bigbinary/neeto-cist';
4
4
  import { DEFAULT_STALE_TIME, SINGULAR, DEFAULT_PAGE_SIZE, PLURAL } from '@bigbinary/neeto-commons-frontend/constants';
@@ -14,10 +14,10 @@ import axios from 'axios';
14
14
  import DateFormat from '@bigbinary/neeto-molecules/DateFormat';
15
15
  import { t as t$1 } from 'i18next';
16
16
  import { prop, pluck, assoc } from 'ramda';
17
- import { Info } from '@bigbinary/neeto-icons';
17
+ import { Info, Plus } from '@bigbinary/neeto-icons';
18
+ import MoreDropdown from '@bigbinary/neeto-molecules/MoreDropdown';
18
19
  import { Form, Textarea, Select, Input, Switch, ActionBlock } from '@bigbinary/neetoui/formik';
19
20
  import { buildUrl } from '@bigbinary/neeto-commons-frontend/utils';
20
- import MoreDropdown from '@bigbinary/neeto-molecules/MoreDropdown';
21
21
  import * as yup from 'yup';
22
22
 
23
23
  var getDeliveriesPath = function getDeliveriesPath(webhooksPath) {
@@ -980,7 +980,73 @@ var useFetchEvents = function useFetchEvents() {
980
980
  });
981
981
  };
982
982
 
983
- var WEBHOOK_HELP_URL = "https://help.neetocal.com/articles/webhook";
983
+ var WEBHOOK_HELP_URL = "https://neetocalhelp.neetokb.com/p/a-4bb6c2a2";
984
+ var WEBHOOK_SECRETS_HELP_URL = "https://neetocalhelp.neetokb.com/p/a-80de90bd";
985
+
986
+ // Unique ID creation requires a high quality random # generator. In the browser we therefore
987
+ // require the crypto API and do not support built-in fallback to lower quality random number
988
+ // generators (like Math.random()).
989
+ let getRandomValues;
990
+ const rnds8 = new Uint8Array(16);
991
+ function rng() {
992
+ // lazy load so that environments that need to polyfill have a chance to do so
993
+ if (!getRandomValues) {
994
+ // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
995
+ getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
996
+
997
+ if (!getRandomValues) {
998
+ throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
999
+ }
1000
+ }
1001
+
1002
+ return getRandomValues(rnds8);
1003
+ }
1004
+
1005
+ /**
1006
+ * Convert array of 16 byte values to UUID string format of the form:
1007
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
1008
+ */
1009
+
1010
+ const byteToHex = [];
1011
+
1012
+ for (let i = 0; i < 256; ++i) {
1013
+ byteToHex.push((i + 0x100).toString(16).slice(1));
1014
+ }
1015
+
1016
+ function unsafeStringify(arr, offset = 0) {
1017
+ // Note: Be careful editing this code! It's been tuned for performance
1018
+ // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
1019
+ return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
1020
+ }
1021
+
1022
+ const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
1023
+ var native = {
1024
+ randomUUID
1025
+ };
1026
+
1027
+ function v4(options, buf, offset) {
1028
+ if (native.randomUUID && !buf && !options) {
1029
+ return native.randomUUID();
1030
+ }
1031
+
1032
+ options = options || {};
1033
+ const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
1034
+
1035
+ rnds[6] = rnds[6] & 0x0f | 0x40;
1036
+ rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
1037
+
1038
+ if (buf) {
1039
+ offset = offset || 0;
1040
+
1041
+ for (let i = 0; i < 16; ++i) {
1042
+ buf[offset + i] = rnds[i];
1043
+ }
1044
+
1045
+ return buf;
1046
+ }
1047
+
1048
+ return unsafeStringify(rnds);
1049
+ }
984
1050
 
985
1051
  var MENU_ITEMS = {
986
1052
  EDIT: "edit",
@@ -1090,6 +1156,9 @@ var buildColumns = function buildColumns(_ref6) {
1090
1156
  width: 400
1091
1157
  }];
1092
1158
  };
1159
+ var generateRandomSecret = function generateRandomSecret() {
1160
+ return v4().replace(/-/g, "");
1161
+ };
1093
1162
 
1094
1163
  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; }
1095
1164
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).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; }
@@ -1103,6 +1172,10 @@ var AddWebhookPane = function AddWebhookPane(_ref) {
1103
1172
  webhooks = _ref.webhooks;
1104
1173
  var _useTranslation = useTranslation(),
1105
1174
  t = _useTranslation.t;
1175
+ var _useState = useState(false),
1176
+ _useState2 = _slicedToArray(_useState, 2),
1177
+ isSecretInputFieldVisible = _useState2[0],
1178
+ setIsSecretInputFieldVisible = _useState2[1];
1106
1179
  var _useCreateWebhook = useCreateWebhook({
1107
1180
  onSuccess: function onSuccess() {
1108
1181
  onClose();
@@ -1143,6 +1216,24 @@ var AddWebhookPane = function AddWebhookPane(_ref) {
1143
1216
  entityType: entityType
1144
1217
  }));
1145
1218
  };
1219
+ var handleClick = function handleClick(setFieldValue) {
1220
+ var randomWebhookSecret = generateRandomSecret();
1221
+ setFieldValue("secret", randomWebhookSecret);
1222
+ setIsSecretInputFieldVisible(true);
1223
+ };
1224
+ var handleRegenerate = function handleRegenerate(setFieldValue) {
1225
+ var randomWebhookSecret = generateRandomSecret();
1226
+ setFieldValue("secret", randomWebhookSecret);
1227
+ };
1228
+ var handleDelete = function handleDelete(setFieldValue) {
1229
+ setFieldValue("secret", null);
1230
+ setIsSecretInputFieldVisible(false);
1231
+ };
1232
+ useEffect(function () {
1233
+ if (webhook !== null && webhook !== void 0 && webhook.secret) {
1234
+ setIsSecretInputFieldVisible(true);
1235
+ }
1236
+ }, [webhook]);
1146
1237
  return /*#__PURE__*/React.createElement(Pane, {
1147
1238
  isOpen: isOpen,
1148
1239
  onClose: onClose,
@@ -1172,7 +1263,8 @@ var AddWebhookPane = function AddWebhookPane(_ref) {
1172
1263
  }, function (_ref2) {
1173
1264
  var dirty = _ref2.dirty,
1174
1265
  isSubmitting = _ref2.isSubmitting,
1175
- isValid = _ref2.isValid;
1266
+ isValid = _ref2.isValid,
1267
+ setFieldValue = _ref2.setFieldValue;
1176
1268
  return isLoading ? /*#__PURE__*/React.createElement("div", {
1177
1269
  className: "flex items-center justify-center"
1178
1270
  }, /*#__PURE__*/React.createElement(Spinner, null)) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Pane.Body, null, /*#__PURE__*/React.createElement("div", {
@@ -1194,15 +1286,16 @@ var AddWebhookPane = function AddWebhookPane(_ref) {
1194
1286
  name: "events",
1195
1287
  options: events,
1196
1288
  placeholder: t("neetoWebhooks.webhook.eventPlaceholder")
1197
- }), /*#__PURE__*/React.createElement(Input, {
1289
+ }), isSecretInputFieldVisible && /*#__PURE__*/React.createElement("div", {
1290
+ className: "flex items-center justify-between space-x-3"
1291
+ }, /*#__PURE__*/React.createElement(Input, {
1198
1292
  "data-cy": "secret-key-input-field",
1199
1293
  name: "secret",
1200
- placeholder: t("neetoWebhooks.webhook.secretPlaceholder"),
1201
1294
  label: /*#__PURE__*/React.createElement(Trans, {
1202
1295
  i18nKey: "neetoWebhooks.webhook.secret",
1203
1296
  components: {
1204
1297
  helpLink: /*#__PURE__*/React.createElement("a", {
1205
- href: WEBHOOK_HELP_URL,
1298
+ href: WEBHOOK_SECRETS_HELP_URL,
1206
1299
  rel: "noreferrer",
1207
1300
  target: "_blank"
1208
1301
  }),
@@ -1211,10 +1304,37 @@ var AddWebhookPane = function AddWebhookPane(_ref) {
1211
1304
  size: 20
1212
1305
  })
1213
1306
  }
1214
- })
1215
- }), /*#__PURE__*/React.createElement(Switch, {
1307
+ }),
1308
+ placeholder: t("neetoWebhooks.webhook.secretPlaceholder")
1309
+ }), /*#__PURE__*/React.createElement("div", {
1310
+ className: "mt-6"
1311
+ }, /*#__PURE__*/React.createElement(MoreDropdown, {
1312
+ menuItems: [{
1313
+ key: "regenerate-secret",
1314
+ label: t("neetoWebhooks.buttons.regenerate"),
1315
+ "data-cy": "regenerate-secret",
1316
+ onClick: function onClick() {
1317
+ return handleRegenerate(setFieldValue);
1318
+ }
1319
+ }, {
1320
+ key: "delete-secret",
1321
+ label: t("neetoWebhooks.buttons.delete"),
1322
+ "data-cy": "delete-secret",
1323
+ onClick: function onClick() {
1324
+ return handleDelete(setFieldValue);
1325
+ }
1326
+ }]
1327
+ }))), /*#__PURE__*/React.createElement(Switch, {
1216
1328
  label: t("neetoWebhooks.webhook.active"),
1217
1329
  name: "isActive"
1330
+ }), !isSecretInputFieldVisible && /*#__PURE__*/React.createElement(Button, {
1331
+ "data-cy": "add-secret-key",
1332
+ icon: Plus,
1333
+ label: t("neetoWebhooks.buttons.addSecretKey"),
1334
+ style: "text",
1335
+ onClick: function onClick() {
1336
+ return handleClick(setFieldValue);
1337
+ }
1218
1338
  }))), /*#__PURE__*/React.createElement(Pane.Footer, {
1219
1339
  className: "flex gap-2"
1220
1340
  }, /*#__PURE__*/React.createElement(ActionBlock, {