@atlaskit/editor-plugin-extension 1.11.0 → 1.11.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @atlaskit/editor-plugin-extension
2
2
 
3
+ ## 1.11.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#123920](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/123920)
8
+ [`dc459fb7e6e6b`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/dc459fb7e6e6b) -
9
+ Add event listener for updates to Forge app config schema and force re-render of the config panel.
10
+ Async functions in Forge apps lead to a race condition that causes the panel to render stale
11
+ schemas unless the panel is re-rendered.
12
+
3
13
  ## 1.11.0
4
14
 
5
15
  ### Minor Changes
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.default = FieldsLoader;
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
+ var _bindEventListener = require("bind-event-listener");
11
12
  var _ConfigPanel = _interopRequireDefault(require("./ConfigPanel"));
12
13
  var _useStateFromPromise3 = require("./use-state-from-promise");
13
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
@@ -30,6 +31,33 @@ var FieldDefinitionsPromiseResolver = function FieldDefinitionsPromiseResolver(p
30
31
  fields = _useState2[0],
31
32
  setFields = _useState2[1];
32
33
 
34
+ // Event listener for Forge apps that have macro config.
35
+ // When an app generates a new config schema, we need to force a re-render
36
+ // of the config panel so that the UI reflects the new schema.
37
+ // Otherwise the panel renders a stale schema.
38
+ var _useState3 = (0, _react.useState)(new Date()),
39
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
40
+ forgeAppConfigLastUpdated = _useState4[0],
41
+ setForgeAppConfigLastUpdated = _useState4[1];
42
+ (0, _react.useEffect)(function () {
43
+ if (extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.extensionId && extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.localId) {
44
+ var extensionId = extensionParameters.extensionId,
45
+ localId = extensionParameters.localId;
46
+ var id = "".concat(extensionId, "-").concat(localId);
47
+ var eventName = "forge.bridge.CONFIG_FORGE_DOC_UPDATED_".concat(id);
48
+ var handleForgeConfigUpdated = function handleForgeConfigUpdated() {
49
+ setForgeAppConfigLastUpdated(new Date());
50
+ };
51
+ var unbind = (0, _bindEventListener.bind)(window.document, {
52
+ type: eventName,
53
+ listener: handleForgeConfigUpdated
54
+ });
55
+ return function () {
56
+ unbind();
57
+ };
58
+ }
59
+ }, [extensionParameters]);
60
+
33
61
  // Resolve the promise
34
62
  // useStateFromPromise() has an issue which isn't compatible with
35
63
  // DynamicFieldDefinitions when it returns a function as setState()
@@ -68,7 +96,7 @@ var FieldDefinitionsPromiseResolver = function FieldDefinitionsPromiseResolver(p
68
96
  setFields(undefined);
69
97
  }
70
98
  });
71
- }, [extensionManifest, nodeKey, extensionParameters, setErrorMessage]);
99
+ }, [extensionManifest, nodeKey, extensionParameters, setErrorMessage, forgeAppConfigLastUpdated]);
72
100
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, props.children(fields));
73
101
  };
74
102
  function FieldsLoader(_ref) {
@@ -93,10 +121,10 @@ function FieldsLoader(_ref) {
93
121
  }, [extensionProvider, extensionType, extensionKey]),
94
122
  _useStateFromPromise2 = (0, _slicedToArray2.default)(_useStateFromPromise, 1),
95
123
  extensionManifest = _useStateFromPromise2[0];
96
- var _useState3 = (0, _react.useState)(null),
97
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
98
- errorMessage = _useState4[0],
99
- setErrorMessage = _useState4[1];
124
+ var _useState5 = (0, _react.useState)(null),
125
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
126
+ errorMessage = _useState6[0],
127
+ setErrorMessage = _useState6[1];
100
128
  return /*#__PURE__*/_react.default.createElement(FieldDefinitionsPromiseResolver, {
101
129
  setErrorMessage: setErrorMessage,
102
130
  extensionManifest: extensionManifest,
@@ -1,4 +1,5 @@
1
1
  import React, { useEffect, useState } from 'react';
2
+ import { bind } from 'bind-event-listener';
2
3
  import ConfigPanel from './ConfigPanel';
3
4
  import { useStateFromPromise } from './use-state-from-promise';
4
5
  const getFieldsDefinitionFn = (extensionManifest, nodeKey) => {
@@ -18,6 +19,32 @@ const FieldDefinitionsPromiseResolver = props => {
18
19
  } = props;
19
20
  const [fields, setFields] = useState(undefined);
20
21
 
22
+ // Event listener for Forge apps that have macro config.
23
+ // When an app generates a new config schema, we need to force a re-render
24
+ // of the config panel so that the UI reflects the new schema.
25
+ // Otherwise the panel renders a stale schema.
26
+ const [forgeAppConfigLastUpdated, setForgeAppConfigLastUpdated] = useState(new Date());
27
+ useEffect(() => {
28
+ if (extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.extensionId && extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.localId) {
29
+ const {
30
+ extensionId,
31
+ localId
32
+ } = extensionParameters;
33
+ const id = `${extensionId}-${localId}`;
34
+ const eventName = `forge.bridge.CONFIG_FORGE_DOC_UPDATED_${id}`;
35
+ const handleForgeConfigUpdated = () => {
36
+ setForgeAppConfigLastUpdated(new Date());
37
+ };
38
+ const unbind = bind(window.document, {
39
+ type: eventName,
40
+ listener: handleForgeConfigUpdated
41
+ });
42
+ return () => {
43
+ unbind();
44
+ };
45
+ }
46
+ }, [extensionParameters]);
47
+
21
48
  // Resolve the promise
22
49
  // useStateFromPromise() has an issue which isn't compatible with
23
50
  // DynamicFieldDefinitions when it returns a function as setState()
@@ -56,7 +83,7 @@ const FieldDefinitionsPromiseResolver = props => {
56
83
  setFields(undefined);
57
84
  }
58
85
  });
59
- }, [extensionManifest, nodeKey, extensionParameters, setErrorMessage]);
86
+ }, [extensionManifest, nodeKey, extensionParameters, setErrorMessage, forgeAppConfigLastUpdated]);
60
87
  return /*#__PURE__*/React.createElement(React.Fragment, null, props.children(fields));
