@webiny/app-record-locking 5.43.2 → 6.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/components/HeadlessCmsActionsAcoCell.js +46 -57
  2. package/components/HeadlessCmsActionsAcoCell.js.map +1 -1
  3. package/components/HeadlessCmsContentEntry/ContentEntryGuard.js +22 -29
  4. package/components/HeadlessCmsContentEntry/ContentEntryGuard.js.map +1 -1
  5. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js +43 -60
  6. package/components/HeadlessCmsContentEntry/ContentEntryLocker.js.map +1 -1
  7. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js +54 -67
  8. package/components/HeadlessCmsContentEntry/HeadlessCmsContentEntry.js.map +1 -1
  9. package/components/HeadlessCmsContentEntry/index.js +1 -16
  10. package/components/HeadlessCmsContentEntry/index.js.map +1 -1
  11. package/components/LockedRecord/LockedRecord.js +49 -144
  12. package/components/LockedRecord/LockedRecord.js.map +1 -1
  13. package/components/LockedRecord/LockedRecordForceUnlock.js +51 -93
  14. package/components/LockedRecord/LockedRecordForceUnlock.js.map +1 -1
  15. package/components/LockedRecord/index.js +1 -16
  16. package/components/LockedRecord/index.js.map +1 -1
  17. package/components/RecordLockingProvider.js +47 -67
  18. package/components/RecordLockingProvider.js.map +1 -1
  19. package/components/decorators/UseContentEntriesListHookDecorator.js +10 -17
  20. package/components/decorators/UseContentEntriesListHookDecorator.js.map +1 -1
  21. package/components/decorators/UseRecordsDecorator.js +11 -16
  22. package/components/decorators/UseRecordsDecorator.js.map +1 -1
  23. package/components/decorators/UseSaveEntryDecorator.js +34 -32
  24. package/components/decorators/UseSaveEntryDecorator.js.map +1 -1
  25. package/components/permissionRenderer/RecordLockingPermissions.js +39 -53
  26. package/components/permissionRenderer/RecordLockingPermissions.js.map +1 -1
  27. package/components/permissionRenderer/index.js +13 -17
  28. package/components/permissionRenderer/index.js.map +1 -1
  29. package/domain/RecordLocking.js +271 -311
  30. package/domain/RecordLocking.js.map +1 -1
  31. package/domain/RecordLockingClient.js +15 -29
  32. package/domain/RecordLockingClient.js.map +1 -1
  33. package/domain/RecordLockingGetLockRecord.js +16 -29
  34. package/domain/RecordLockingGetLockRecord.js.map +1 -1
  35. package/domain/RecordLockingGetLockedEntryLockRecord.js +14 -27
  36. package/domain/RecordLockingGetLockedEntryLockRecord.js.map +1 -1
  37. package/domain/RecordLockingIsEntryLocked.js +14 -27
  38. package/domain/RecordLockingIsEntryLocked.js.map +1 -1
  39. package/domain/RecordLockingListLockRecords.js +26 -37
  40. package/domain/RecordLockingListLockRecords.js.map +1 -1
  41. package/domain/RecordLockingLockEntry.js +9 -22
  42. package/domain/RecordLockingLockEntry.js.map +1 -1
  43. package/domain/RecordLockingUnlockEntry.js +14 -27
  44. package/domain/RecordLockingUnlockEntry.js.map +1 -1
  45. package/domain/RecordLockingUpdateEntryLock.js +14 -27
  46. package/domain/RecordLockingUpdateEntryLock.js.map +1 -1
  47. package/domain/abstractions/IRecordLocking.js +1 -5
  48. package/domain/abstractions/IRecordLockingClient.js +1 -5
  49. package/domain/abstractions/IRecordLockingGetLockRecord.js +1 -5
  50. package/domain/abstractions/IRecordLockingGetLockedEntryLockRecord.js +1 -5
  51. package/domain/abstractions/IRecordLockingIsEntryLocked.js +1 -5
  52. package/domain/abstractions/IRecordLockingListLockRecords.js +1 -5
  53. package/domain/abstractions/IRecordLockingLockEntry.js +1 -5
  54. package/domain/abstractions/IRecordLockingUnlockEntry.js +1 -5
  55. package/domain/abstractions/IRecordLockingUpdateEntryLock.js +1 -5
  56. package/domain/graphql/fields.js +28 -8
  57. package/domain/graphql/fields.js.map +1 -1
  58. package/domain/graphql/getLockRecord.js +16 -12
  59. package/domain/graphql/getLockRecord.js.map +1 -1
  60. package/domain/graphql/getLockedEntryLockRecord.js +16 -12
  61. package/domain/graphql/getLockedEntryLockRecord.js.map +1 -1
  62. package/domain/graphql/isEntryLocked.js +14 -12
  63. package/domain/graphql/isEntryLocked.js.map +1 -1
  64. package/domain/graphql/listLockRecords.js +23 -14
  65. package/domain/graphql/listLockRecords.js.map +1 -1
  66. package/domain/graphql/lockEntry.js +17 -13
  67. package/domain/graphql/lockEntry.js.map +1 -1
  68. package/domain/graphql/unlockEntry.js +16 -12
  69. package/domain/graphql/unlockEntry.js.map +1 -1
  70. package/domain/graphql/updateEntryLock.js +16 -12
  71. package/domain/graphql/updateEntryLock.js.map +1 -1
  72. package/domain/utils/createRecordLockingClient.js +6 -12
  73. package/domain/utils/createRecordLockingClient.js.map +1 -1
  74. package/domain/utils/createRecordLockingError.js +1 -7
  75. package/domain/utils/createRecordLockingError.js.map +1 -1
  76. package/hooks/index.js +2 -27
  77. package/hooks/index.js.map +1 -1
  78. package/hooks/usePermission.js +11 -16
  79. package/hooks/usePermission.js.map +1 -1
  80. package/hooks/useRecordLocking.js +6 -12
  81. package/hooks/useRecordLocking.js.map +1 -1
  82. package/index.js +20 -50
  83. package/index.js.map +1 -1
  84. package/package.json +17 -18
  85. package/types.js +1 -5
  86. package/utils/createCacheKey.js +5 -11
  87. package/utils/createCacheKey.js.map +1 -1
  88. package/components/assets/lock.svg +0 -13