61
88
  };
62
89
  export default function FieldsLoader({
@@ -1,5 +1,6 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import React, { useEffect, useState } from 'react';
3
+ import { bind } from 'bind-event-listener';
3
4
  import ConfigPanel from './ConfigPanel';
4
5
  import { useStateFromPromise } from './use-state-from-promise';
5
6
  var getFieldsDefinitionFn = function getFieldsDefinitionFn(extensionManifest, nodeKey) {
@@ -20,6 +21,33 @@ var FieldDefinitionsPromiseResolver = function FieldDefinitionsPromiseResolver(p
20
21
  fields = _useState2[0],
21
22
  setFields = _useState2[1];
22
23
 
24
+ // Event listener for Forge apps that have macro config.
25
+ // When an app generates a new config schema, we need to force a re-render
26
+ // of the config panel so that the UI reflects the new schema.
27
+ // Otherwise the panel renders a stale schema.
28
+ var _useState3 = useState(new Date()),
29
+ _useState4 = _slicedToArray(_useState3, 2),
30
+ forgeAppConfigLastUpdated = _useState4[0],
31
+ setForgeAppConfigLastUpdated = _useState4[1];
32
+ useEffect(function () {
33
+ if (extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.extensionId && extensionParameters !== null && extensionParameters !== void 0 && extensionParameters.localId) {
34
+ var extensionId = extensionParameters.extensionId,
35
+ localId = extensionParameters.localId;
36
+ var id = "".concat(extensionId, "-").concat(localId);
37
+ var eventName = "forge.bridge.CONFIG_FORGE_DOC_UPDATED_".concat(id);
38
+ var handleForgeConfigUpdated = function handleForgeConfigUpdated() {
39
+ setForgeAppConfigLastUpdated(new Date());
40
+ };
41
+ var unbind = bind(window.document, {
42
+ type: eventName,
43
+ listener: handleForgeConfigUpdated
44
+ });
45
+ return function () {
46
+ unbind();
47
+ };
48
+ }
49
+ }, [extensionParameters]);
50
+
23
51
  // Resolve the promise
24
52
  // useStateFromPromise() has an issue which isn't compatible with
25
53
  // DynamicFieldDefinitions when it returns a function as setState()
@@ -58,7 +86,7 @@ var FieldDefinitionsPromiseResolver = function FieldDefinitionsPromiseResolver(p
58
86
  setFields(undefined);
59
87
  }
60
88
  });
61
- }, [extensionManifest, nodeKey, extensionParameters, setErrorMessage]);
89
+ }, [extensionManifest, nodeKey, extensionParameters, setErrorMessage, forgeAppConfigLastUpdated]);
62
90
  return /*#__PURE__*/React.createElement(React.Fragment, null, props.children(fields));
63
91
  };
64
92
  export default function FieldsLoader(_ref) {
@@ -83,10 +111,10 @@ export default function FieldsLoader(_ref) {
83
111
  }, [extensionProvider, extensionType, extensionKey]),
84
112
  _useStateFromPromise2 = _slicedToArray(_useStateFromPromise, 1),
85
113
  extensionManifest = _useStateFromPromise2[0];
86
- var _useState3 = useState(null),
87
- _useState4 = _slicedToArray(_useState3, 2),
88
- errorMessage = _useState4[0],
89
- setErrorMessage = _useState4[1];
114
+ var _useState5 = useState(null),
115
+ _useState6 = _slicedToArray(_useState5, 2),
116
+ errorMessage = _useState6[0],
117
+ setErrorMessage = _useState6[1];
90
118
  return /*#__PURE__*/React.createElement(FieldDefinitionsPromiseResolver, {
91
119
  setErrorMessage: setErrorMessage,
92
120
  extensionManifest: extensionManifest,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-extension",
3
- "version": "1.11.0",
3
+ "version": "1.11.1",
4
4
  "description": "editor-plugin-extension plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -46,7 +46,7 @@
46
46
  "@atlaskit/form": "^10.4.0",
47
47
  "@atlaskit/icon": "^22.7.0",
48
48
  "@atlaskit/platform-feature-flags": "^0.3.0",
49
- "@atlaskit/primitives": "^11.0.0",
49
+ "@atlaskit/primitives": "^11.1.0",
50
50
  "@atlaskit/radio": "^6.4.0",
51
51
  "@atlaskit/section-message": "^6.5.0",
52
52
  "@atlaskit/select": "^17.11.0",
@@ -61,6 +61,7 @@
61
61
  "@atlaskit/tooltip": "^18.5.0",
62
62
  "@babel/runtime": "^7.0.0",
63
63
  "@emotion/react": "^11.7.1",
64
+ "bind-event-listener": "^3.0.0",
64
65
  "is-number": "^7.0.0",
65
66
  "lodash": "^4.17.21",
66
67
  "memoize-one": "^6.0.0",