@@ -1,71 +1,60 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.HeadlessCmsActionsAcoCell = void 0;
8
- var _base = _interopRequireDefault(require("@emotion/styled/base"));
9
- var _react = _interopRequireDefault(require("react"));
10
- var _appHeadlessCms = require("@webiny/app-headless-cms");
11
- var _lock = require("@material-design-icons/svg/round/lock.svg");
12
- var _Tooltip = require("@webiny/ui/Tooltip");
13
- var _hooks = require("../hooks");
14
- var _UseContentEntriesListHookDecorator = require("./decorators/UseContentEntriesListHookDecorator");
15
- var _UseSaveEntryDecorator = require("./decorators/UseSaveEntryDecorator");
16
- var _UseRecordsDecorator = require("./decorators/UseRecordsDecorator");
17
- function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
18
- var CenterAlignment = /*#__PURE__*/(0, _base.default)("div", process.env.NODE_ENV === "production" ? {
19
- target: "e1qmlafx0"
20
- } : {
21
- target: "e1qmlafx0",
22
- label: "CenterAlignment"
23
- })(process.env.NODE_ENV === "production" ? {
24
- name: "dmikdp",
25
- styles: "display:block;margin:0 auto;width:28px;svg{fill:var(--mdc-theme-text-secondary-on-background);}"
26
- } : {
27
- name: "dmikdp",
28
- styles: "display:block;margin:0 auto;width:28px;svg{fill:var(--mdc-theme-text-secondary-on-background);}",
29
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkhlYWRsZXNzQ21zQWN0aW9uc0Fjb0NlbGwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVrQyIsImZpbGUiOiJIZWFkbGVzc0Ntc0FjdGlvbnNBY29DZWxsLnRzeCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENvbnRlbnRFbnRyeUxpc3RDb25maWcsIHVzZU1vZGVsIH0gZnJvbSBcIkB3ZWJpbnkvYXBwLWhlYWRsZXNzLWNtc1wiO1xuaW1wb3J0IHsgUmVhY3RDb21wb25lbnQgYXMgTG9ja2VkSWNvbiB9IGZyb20gXCJAbWF0ZXJpYWwtZGVzaWduLWljb25zL3N2Zy9yb3VuZC9sb2NrLnN2Z1wiO1xuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gXCJAd2ViaW55L3VpL1Rvb2x0aXBcIjtcbmltcG9ydCB7IHVzZVJlY29yZExvY2tpbmcgfSBmcm9tIFwifi9ob29rc1wiO1xuaW1wb3J0IHsgVXNlQ29udGVudEVudHJpZXNMaXN0SG9va0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvVXNlQ29udGVudEVudHJpZXNMaXN0SG9va0RlY29yYXRvclwiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwiQGVtb3Rpb24vc3R5bGVkXCI7XG5pbXBvcnQgeyBVc2VTYXZlRW50cnlEZWNvcmF0b3IgfSBmcm9tIFwifi9jb21wb25lbnRzL2RlY29yYXRvcnMvVXNlU2F2ZUVudHJ5RGVjb3JhdG9yXCI7XG5pbXBvcnQgeyBVc2VSZWNvcmRzRGVjb3JhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy9Vc2VSZWNvcmRzRGVjb3JhdG9yXCI7XG5cbmNvbnN0IENlbnRlckFsaWdubWVudCA9IHN0eWxlZC5kaXZgXG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgc3ZnIHtcbiAgICAgICAgZmlsbDogdmFyKC0tbWRjLXRoZW1lLXRleHQtc2Vjb25kYXJ5LW9uLWJhY2tncm91bmQpO1xuICAgIH1cbmA7XG5cbmNvbnN0IHsgQnJvd3NlciB9ID0gQ29udGVudEVudHJ5TGlzdENvbmZpZztcblxuaW50ZXJmYWNlIEFjdGlvbnNDZWxsUHJvcHMge1xuICAgIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbmNvbnN0IEFjdGlvbnNDZWxsID0gKHsgY2hpbGRyZW4gfTogQWN0aW9uc0NlbGxQcm9wcykgPT4ge1xuICAgIGNvbnN0IHsgbW9kZWwgfSA9IHVzZU1vZGVsKCk7XG4gICAgY29uc3QgeyBnZXRMb2NrUmVjb3JkRW50cnksIGlzUmVjb3JkTG9ja2VkIH0gPSB1c2VSZWNvcmRMb2NraW5nKCk7XG5cbiAgICBjb25zdCB7IHVzZVRhYmxlUm93LCBpc0ZvbGRlclJvdyB9ID0gQnJvd3Nlci5UYWJsZS5Db2x1bW47XG4gICAgY29uc3QgeyByb3cgfSA9IHVzZVRhYmxlUm93KCk7XG5cbiAgICBpZiAoaXNGb2xkZXJSb3cocm93KSkge1xuICAgICAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5ID0gZ2V0TG9ja1JlY29yZEVudHJ5KHJvdy5pZCk7XG5cbiAgICBpZiAoIWlzUmVjb3JkTG9ja2VkKGVudHJ5KSB8fCAhZW50cnk/LiRsb2NrZWQpIHtcbiAgICAgICAgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgICAgPENlbnRlckFsaWdubWVudD5cbiAgICAgICAgICAgIDxUb29sdGlwXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PXtcImxlZnRcIn1cbiAgICAgICAgICAgICAgICBjb250ZW50PXtgVGhpcyAke21vZGVsLm5hbWV9IGlzIGN1cnJlbnRseSBsb2NrZWQgYnkgJHtlbnRyeS4kbG9ja2VkLmxvY2tlZEJ5LmRpc3BsYXlOYW1lfS5gfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxMb2NrZWRJY29uIC8+XG4gICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgIDwvQ2VudGVyQWxpZ25tZW50PlxuICAgICk7XG59O1xuXG5jb25zdCBSZWNvcmRMb2NraW5nQ2VsbEFjdGlvbnMgPSBCcm93c2VyLlRhYmxlLkNvbHVtbi5jcmVhdGVEZWNvcmF0b3IoT3JpZ2luYWwgPT4ge1xuICAgIHJldHVybiBmdW5jdGlvbiBSZWNvcmRMb2NraW5nQ2VsbEFjdGlvbnMocHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzLm5hbWUgPT09IFwiYWN0aW9uc1wiICYmIHByb3BzLmNlbGwpIHtcbiAgICAgICAgICAgIHJldHVybiA8T3JpZ2luYWwgey4uLnByb3BzfSBjZWxsPXs8QWN0aW9uc0NlbGw+e3Byb3BzLmNlbGx9PC9BY3Rpb25zQ2VsbD59IC8+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDxPcmlnaW5hbCB7Li4ucHJvcHN9IC8+O1xuICAgIH07XG59KTtcblxuZXhwb3J0IGNvbnN0IEhlYWRsZXNzQ21zQWN0aW9uc0Fjb0NlbGwgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIDxVc2VDb250ZW50RW50cmllc0xpc3RIb29rRGVjb3JhdG9yIC8+XG4gICAgICAgICAgICA8VXNlU2F2ZUVudHJ5RGVjb3JhdG9yIC8+XG4gICAgICAgICAgICA8UmVjb3JkTG9ja2luZ0NlbGxBY3Rpb25zIC8+XG4gICAgICAgICAgICA8VXNlUmVjb3Jkc0RlY29yYXRvciAvPlxuICAgICAgICA8Lz5cbiAgICApO1xufTtcbiJdfQ== */",
30
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
31
- });
32
- var Browser = _appHeadlessCms.ContentEntryListConfig.Browser;
33
- var ActionsCell = function ActionsCell(_ref) {
34
- var children = _ref.children;
35
- var _useModel = (0, _appHeadlessCms.useModel)(),
36
- model = _useModel.model;
37
- var _useRecordLocking = (0, _hooks.useRecordLocking)(),
38
- getLockRecordEntry = _useRecordLocking.getLockRecordEntry,
39
- isRecordLocked = _useRecordLocking.isRecordLocked;
40
- var _Browser$Table$Column = Browser.Table.Column,
41
- useTableRow = _Browser$Table$Column.useTableRow,
42
- isFolderRow = _Browser$Table$Column.isFolderRow;
43
- var _useTableRow = useTableRow(),
44
- row = _useTableRow.row;
1
+ import React from "react";
2
+ import { ContentEntryListConfig, useModel } from "@webiny/app-headless-cms";
3
+ import { ReactComponent as LockedIcon } from "@webiny/icons/lock.svg";
4
+ import { useRecordLocking } from "../hooks";
5
+ import { UseContentEntriesListHookDecorator } from "./decorators/UseContentEntriesListHookDecorator";
6
+ import { UseSaveEntryDecorator } from "./decorators/UseSaveEntryDecorator";
7
+ import { UseRecordsDecorator } from "./decorators/UseRecordsDecorator";
8
+ import { Icon, Tooltip } from "@webiny/admin-ui";
9
+ const {
10
+ Browser
11
+ } = ContentEntryListConfig;
12
+ const ActionsCell = ({
13
+ children
14
+ }) => {
15
+ const {
16
+ model
17
+ } = useModel();
18
+ const {
19
+ getLockRecordEntry,
20
+ isRecordLocked
21
+ } = useRecordLocking();
22
+ const {
23
+ useTableRow,
24
+ isFolderRow
25
+ } = Browser.Table.Column;
26
+ const {
27
+ row
28
+ } = useTableRow();
45
29
  if (isFolderRow(row)) {
46
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
30
+ return /*#__PURE__*/React.createElement(React.Fragment, null, children);
47
31
  }
48
- var entry = getLockRecordEntry(row.id);
32
+ const entry = getLockRecordEntry(row.id);
49
33
  if (!isRecordLocked(entry) || !entry?.$locked) {
50
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
34
+ return /*#__PURE__*/React.createElement(React.Fragment, null, children);
51
35
  }
52
- return /*#__PURE__*/_react.default.createElement(CenterAlignment, null, /*#__PURE__*/_react.default.createElement(_Tooltip.Tooltip, {
53
- placement: "left",
54
- content: "This ".concat(model.name, " is currently locked by ").concat(entry.$locked.lockedBy.displayName, ".")
55
- }, /*#__PURE__*/_react.default.createElement(_lock.ReactComponent, null)));
36
+ return /*#__PURE__*/React.createElement(Tooltip, {
37
+ side: "left",
38
+ content: `This ${model.name} is currently locked by ${entry.$locked.lockedBy.displayName}.`,
39
+ trigger: /*#__PURE__*/React.createElement(Icon, {
40
+ icon: /*#__PURE__*/React.createElement(LockedIcon, null),
41
+ label: "Locked entry",
42
+ color: "neutral-light"
43
+ })
44
+ });
56
45
  };
57
- var RecordLockingCellActions = Browser.Table.Column.createDecorator(function (Original) {
46
+ const RecordLockingCellActions = Browser.Table.Column.createDecorator(Original => {
58
47
  return function RecordLockingCellActions(props) {
59
48
  if (props.name === "actions" && props.cell) {
60
- return /*#__PURE__*/_react.default.createElement(Original, Object.assign({}, props, {
61
- cell: /*#__PURE__*/_react.default.createElement(ActionsCell, null, props.cell)
49
+ return /*#__PURE__*/React.createElement(Original, Object.assign({}, props, {
50
+ cell: /*#__PURE__*/React.createElement(ActionsCell, null, props.cell)
62
51
  }));
63
52
  }
64
- return /*#__PURE__*/_react.default.createElement(Original, props);
53
+ return /*#__PURE__*/React.createElement(Original, props);
65
54
  };
66
55
  });
67
- var HeadlessCmsActionsAcoCell = exports.HeadlessCmsActionsAcoCell = function HeadlessCmsActionsAcoCell() {
68
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_UseContentEntriesListHookDecorator.UseContentEntriesListHookDecorator, null), /*#__PURE__*/_react.default.createElement(_UseSaveEntryDecorator.UseSaveEntryDecorator, null), /*#__PURE__*/_react.default.createElement(RecordLockingCellActions, null), /*#__PURE__*/_react.default.createElement(_UseRecordsDecorator.UseRecordsDecorator, null));
56
+ export const HeadlessCmsActionsAcoCell = () => {
57
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(UseContentEntriesListHookDecorator, null), /*#__PURE__*/React.createElement(UseSaveEntryDecorator, null), /*#__PURE__*/React.createElement(RecordLockingCellActions, null), /*#__PURE__*/React.createElement(UseRecordsDecorator, null));
69
58
  };
70
59
 
71
60
  //# sourceMappingURL=HeadlessCmsActionsAcoCell.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_appHeadlessCms","_lock","_Tooltip","_hooks","_UseContentEntriesListHookDecorator","_UseSaveEntryDecorator","_UseRecordsDecorator","_EMOTION_STRINGIFIED_CSS_ERROR__","CenterAlignment","_base","default","process","env","NODE_ENV","target","label","name","styles","map","toString","Browser","ContentEntryListConfig","ActionsCell","_ref","children","_useModel","useModel","model","_useRecordLocking","useRecordLocking","getLockRecordEntry","isRecordLocked","_Browser$Table$Column","Table","Column","useTableRow","isFolderRow","_useTableRow","row","createElement","Fragment","entry","id","$locked","Tooltip","placement","content","concat","lockedBy","displayName","ReactComponent","RecordLockingCellActions","createDecorator","Original","props","cell","Object","assign","HeadlessCmsActionsAcoCell","exports","UseContentEntriesListHookDecorator","UseSaveEntryDecorator","UseRecordsDecorator"],"sources":["HeadlessCmsActionsAcoCell.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryListConfig, useModel } from \"@webiny/app-headless-cms\";\nimport { ReactComponent as LockedIcon } from \"@material-design-icons/svg/round/lock.svg\";\nimport { Tooltip } from \"@webiny/ui/Tooltip\";\nimport { useRecordLocking } from \"~/hooks\";\nimport { UseContentEntriesListHookDecorator } from \"./decorators/UseContentEntriesListHookDecorator\";\nimport styled from \"@emotion/styled\";\nimport { UseSaveEntryDecorator } from \"~/components/decorators/UseSaveEntryDecorator\";\nimport { UseRecordsDecorator } from \"./decorators/UseRecordsDecorator\";\n\nconst CenterAlignment = styled.div`\n display: block;\n margin: 0 auto;\n width: 28px;\n svg {\n fill: var(--mdc-theme-text-secondary-on-background);\n }\n`;\n\nconst { Browser } = ContentEntryListConfig;\n\ninterface ActionsCellProps {\n children: React.ReactNode;\n}\n\nconst ActionsCell = ({ children }: ActionsCellProps) => {\n const { model } = useModel();\n const { getLockRecordEntry, isRecordLocked } = useRecordLocking();\n\n const { useTableRow, isFolderRow } = Browser.Table.Column;\n const { row } = useTableRow();\n\n if (isFolderRow(row)) {\n return <>{children}</>;\n }\n\n const entry = getLockRecordEntry(row.id);\n\n if (!isRecordLocked(entry) || !entry?.$locked) {\n return <>{children}</>;\n }\n return (\n <CenterAlignment>\n <Tooltip\n placement={\"left\"}\n content={`This ${model.name} is currently locked by ${entry.$locked.lockedBy.displayName}.`}\n >\n <LockedIcon />\n </Tooltip>\n </CenterAlignment>\n );\n};\n\nconst RecordLockingCellActions = Browser.Table.Column.createDecorator(Original => {\n return function RecordLockingCellActions(props) {\n if (props.name === \"actions\" && props.cell) {\n return <Original {...props} cell={<ActionsCell>{props.cell}</ActionsCell>} />;\n }\n\n return <Original {...props} />;\n };\n});\n\nexport const HeadlessCmsActionsAcoCell = () => {\n return (\n <>\n <UseContentEntriesListHookDecorator />\n <UseSaveEntryDecorator />\n <RecordLockingCellActions />\n <UseRecordsDecorator />\n </>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","ContentEntryListConfig","useModel","ReactComponent","LockedIcon","useRecordLocking","UseContentEntriesListHookDecorator","UseSaveEntryDecorator","UseRecordsDecorator","Icon","Tooltip","Browser","ActionsCell","children","model","getLockRecordEntry","isRecordLocked","useTableRow","isFolderRow","Table","Column","row","createElement","Fragment","entry","id","$locked","side","content","name","lockedBy","displayName","trigger","icon","label","color","RecordLockingCellActions","createDecorator","Original","props","cell","Object","assign","HeadlessCmsActionsAcoCell"],"sources":["HeadlessCmsActionsAcoCell.tsx"],"sourcesContent":["import React from \"react\";\nimport { ContentEntryListConfig, useModel } from \"@webiny/app-headless-cms\";\nimport { ReactComponent as LockedIcon } from \"@webiny/icons/lock.svg\";\nimport { useRecordLocking } from \"~/hooks\";\nimport { UseContentEntriesListHookDecorator } from \"./decorators/UseContentEntriesListHookDecorator\";\nimport { UseSaveEntryDecorator } from \"~/components/decorators/UseSaveEntryDecorator\";\nimport { UseRecordsDecorator } from \"./decorators/UseRecordsDecorator\";\nimport { Icon, Tooltip } from \"@webiny/admin-ui\";\n\nconst { Browser } = ContentEntryListConfig;\n\ninterface ActionsCellProps {\n children: React.ReactNode;\n}\n\nconst ActionsCell = ({ children }: ActionsCellProps) => {\n const { model } = useModel();\n const { getLockRecordEntry, isRecordLocked } = useRecordLocking();\n\n const { useTableRow, isFolderRow } = Browser.Table.Column;\n const { row } = useTableRow();\n\n if (isFolderRow(row)) {\n return <>{children}</>;\n }\n\n const entry = getLockRecordEntry(row.id);\n\n if (!isRecordLocked(entry) || !entry?.$locked) {\n return <>{children}</>;\n }\n return (\n <Tooltip\n side={\"left\"}\n content={`This ${model.name} is currently locked by ${entry.$locked.lockedBy.displayName}.`}\n trigger={<Icon icon={<LockedIcon />} label={\"Locked entry\"} color={\"neutral-light\"} />}\n />\n );\n};\n\nconst RecordLockingCellActions = Browser.Table.Column.createDecorator(Original => {\n return function RecordLockingCellActions(props) {\n if (props.name === \"actions\" && props.cell) {\n return <Original {...props} cell={<ActionsCell>{props.cell}</ActionsCell>} />;\n }\n\n return <Original {...props} />;\n };\n});\n\nexport const HeadlessCmsActionsAcoCell = () => {\n return (\n <>\n <UseContentEntriesListHookDecorator />\n <UseSaveEntryDecorator />\n <RecordLockingCellActions />\n <UseRecordsDecorator />\n </>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,sBAAsB,EAAEC,QAAQ,QAAQ,0BAA0B;AAC3E,SAASC,cAAc,IAAIC,UAAU,QAAQ,wBAAwB;AACrE,SAASC,gBAAgB;AACzB,SAASC,kCAAkC;AAC3C,SAASC,qBAAqB;AAC9B,SAASC,mBAAmB;AAC5B,SAASC,IAAI,EAAEC,OAAO,QAAQ,kBAAkB;AAEhD,MAAM;EAAEC;AAAQ,CAAC,GAAGV,sBAAsB;AAM1C,MAAMW,WAAW,GAAGA,CAAC;EAAEC;AAA2B,CAAC,KAAK;EACpD,MAAM;IAAEC;EAAM,CAAC,GAAGZ,QAAQ,CAAC,CAAC;EAC5B,MAAM;IAAEa,kBAAkB;IAAEC;EAAe,CAAC,GAAGX,gBAAgB,CAAC,CAAC;EAEjE,MAAM;IAAEY,WAAW;IAAEC;EAAY,CAAC,GAAGP,OAAO,CAACQ,KAAK,CAACC,MAAM;EACzD,MAAM;IAAEC;EAAI,CAAC,GAAGJ,WAAW,CAAC,CAAC;EAE7B,IAAIC,WAAW,CAACG,GAAG,CAAC,EAAE;IAClB,oBAAOrB,KAAA,CAAAsB,aAAA,CAAAtB,KAAA,CAAAuB,QAAA,QAAGV,QAAW,CAAC;EAC1B;EAEA,MAAMW,KAAK,GAAGT,kBAAkB,CAACM,GAAG,CAACI,EAAE,CAAC;EAExC,IAAI,CAACT,cAAc,CAACQ,KAAK,CAAC,IAAI,CAACA,KAAK,EAAEE,OAAO,EAAE;IAC3C,oBAAO1B,KAAA,CAAAsB,aAAA,CAAAtB,KAAA,CAAAuB,QAAA,QAAGV,QAAW,CAAC;EAC1B;EACA,oBACIb,KAAA,CAAAsB,aAAA,CAACZ,OAAO;IACJiB,IAAI,EAAE,MAAO;IACbC,OAAO,EAAE,QAAQd,KAAK,CAACe,IAAI,2BAA2BL,KAAK,CAACE,OAAO,CAACI,QAAQ,CAACC,WAAW,GAAI;IAC5FC,OAAO,eAAEhC,KAAA,CAAAsB,aAAA,CAACb,IAAI;MAACwB,IAAI,eAAEjC,KAAA,CAAAsB,aAAA,CAAClB,UAAU,MAAE,CAAE;MAAC8B,KAAK,EAAE,cAAe;MAACC,KAAK,EAAE;IAAgB,CAAE;EAAE,CAC1F,CAAC;AAEV,CAAC;AAED,MAAMC,wBAAwB,GAAGzB,OAAO,CAACQ,KAAK,CAACC,MAAM,CAACiB,eAAe,CAACC,QAAQ,IAAI;EAC9E,OAAO,SAASF,wBAAwBA,CAACG,KAAK,EAAE;IAC5C,IAAIA,KAAK,CAACV,IAAI,KAAK,SAAS,IAAIU,KAAK,CAACC,IAAI,EAAE;MACxC,oBAAOxC,KAAA,CAAAsB,aAAA,CAACgB,QAAQ,EAAAG,MAAA,CAAAC,MAAA,KAAKH,KAAK;QAAEC,IAAI,eAAExC,KAAA,CAAAsB,aAAA,CAACV,WAAW,QAAE2B,KAAK,CAACC,IAAkB;MAAE,EAAE,CAAC;IACjF;IAEA,oBAAOxC,KAAA,CAAAsB,aAAA,CAACgB,QAAQ,EAAKC,KAAQ,CAAC;EAClC,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,MAAMI,yBAAyB,GAAGA,CAAA,KAAM;EAC3C,oBACI3C,KAAA,CAAAsB,aAAA,CAAAtB,KAAA,CAAAuB,QAAA,qBACIvB,KAAA,CAAAsB,aAAA,CAAChB,kCAAkC,MAAE,CAAC,eACtCN,KAAA,CAAAsB,aAAA,CAACf,qBAAqB,MAAE,CAAC,eACzBP,KAAA,CAAAsB,aAAA,CAACc,wBAAwB,MAAE,CAAC,eAC5BpC,KAAA,CAAAsB,aAAA,CAACd,mBAAmB,MAAE,CACxB,CAAC;AAEX,CAAC","ignoreList":[]}
@@ -1,33 +1,24 @@
1
- "use strict";
2
-
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.ContentEntryGuard = void 0;
9
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
- var _react = _interopRequireWildcard(require("react"));
11
- var _hooks = require("../../hooks");
12
- var _Progress = require("@webiny/ui/Progress");
13
- var _LockedRecord = require("../LockedRecord");
14
- var ContentEntryGuard = exports.ContentEntryGuard = function ContentEntryGuard(props) {
15
- var loading = props.loading,
16
- entry = props.entry,
17
- model = props.model,
18
- children = props.children;
19
- var _useRecordLocking = (0, _hooks.useRecordLocking)(),
20
- fetchLockedEntryLockRecord = _useRecordLocking.fetchLockedEntryLockRecord;
21
- var _useState = (0, _react.useState)(undefined),
22
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
23
- locked = _useState2[0],
24
- setLocked = _useState2[1];
25
- (0, _react.useEffect)(function () {
1
+ import React, { useEffect, useState } from "react";
2
+ import { useRecordLocking } from "../../hooks";
3
+ import { LockedRecord } from "../LockedRecord";
4
+ import { OverlayLoader } from "@webiny/admin-ui";
5
+ export const ContentEntryGuard = props => {
6
+ const {
7
+ loading,
8
+ entry,
9
+ model,
10
+ children
11
+ } = props;
12
+ const {
13
+ fetchLockedEntryLockRecord
14
+ } = useRecordLocking();
15
+ const [locked, setLocked] = useState(undefined);
16
+ useEffect(() => {
26
17
  if (!entry.id || loading || locked !== undefined) {
27
18
  return;
28
19
  }
29
- (async function () {
30
- var result = await fetchLockedEntryLockRecord({
20
+ (async () => {
21
+ const result = await fetchLockedEntryLockRecord({
31
22
  id: entry.id,
32
23
  $lockingType: model.modelId
33
24
  });
@@ -35,9 +26,11 @@ var ContentEntryGuard = exports.ContentEntryGuard = function ContentEntryGuard(p
35
26
  })();
36
27
  }, [entry.id, loading]);
37
28
  if (locked === undefined) {
38
- return /*#__PURE__*/_react.default.createElement(_Progress.CircularProgress, null);
29
+ return /*#__PURE__*/React.createElement("div", {
30
+ className: "wby-h-screen wby-w-screen wby-fixed wby-top-0 wby-left-0 wby-z-20"
31
+ }, /*#__PURE__*/React.createElement(OverlayLoader, null));
39
32
  } else if (locked) {
40
- return /*#__PURE__*/_react.default.createElement(_LockedRecord.LockedRecord, {
33
+ return /*#__PURE__*/React.createElement(LockedRecord, {
41
34
  record: locked
42
35
  });
43
36
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_hooks","_Progress","_LockedRecord","ContentEntryGuard","exports","props","loading","entry","model","children","_useRecordLocking","useRecordLocking","fetchLockedEntryLockRecord","_useState","useState","undefined","_useState2","_slicedToArray2","default","locked","setLocked","useEffect","id","result","$lockingType","modelId","createElement","CircularProgress","LockedRecord","record"],"sources":["ContentEntryGuard.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useRecordLocking } from \"~/hooks\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\nimport { LockedRecord } from \"../LockedRecord\";\nimport { IRecordLockingLockRecord } from \"~/types\";\nimport { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types\";\n\nexport interface IContentEntryGuardProps {\n loading: boolean;\n entry: CmsContentEntry;\n model: CmsModel;\n children: React.ReactElement;\n}\n\nexport const ContentEntryGuard = (props: IContentEntryGuardProps) => {\n const { loading, entry, model, children } = props;\n const { fetchLockedEntryLockRecord } = useRecordLocking();\n\n const [locked, setLocked] = useState<IRecordLockingLockRecord | null | undefined>(undefined);\n\n useEffect(() => {\n if (!entry.id || loading || locked !== undefined) {\n return;\n }\n (async () => {\n const result = await fetchLockedEntryLockRecord({\n id: entry.id,\n $lockingType: model.modelId\n });\n setLocked(result);\n })();\n }, [entry.id, loading]);\n\n if (locked === undefined) {\n return <CircularProgress />;\n } else if (locked) {\n return <LockedRecord record={locked} />;\n }\n\n return children;\n};\n"],"mappings":";;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,aAAA,GAAAH,OAAA;AAWO,IAAMI,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAG,SAApBA,iBAAiBA,CAAIE,KAA8B,EAAK;EACjE,IAAQC,OAAO,GAA6BD,KAAK,CAAzCC,OAAO;IAAEC,KAAK,GAAsBF,KAAK,CAAhCE,KAAK;IAAEC,KAAK,GAAeH,KAAK,CAAzBG,KAAK;IAAEC,QAAQ,GAAKJ,KAAK,CAAlBI,QAAQ;EACvC,IAAAC,iBAAA,GAAuC,IAAAC,uBAAgB,EAAC,CAAC;IAAjDC,0BAA0B,GAAAF,iBAAA,CAA1BE,0BAA0B;EAElC,IAAAC,SAAA,GAA4B,IAAAC,eAAQ,EAA8CC,SAAS,CAAC;IAAAC,UAAA,OAAAC,eAAA,CAAAC,OAAA,EAAAL,SAAA;IAArFM,MAAM,GAAAH,UAAA;IAAEI,SAAS,GAAAJ,UAAA;EAExB,IAAAK,gBAAS,EAAC,YAAM;IACZ,IAAI,CAACd,KAAK,CAACe,EAAE,IAAIhB,OAAO,IAAIa,MAAM,KAAKJ,SAAS,EAAE;MAC9C;IACJ;IACA,CAAC,kBAAY;MACT,IAAMQ,MAAM,GAAG,MAAMX,0BAA0B,CAAC;QAC5CU,EAAE,EAAEf,KAAK,CAACe,EAAE;QACZE,YAAY,EAAEhB,KAAK,CAACiB;MACxB,CAAC,CAAC;MACFL,SAAS,CAACG,MAAM,CAAC;IACrB,CAAC,EAAE,CAAC;EACR,CAAC,EAAE,CAAChB,KAAK,CAACe,EAAE,EAAEhB,OAAO,CAAC,CAAC;EAEvB,IAAIa,MAAM,KAAKJ,SAAS,EAAE;IACtB,oBAAOlB,MAAA,CAAAqB,OAAA,CAAAQ,aAAA,CAACzB,SAAA,CAAA0B,gBAAgB,MAAE,CAAC;EAC/B,CAAC,MAAM,IAAIR,MAAM,EAAE;IACf,oBAAOtB,MAAA,CAAAqB,OAAA,CAAAQ,aAAA,CAACxB,aAAA,CAAA0B,YAAY;MAACC,MAAM,EAAEV;IAAO,CAAE,CAAC;EAC3C;EAEA,OAAOV,QAAQ;AACnB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useState","useRecordLocking","LockedRecord","OverlayLoader","ContentEntryGuard","props","loading","entry","model","children","fetchLockedEntryLockRecord","locked","setLocked","undefined","id","result","$lockingType","modelId","createElement","className","record"],"sources":["ContentEntryGuard.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useRecordLocking } from \"~/hooks\";\nimport { LockedRecord } from \"../LockedRecord\";\nimport { IRecordLockingLockRecord } from \"~/types\";\nimport { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types\";\nimport { OverlayLoader } from \"@webiny/admin-ui\";\n\nexport interface IContentEntryGuardProps {\n loading: boolean;\n entry: CmsContentEntry;\n model: CmsModel;\n children: React.ReactElement;\n}\n\nexport const ContentEntryGuard = (props: IContentEntryGuardProps) => {\n const { loading, entry, model, children } = props;\n const { fetchLockedEntryLockRecord } = useRecordLocking();\n\n const [locked, setLocked] = useState<IRecordLockingLockRecord | null | undefined>(undefined);\n\n useEffect(() => {\n if (!entry.id || loading || locked !== undefined) {\n return;\n }\n (async () => {\n const result = await fetchLockedEntryLockRecord({\n id: entry.id,\n $lockingType: model.modelId\n });\n setLocked(result);\n })();\n }, [entry.id, loading]);\n\n if (locked === undefined) {\n return (\n <div className={\"wby-h-screen wby-w-screen wby-fixed wby-top-0 wby-left-0 wby-z-20\"}>\n <OverlayLoader />\n </div>\n );\n } else if (locked) {\n return <LockedRecord record={locked} />;\n }\n\n return children;\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAClD,SAASC,gBAAgB;AACzB,SAASC,YAAY;AAGrB,SAASC,aAAa,QAAQ,kBAAkB;AAShD,OAAO,MAAMC,iBAAiB,GAAIC,KAA8B,IAAK;EACjE,MAAM;IAAEC,OAAO;IAAEC,KAAK;IAAEC,KAAK;IAAEC;EAAS,CAAC,GAAGJ,KAAK;EACjD,MAAM;IAAEK;EAA2B,CAAC,GAAGT,gBAAgB,CAAC,CAAC;EAEzD,MAAM,CAACU,MAAM,EAAEC,SAAS,CAAC,GAAGZ,QAAQ,CAA8Ca,SAAS,CAAC;EAE5Fd,SAAS,CAAC,MAAM;IACZ,IAAI,CAACQ,KAAK,CAACO,EAAE,IAAIR,OAAO,IAAIK,MAAM,KAAKE,SAAS,EAAE;MAC9C;IACJ;IACA,CAAC,YAAY;MACT,MAAME,MAAM,GAAG,MAAML,0BAA0B,CAAC;QAC5CI,EAAE,EAAEP,KAAK,CAACO,EAAE;QACZE,YAAY,EAAER,KAAK,CAACS;MACxB,CAAC,CAAC;MACFL,SAAS,CAACG,MAAM,CAAC;IACrB,CAAC,EAAE,CAAC;EACR,CAAC,EAAE,CAACR,KAAK,CAACO,EAAE,EAAER,OAAO,CAAC,CAAC;EAEvB,IAAIK,MAAM,KAAKE,SAAS,EAAE;IACtB,oBACIf,KAAA,CAAAoB,aAAA;MAAKC,SAAS,EAAE;IAAoE,gBAChFrB,KAAA,CAAAoB,aAAA,CAACf,aAAa,MAAE,CACf,CAAC;EAEd,CAAC,MAAM,IAAIQ,MAAM,EAAE;IACf,oBAAOb,KAAA,CAAAoB,aAAA,CAAChB,YAAY;MAACkB,MAAM,EAAET;IAAO,CAAE,CAAC;EAC3C;EAEA,OAAOF,QAAQ;AACnB,CAAC","ignoreList":[]}
@@ -1,58 +1,41 @@
1
- "use strict";
2
-
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.ContentEntryLocker = void 0;
9
- var _base = _interopRequireDefault(require("@emotion/styled/base"));
10
- var _react = _interopRequireWildcard(require("react"));
11
- var _hooks = require("../../hooks");
12
- var _appWebsockets = require("@webiny/app-websockets");
13
- var _utils = require("@webiny/utils");
14
- var _appAdmin = require("@webiny/app-admin");
15
- function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
16
- var autoUpdateTimeout = 20;
17
- var Bold = /*#__PURE__*/(0, _base.default)("span", process.env.NODE_ENV === "production" ? {
18
- target: "e11fa9fc0"
19
- } : {
20
- target: "e11fa9fc0",
21
- label: "Bold"
22
- })(process.env.NODE_ENV === "production" ? {
23
- name: "16ceglb",
24
- styles: "font-weight:600"
25
- } : {
26
- name: "16ceglb",
27
- styles: "font-weight:600",
28
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnRlbnRFbnRyeUxvY2tlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBWXdCIiwiZmlsZSI6IkNvbnRlbnRFbnRyeUxvY2tlci50c3giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IHVzZVJlY29yZExvY2tpbmcgfSBmcm9tIFwifi9ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBJUmVjb3JkTG9ja2luZ0lkZW50aXR5LCBJUmVjb3JkTG9ja2luZ0xvY2tSZWNvcmQgfSBmcm9tIFwifi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ0dlbmVyaWNEYXRhIH0gZnJvbSBcIkB3ZWJpbnkvYXBwLXdlYnNvY2tldHNcIjtcbmltcG9ydCB7IHVzZVdlYnNvY2tldHMgfSBmcm9tIFwiQHdlYmlueS9hcHAtd2Vic29ja2V0c1wiO1xuaW1wb3J0IHsgcGFyc2VJZGVudGlmaWVyIH0gZnJvbSBcIkB3ZWJpbnkvdXRpbHNcIjtcbmltcG9ydCB7IHVzZURpYWxvZ3MgfSBmcm9tIFwiQHdlYmlueS9hcHAtYWRtaW5cIjtcbmltcG9ydCBzdHlsZWQgZnJvbSBcIkBlbW90aW9uL3N0eWxlZFwiO1xuaW1wb3J0IHsgQ21zQ29udGVudEVudHJ5LCBDbXNNb2RlbCB9IGZyb20gXCJAd2ViaW55L2FwcC1oZWFkbGVzcy1jbXMvdHlwZXNcIjtcblxuY29uc3QgYXV0b1VwZGF0ZVRpbWVvdXQgPSAyMDtcblxuY29uc3QgQm9sZCA9IHN0eWxlZC5zcGFuYFxuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb250ZW50RW50cnlMb2NrZXJQcm9wcyB7XG4gICAgZW50cnk6IENtc0NvbnRlbnRFbnRyeTtcbiAgICBtb2RlbDogQ21zTW9kZWw7XG4gICAgb25FbnRyeVVubG9ja2VkOiAoKSA9PiB2b2lkO1xuICAgIG9uRGlzYWJsZVByb21wdDogKGZsYWc6IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgY2hpbGRyZW46IFJlYWN0LlJlYWN0RWxlbWVudDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJS2lja091dFdlYnNvY2tldHNNZXNzYWdlIGV4dGVuZHMgSW5jb21pbmdHZW5lcmljRGF0YSB7XG4gICAgZGF0YToge1xuICAgICAgICByZWNvcmQ6IElSZWNvcmRMb2NraW5nTG9ja1JlY29yZDtcbiAgICAgICAgdXNlcjogSVJlY29yZExvY2tpbmdJZGVudGl0eTtcbiAgICB9O1xufVxuaW50ZXJmYWNlIElGb3JjZVVubG9ja2VkUHJvcHMge1xuICAgIHVzZXI6IElSZWNvcmRMb2NraW5nSWRlbnRpdHk7XG59XG5jb25zdCBGb3JjZVVubG9ja2VkID0gKHsgdXNlciB9OiBJRm9yY2VVbmxvY2tlZFByb3BzKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICAgIFRoZSBlbnRyeSB5b3Ugd2VyZSBlZGl0aW5nIHdhcyBmb3JjZWZ1bGx5IHVubG9ja2VkIGJ5e1wiIFwifVxuICAgICAgICAgICAgPEJvbGQ+e3VzZXIuZGlzcGxheU5hbWUgfHwgXCJVbmtub3duIHVzZXJcIn08L0JvbGQ+LiBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHlvdSBsb3N0XG4gICAgICAgICAgICB0aGUgdW5zYXZlZCBjaGFuZ2VzLlxuICAgICAgICA8Lz5cbiAgICApO1xufTtcblxuZXhwb3J0IGNvbnN0IENvbnRlbnRFbnRyeUxvY2tlciA9ICh7XG4gICAgb25FbnRyeVVubG9ja2VkLFxuICAgIG9uRGlzYWJsZVByb21wdCxcbiAgICBlbnRyeSxcbiAgICBtb2RlbCxcbiAgICBjaGlsZHJlblxufTogSUNvbnRlbnRFbnRyeUxvY2tlclByb3BzKSA9PiB7XG4gICAgY29uc3QgeyB1cGRhdGVFbnRyeUxvY2ssIHJlbW92ZUVudHJ5TG9jayB9ID0gdXNlUmVjb3JkTG9ja2luZygpO1xuICAgIGNvbnN0IHdlYnNvY2tldHMgPSB1c2VXZWJzb2NrZXRzKCk7XG4gICAgY29uc3QgeyBzaG93RGlhbG9nIH0gPSB1c2VEaWFsb2dzKCk7XG5cbiAgICBjb25zdCBlbnRyeUxvY2tlclRpbWVvdXQgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWVudHJ5LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpZDogZW50cnlJZCB9ID0gcGFyc2VJZGVudGlmaWVyKGVudHJ5LmlkKTtcblxuICAgICAgICBsZXQgb25NZXNzYWdlU3ViID0gd2Vic29ja2V0cy5vbk1lc3NhZ2U8SUtpY2tPdXRXZWJzb2NrZXRzTWVzc2FnZT4oXG4gICAgICAgICAgICBgcmVjb3JkTG9ja2luZy5lbnRyeS5raWNrT3V0LiR7ZW50cnlJZH1gLFxuICAgICAgICAgICAgYXN5bmMgaW5jb21pbmcgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdXNlciB9ID0gaW5jb21pbmcuZGF0YTtcbiAgICAgICAgICAgICAgICBvbkRpc2FibGVQcm9tcHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmVtb3ZlRW50cnlMb2NrKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVudHJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICRsb2NraW5nVHlwZTogbW9kZWwubW9kZWxJZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNob3dEaWFsb2coe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJFbnRyeSB3YXMgZm9yY2VmdWxseSB1bmxvY2tlZCFcIixcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogPEZvcmNlVW5sb2NrZWQgdXNlcj17dXNlcn0gLz4sXG4gICAgICAgICAgICAgICAgICAgIGFjY2VwdExhYmVsOiBcIk9rXCIsXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsTGFiZWw6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG9uRW50cnlVbmxvY2tlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBvbk1lc3NhZ2VTdWIub2ZmKCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIExldHMgbnVsbCBzdWJzY3JpcHRpb25zLCBqdXN0IGluIGNhc2UgaXQuLi5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgb25NZXNzYWdlU3ViID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICB9LCBbZW50cnkuaWQsIG9uRW50cnlVbmxvY2tlZCwgbW9kZWwubW9kZWxJZF0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFlbnRyeS5pZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5TG9ja2VyVGltZW91dC5jdXJyZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVMb2NrID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdXBkYXRlRW50cnlMb2NrKHtcbiAgICAgICAgICAgICAgICBpZDogZW50cnkuaWQsXG4gICAgICAgICAgICAgICAgJGxvY2tpbmdUeXBlOiBtb2RlbC5tb2RlbElkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzaG93RGlhbG9nKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBlbnRyeSBsb2NrLlwiLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiByZXN1bHQuZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXB0TGFiZWw6IFwiT2tcIixcbiAgICAgICAgICAgICAgICAgICAgb25DbG9zZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxMYWJlbDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgb25FbnRyeVVubG9ja2VkKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3JlYXRlVGltZW91dCgpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVRpbWVvdXQgPSAoKSA9PiB7XG4gICAgICAgICAgICBlbnRyeUxvY2tlclRpbWVvdXQuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVMb2NrKCk7XG4gICAgICAgICAgICB9LCBhdXRvVXBkYXRlVGltZW91dCAqIDEwMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHVwZGF0ZUxvY2soKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGlmICghZW50cnlMb2NrZXJUaW1lb3V0LmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZW50cnlMb2NrZXJUaW1lb3V0LmN1cnJlbnQpO1xuICAgICAgICAgICAgZW50cnlMb2NrZXJUaW1lb3V0LmN1cnJlbnQgPSBudWxsO1xuICAgICAgICB9O1xuICAgIH0sIFtlbnRyeS5pZCwgb25FbnRyeVVubG9ja2VkXSk7XG5cbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xufTtcbiJdfQ== */",
29
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
30
- });
31
- var ForceUnlocked = function ForceUnlocked(_ref) {
32
- var user = _ref.user;
33
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "The entry you were editing was forcefully unlocked by", " ", /*#__PURE__*/_react.default.createElement(Bold, null, user.displayName || "Unknown user"), ". Unfortunately, this means you lost the unsaved changes.");
1
+ import React, { useEffect, useRef } from "react";
2
+ import { useRecordLocking } from "../../hooks";
3
+ import { useWebsockets } from "@webiny/app-websockets";
4
+ import { parseIdentifier } from "@webiny/utils";
5
+ import { useDialogs } from "@webiny/app-admin";
6
+ const autoUpdateTimeout = 20;
7
+ const ForceUnlocked = ({
8
+ user
9
+ }) => {
10
+ return /*#__PURE__*/React.createElement(React.Fragment, null, "The entry you were editing was forcefully unlocked by", " ", /*#__PURE__*/React.createElement("strong", null, user.displayName || "Unknown user"), ". Unfortunately, this means you lost the unsaved changes.");
34
11
  };
35
- var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocker(_ref2) {
36
- var onEntryUnlocked = _ref2.onEntryUnlocked,
37
- onDisablePrompt = _ref2.onDisablePrompt,
38
- entry = _ref2.entry,
39
- model = _ref2.model,
40
- children = _ref2.children;
41
- var _useRecordLocking = (0, _hooks.useRecordLocking)(),
42
- updateEntryLock = _useRecordLocking.updateEntryLock,
43
- removeEntryLock = _useRecordLocking.removeEntryLock;
44
- var websockets = (0, _appWebsockets.useWebsockets)();
45
- var _useDialogs = (0, _appAdmin.useDialogs)(),
46
- showDialog = _useDialogs.showDialog;
47
- var entryLockerTimeout = (0, _react.useRef)(null);
48
- (0, _react.useEffect)(function () {
12
+ export const ContentEntryLocker = ({
13
+ onEntryUnlocked,
14
+ onDisablePrompt,
15
+ entry,
16
+ model,
17
+ children
18
+ }) => {
19
+ const {
20
+ updateEntryLock,
21
+ removeEntryLock
22
+ } = useRecordLocking();
23
+ const websockets = useWebsockets();
24
+ const {
25
+ showDialog
26
+ } = useDialogs();
27
+ const entryLockerTimeout = useRef(null);
28
+ useEffect(() => {
49
29
  if (!entry.id) {
50
30
  return;
51
31
  }
52
- var _parseIdentifier = (0, _utils.parseIdentifier)(entry.id),
53
- entryId = _parseIdentifier.id;
54
- var onMessageSub = websockets.onMessage("recordLocking.entry.kickOut.".concat(entryId), async function (incoming) {
55
- var user = incoming.data.user;
32
+ const {
33
+ id: entryId
34
+ } = parseIdentifier(entry.id);
35
+ let onMessageSub = websockets.onMessage(`recordLocking.entry.kickOut.${entryId}`, async incoming => {
36
+ const {
37
+ user
38
+ } = incoming.data;
56
39
  onDisablePrompt(true);
57
40
  removeEntryLock({
58
41
  id: entryId,
@@ -60,7 +43,7 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
60
43
  });
61
44
  showDialog({
62
45
  title: "Entry was forcefully unlocked!",
63
- content: /*#__PURE__*/_react.default.createElement(ForceUnlocked, {
46
+ content: /*#__PURE__*/React.createElement(ForceUnlocked, {
64
47
  user: user
65
48
  }),
66
49
  acceptLabel: "Ok",
@@ -69,7 +52,7 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
69
52
  });
70
53
  onEntryUnlocked();
71
54
  });
72
- return function () {
55
+ return () => {
73
56
  onMessageSub.off();
74
57
  /**
75
58
  * Lets null subscriptions, just in case it...
@@ -78,15 +61,15 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
78
61
  onMessageSub = null;
79
62
  };
80
63
  }, [entry.id, onEntryUnlocked, model.modelId]);
81
- (0, _react.useEffect)(function () {
64
+ useEffect(() => {
82
65
  if (!entry.id) {
83
66
  return;
84
67
  }
85
68
  if (entryLockerTimeout.current) {
86
69
  return;
87
70
  }
88
- var updateLock = async function updateLock() {
89
- var result = await updateEntryLock({
71
+ const updateLock = async () => {
72
+ const result = await updateEntryLock({
90
73
  id: entry.id,
91
74
  $lockingType: model.modelId
92
75
  });
@@ -103,13 +86,13 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
103
86
  }
104
87
  createTimeout();
105
88
  };
106
- var createTimeout = function createTimeout() {
107
- entryLockerTimeout.current = window.setTimeout(function () {
89
+ const createTimeout = () => {
90
+ entryLockerTimeout.current = window.setTimeout(() => {
108
91
  updateLock();
109
92
  }, autoUpdateTimeout * 1000);
110
93
  };
111
94
  updateLock();
112
- return function () {
95
+ return () => {
113
96
  if (!entryLockerTimeout.current) {
114
97
  return;
115
98
  }
@@ -117,7 +100,7 @@ var ContentEntryLocker = exports.ContentEntryLocker = function ContentEntryLocke
117
100
  entryLockerTimeout.current = null;
118
101
  };
119
102
  }, [entry.id, onEntryUnlocked]);
120
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, children);
103
+ return /*#__PURE__*/React.createElement(React.Fragment, null, children);
121
104
  };
122
105
 
123
106
  //# sourceMappingURL=ContentEntryLocker.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_hooks","_appWebsockets","_utils","_appAdmin","_EMOTION_STRINGIFIED_CSS_ERROR__","autoUpdateTimeout","Bold","_base","default","process","env","NODE_ENV","target","label","name","styles","map","toString","ForceUnlocked","_ref","user","createElement","Fragment","displayName","ContentEntryLocker","exports","_ref2","onEntryUnlocked","onDisablePrompt","entry","model","children","_useRecordLocking","useRecordLocking","updateEntryLock","removeEntryLock","websockets","useWebsockets","_useDialogs","useDialogs","showDialog","entryLockerTimeout","useRef","useEffect","id","_parseIdentifier","parseIdentifier","entryId","onMessageSub","onMessage","concat","incoming","data","$lockingType","modelId","title","content","acceptLabel","onClose","undefined","cancelLabel","off","current","updateLock","result","error","message","createTimeout","window","setTimeout","clearTimeout"],"sources":["ContentEntryLocker.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { useRecordLocking } from \"~/hooks\";\nimport type { IRecordLockingIdentity, IRecordLockingLockRecord } from \"~/types\";\nimport type { IncomingGenericData } from \"@webiny/app-websockets\";\nimport { useWebsockets } from \"@webiny/app-websockets\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { useDialogs } from \"@webiny/app-admin\";\nimport styled from \"@emotion/styled\";\nimport { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types\";\n\nconst autoUpdateTimeout = 20;\n\nconst Bold = styled.span`\n font-weight: 600;\n`;\n\nexport interface IContentEntryLockerProps {\n entry: CmsContentEntry;\n model: CmsModel;\n onEntryUnlocked: () => void;\n onDisablePrompt: (flag: boolean) => void;\n children: React.ReactElement;\n}\n\nexport interface IKickOutWebsocketsMessage extends IncomingGenericData {\n data: {\n record: IRecordLockingLockRecord;\n user: IRecordLockingIdentity;\n };\n}\ninterface IForceUnlockedProps {\n user: IRecordLockingIdentity;\n}\nconst ForceUnlocked = ({ user }: IForceUnlockedProps) => {\n return (\n <>\n The entry you were editing was forcefully unlocked by{\" \"}\n <Bold>{user.displayName || \"Unknown user\"}</Bold>. Unfortunately, this means you lost\n the unsaved changes.\n </>\n );\n};\n\nexport const ContentEntryLocker = ({\n onEntryUnlocked,\n onDisablePrompt,\n entry,\n model,\n children\n}: IContentEntryLockerProps) => {\n const { updateEntryLock, removeEntryLock } = useRecordLocking();\n const websockets = useWebsockets();\n const { showDialog } = useDialogs();\n\n const entryLockerTimeout = useRef<number | null>(null);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n const { id: entryId } = parseIdentifier(entry.id);\n\n let onMessageSub = websockets.onMessage<IKickOutWebsocketsMessage>(\n `recordLocking.entry.kickOut.${entryId}`,\n async incoming => {\n const { user } = incoming.data;\n onDisablePrompt(true);\n removeEntryLock({\n id: entryId,\n $lockingType: model.modelId\n });\n showDialog({\n title: \"Entry was forcefully unlocked!\",\n content: <ForceUnlocked user={user} />,\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: undefined\n });\n onEntryUnlocked();\n }\n );\n\n return () => {\n onMessageSub.off();\n /**\n * Lets null subscriptions, just in case it...\n */\n // @ts-expect-error\n onMessageSub = null;\n };\n }, [entry.id, onEntryUnlocked, model.modelId]);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n\n if (entryLockerTimeout.current) {\n return;\n }\n\n const updateLock = async () => {\n const result = await updateEntryLock({\n id: entry.id,\n $lockingType: model.modelId\n });\n if (result.error) {\n showDialog({\n title: \"There was an error while updating the entry lock.\",\n content: result.error.message,\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: undefined\n });\n onEntryUnlocked();\n return;\n }\n createTimeout();\n };\n\n const createTimeout = () => {\n entryLockerTimeout.current = window.setTimeout(() => {\n updateLock();\n }, autoUpdateTimeout * 1000);\n };\n\n updateLock();\n return () => {\n if (!entryLockerTimeout.current) {\n return;\n }\n clearTimeout(entryLockerTimeout.current);\n entryLockerTimeout.current = null;\n };\n }, [entry.id, onEntryUnlocked]);\n\n return <>{children}</>;\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useRef","useRecordLocking","useWebsockets","parseIdentifier","useDialogs","autoUpdateTimeout","ForceUnlocked","user","createElement","Fragment","displayName","ContentEntryLocker","onEntryUnlocked","onDisablePrompt","entry","model","children","updateEntryLock","removeEntryLock","websockets","showDialog","entryLockerTimeout","id","entryId","onMessageSub","onMessage","incoming","data","$lockingType","modelId","title","content","acceptLabel","onClose","undefined","cancelLabel","off","current","updateLock","result","error","message","createTimeout","window","setTimeout","clearTimeout"],"sources":["ContentEntryLocker.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { useRecordLocking } from \"~/hooks\";\nimport type { IRecordLockingIdentity, IRecordLockingLockRecord } from \"~/types\";\nimport type { IncomingGenericData } from \"@webiny/app-websockets\";\nimport { useWebsockets } from \"@webiny/app-websockets\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { useDialogs } from \"@webiny/app-admin\";\nimport { CmsContentEntry, CmsModel } from \"@webiny/app-headless-cms/types\";\n\nconst autoUpdateTimeout = 20;\n\nexport interface IContentEntryLockerProps {\n entry: CmsContentEntry;\n model: CmsModel;\n onEntryUnlocked: () => void;\n onDisablePrompt: (flag: boolean) => void;\n children: React.ReactElement;\n}\n\nexport interface IKickOutWebsocketsMessage extends IncomingGenericData {\n data: {\n record: IRecordLockingLockRecord;\n user: IRecordLockingIdentity;\n };\n}\ninterface IForceUnlockedProps {\n user: IRecordLockingIdentity;\n}\nconst ForceUnlocked = ({ user }: IForceUnlockedProps) => {\n return (\n <>\n The entry you were editing was forcefully unlocked by{\" \"}\n <strong>{user.displayName || \"Unknown user\"}</strong>. Unfortunately, this means you\n lost the unsaved changes.\n </>\n );\n};\n\nexport const ContentEntryLocker = ({\n onEntryUnlocked,\n onDisablePrompt,\n entry,\n model,\n children\n}: IContentEntryLockerProps) => {\n const { updateEntryLock, removeEntryLock } = useRecordLocking();\n const websockets = useWebsockets();\n const { showDialog } = useDialogs();\n\n const entryLockerTimeout = useRef<number | null>(null);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n const { id: entryId } = parseIdentifier(entry.id);\n\n let onMessageSub = websockets.onMessage<IKickOutWebsocketsMessage>(\n `recordLocking.entry.kickOut.${entryId}`,\n async incoming => {\n const { user } = incoming.data;\n onDisablePrompt(true);\n removeEntryLock({\n id: entryId,\n $lockingType: model.modelId\n });\n showDialog({\n title: \"Entry was forcefully unlocked!\",\n content: <ForceUnlocked user={user} />,\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: undefined\n });\n onEntryUnlocked();\n }\n );\n\n return () => {\n onMessageSub.off();\n /**\n * Lets null subscriptions, just in case it...\n */\n // @ts-expect-error\n onMessageSub = null;\n };\n }, [entry.id, onEntryUnlocked, model.modelId]);\n\n useEffect(() => {\n if (!entry.id) {\n return;\n }\n\n if (entryLockerTimeout.current) {\n return;\n }\n\n const updateLock = async () => {\n const result = await updateEntryLock({\n id: entry.id,\n $lockingType: model.modelId\n });\n if (result.error) {\n showDialog({\n title: \"There was an error while updating the entry lock.\",\n content: result.error.message,\n acceptLabel: \"Ok\",\n onClose: undefined,\n cancelLabel: undefined\n });\n onEntryUnlocked();\n return;\n }\n createTimeout();\n };\n\n const createTimeout = () => {\n entryLockerTimeout.current = window.setTimeout(() => {\n updateLock();\n }, autoUpdateTimeout * 1000);\n };\n\n updateLock();\n return () => {\n if (!entryLockerTimeout.current) {\n return;\n }\n clearTimeout(entryLockerTimeout.current);\n entryLockerTimeout.current = null;\n };\n }, [entry.id, onEntryUnlocked]);\n\n return <>{children}</>;\n};\n"],"mappings":"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","ignoreList":[]}