@atlaskit/renderer 151.0.0 → 151.0.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,17 @@
1
1
  # @atlaskit/renderer
2
2
 
3
+ ## 151.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`0dacb94545d03`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/0dacb94545d03) -
8
+ Behind cc_maui_annotations_on_extensions: fire the cc_maui_comments_on_charts_exp exposure only
9
+ where the chart Comment button can show. Adds an optional viewModeEditorToolbarItems UiConfig
10
+ hook, used by MAUI charts to show Comment in the view-mode toolbar (live pages), and a
11
+ getAddCommentPermission annotation plugin action, used to disable the chart Comment button without
12
+ comment permission. The full-page renderer checks extension comment creation on first hover or
13
+ focus instead of while rendering.
14
+
3
15
  ## 151.0.0
4
16
 
5
17
  ### Minor Changes
@@ -9,6 +9,7 @@ exports.renderExtension = exports.default = void 0;
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
11
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
13
  var _react = _interopRequireWildcard(require("react"));
13
14
  var _react2 = require("@emotion/react");
14
15
  var _enums = require("@atlaskit/editor-common/analytics/types/enums");
@@ -212,35 +213,72 @@ var ExtensionWithAnnotations = function ExtensionWithAnnotations(props) {
212
213
  return Boolean(props.extensionNode && (isBlockNodeSupported === null || isBlockNodeSupported === void 0 ? void 0 : isBlockNodeSupported(props.extensionNode)) === true);
213
214
  }, [props.extensionNode, isBlockNodeSupported]);
214
215
  var canCreateCommentOnBlockNode = providers === null || providers === void 0 || (_providers$inlineComm2 = providers.inlineComment) === null || _providers$inlineComm2 === void 0 ? void 0 : _providers$inlineComm2.canCreateCommentOnBlockNode;
215
- var isCommentTarget = (0, _react.useMemo)(function () {
216
- return Boolean(supportsComments && props.extensionNode && (!canCreateCommentOnBlockNode || canCreateCommentOnBlockNode(props.extensionNode)));
217
- }, [supportsComments, props.extensionNode, canCreateCommentOnBlockNode]);
218
216
  var isFullPageRenderer = props.rendererAppearance === 'full-page' || props.rendererAppearance === 'full-width';
217
+ // The creation policy may fire an experiment exposure. In the full-page renderer it is only
218
+ // checked once the user hovers or focuses the extension, where the comment target appears.
219
+ // Other renderers have no hover entry point, so they keep checking during render. Saved
220
+ // threads stay viewable through `supportsComments`.
221
+ // Only an allowed result is stored. A rejection is not cached because it can be temporary (for
222
+ // example before Statsig initializes), so the check runs again on the next hover or focus.
223
+ var _useState = (0, _react.useState)(),
224
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
225
+ allowedCommentNode = _useState2[0],
226
+ setAllowedCommentNode = _useState2[1];
227
+ var canCreateDuringRender = (0, _react.useMemo)(function () {
228
+ return !isFullPageRenderer && Boolean(supportsComments && props.extensionNode && (canCreateCommentOnBlockNode === null || canCreateCommentOnBlockNode === void 0 ? void 0 : canCreateCommentOnBlockNode(props.extensionNode)));
229
+ }, [isFullPageRenderer, supportsComments, props.extensionNode, canCreateCommentOnBlockNode]);
230
+ var isCommentTarget = Boolean(supportsComments && props.extensionNode && (!canCreateCommentOnBlockNode || canCreateDuringRender || allowedCommentNode === props.extensionNode));
231
+ var isCommentTargetRef = (0, _react.useRef)(isCommentTarget);
232
+ isCommentTargetRef.current = isCommentTarget;
233
+ var resolveCommentTarget = (0, _react.useCallback)(function (target) {
234
+ if (isCommentTargetRef.current) {
235
+ return true;
236
+ }
237
+ var node = props.extensionNode;
238
+ if (!supportsComments || !node || !canCreateCommentOnBlockNode || !canCreateCommentOnBlockNode(node)) {
239
+ return false;
240
+ }
241
+ // The hover target is matched against this attribute before React re-renders, so set it
242
+ // now; the batched render below writes the same value.
243
+ target.dataset.inlineCommentsTarget = 'true';
244
+ isCommentTargetRef.current = true;
245
+ setAllowedCommentNode(node);
246
+ return true;
247
+ }, [supportsComments, props.extensionNode, canCreateCommentOnBlockNode]);
219
248
  var onMouseEnter = (0, _react.useCallback)(function (event) {
249
+ if (!resolveCommentTarget(event.currentTarget)) {
250
+ return;
251
+ }
220
252
  cancelTimeout();
221
253
  if (event.buttons === 0) {
222
254
  setHoverTarget === null || setHoverTarget === void 0 || setHoverTarget(event.currentTarget);
223
255
  setIsWithinRange(true);
224
256
  }
225
- }, [cancelTimeout, setHoverTarget, setIsWithinRange]);
257
+ }, [cancelTimeout, resolveCommentTarget, setHoverTarget, setIsWithinRange]);
226
258
  var onMouseLeave = (0, _react.useCallback)(function () {
227
- return initiateTimeout();
259
+ if (isCommentTargetRef.current) {
260
+ initiateTimeout();
261
+ }
228
262
  }, [initiateTimeout]);
229
263
  var onFocus = (0, _react.useCallback)(function (event) {
230
264
  if (event.currentTarget.contains(event.relatedTarget)) {
231
265
  return;
232
266
  }
267
+ if (!resolveCommentTarget(event.currentTarget)) {
268
+ return;
269
+ }
233
270
  cancelTimeout();
234
271
  setHoverTarget === null || setHoverTarget === void 0 || setHoverTarget(event.currentTarget);
235
272
  setIsWithinRange(true);
236
- }, [cancelTimeout, setHoverTarget, setIsWithinRange]);
273
+ }, [cancelTimeout, resolveCommentTarget, setHoverTarget, setIsWithinRange]);
237
274
  var onBlur = (0, _react.useCallback)(function (event) {
238
- if (!event.currentTarget.contains(event.relatedTarget)) {
275
+ if (isCommentTargetRef.current && !event.currentTarget.contains(event.relatedTarget)) {
239
276
  initiateTimeout();
240
277
  }
241
278
  }, [initiateTimeout]);
242
- var commentTargetOptions = isCommentTarget && isFullPageRenderer ? {
243
- isCommentTarget: true,
279
+ // Listen whenever comments are supported, so the first hover or focus can check creation.
280
+ var commentTargetOptions = supportsComments && isFullPageRenderer ? {
281
+ isCommentTarget: isCommentTarget,
244
282
  onBlur: onBlur,
245
283
  onFocus: onFocus,
246
284
  onMouseEnter: onMouseEnter,
@@ -79,7 +79,7 @@ var DEGRADED_SEVERITY_THRESHOLD = exports.DEGRADED_SEVERITY_THRESHOLD = 3000;
79
79
  var TABLE_INFO_TIMEOUT = 10000;
80
80
  var RENDER_EVENT_SAMPLE_RATE = 0.1;
81
81
  var packageName = "@atlaskit/renderer";
82
- var packageVersion = "150.0.7";
82
+ var packageVersion = "151.0.1";
83
83
  var setAsQueryContainerStyles = (0, _react2.css)({
84
84
  containerName: 'ak-renderer-wrapper',
85
85
  containerType: 'inline-size'
@@ -4,7 +4,7 @@ import _extends from "@babel/runtime/helpers/extends";
4
4
  * @jsx jsx
5
5
  */
6
6
 
7
- import React, { useCallback, useContext, useEffect, useMemo, useRef } from 'react';
7
+ import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
8
8
 
9
9
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
10
10
  import { jsx, css } from '@emotion/react';
@@ -190,31 +190,67 @@ const ExtensionWithAnnotations = props => {
190
190
  const isBlockNodeSupported = providers === null || providers === void 0 ? void 0 : (_providers$inlineComm = providers.inlineComment) === null || _providers$inlineComm === void 0 ? void 0 : _providers$inlineComm.isBlockNodeSupported;
191
191
  const supportsComments = useMemo(() => Boolean(props.extensionNode && (isBlockNodeSupported === null || isBlockNodeSupported === void 0 ? void 0 : isBlockNodeSupported(props.extensionNode)) === true), [props.extensionNode, isBlockNodeSupported]);
192
192
  const canCreateCommentOnBlockNode = providers === null || providers === void 0 ? void 0 : (_providers$inlineComm2 = providers.inlineComment) === null || _providers$inlineComm2 === void 0 ? void 0 : _providers$inlineComm2.canCreateCommentOnBlockNode;
193
- const isCommentTarget = useMemo(() => Boolean(supportsComments && props.extensionNode && (!canCreateCommentOnBlockNode || canCreateCommentOnBlockNode(props.extensionNode))), [supportsComments, props.extensionNode, canCreateCommentOnBlockNode]);
194
193
  const isFullPageRenderer = props.rendererAppearance === 'full-page' || props.rendererAppearance === 'full-width';
194
+ // The creation policy may fire an experiment exposure. In the full-page renderer it is only
195
+ // checked once the user hovers or focuses the extension, where the comment target appears.
196
+ // Other renderers have no hover entry point, so they keep checking during render. Saved
197
+ // threads stay viewable through `supportsComments`.
198
+ // Only an allowed result is stored. A rejection is not cached because it can be temporary (for
199
+ // example before Statsig initializes), so the check runs again on the next hover or focus.
200
+ const [allowedCommentNode, setAllowedCommentNode] = useState();
201
+ const canCreateDuringRender = useMemo(() => !isFullPageRenderer && Boolean(supportsComments && props.extensionNode && (canCreateCommentOnBlockNode === null || canCreateCommentOnBlockNode === void 0 ? void 0 : canCreateCommentOnBlockNode(props.extensionNode))), [isFullPageRenderer, supportsComments, props.extensionNode, canCreateCommentOnBlockNode]);
202
+ const isCommentTarget = Boolean(supportsComments && props.extensionNode && (!canCreateCommentOnBlockNode || canCreateDuringRender || allowedCommentNode === props.extensionNode));
203
+ const isCommentTargetRef = useRef(isCommentTarget);
204
+ isCommentTargetRef.current = isCommentTarget;
205
+ const resolveCommentTarget = useCallback(target => {
206
+ if (isCommentTargetRef.current) {
207
+ return true;
208
+ }
209
+ const node = props.extensionNode;
210
+ if (!supportsComments || !node || !canCreateCommentOnBlockNode || !canCreateCommentOnBlockNode(node)) {
211
+ return false;
212
+ }
213
+ // The hover target is matched against this attribute before React re-renders, so set it
214
+ // now; the batched render below writes the same value.
215
+ target.dataset.inlineCommentsTarget = 'true';
216
+ isCommentTargetRef.current = true;
217
+ setAllowedCommentNode(node);
218
+ return true;
219
+ }, [supportsComments, props.extensionNode, canCreateCommentOnBlockNode]);
195
220
  const onMouseEnter = useCallback(event => {
221
+ if (!resolveCommentTarget(event.currentTarget)) {
222
+ return;
223
+ }
196
224
  cancelTimeout();
197
225
  if (event.buttons === 0) {
198
226
  setHoverTarget === null || setHoverTarget === void 0 ? void 0 : setHoverTarget(event.currentTarget);
199
227
  setIsWithinRange(true);
200
228
  }
201
- }, [cancelTimeout, setHoverTarget, setIsWithinRange]);
202
- const onMouseLeave = useCallback(() => initiateTimeout(), [initiateTimeout]);
229
+ }, [cancelTimeout, resolveCommentTarget, setHoverTarget, setIsWithinRange]);
230
+ const onMouseLeave = useCallback(() => {
231
+ if (isCommentTargetRef.current) {
232
+ initiateTimeout();
233
+ }
234
+ }, [initiateTimeout]);
203
235
  const onFocus = useCallback(event => {
204
236
  if (event.currentTarget.contains(event.relatedTarget)) {
205
237
  return;
206
238
  }
239
+ if (!resolveCommentTarget(event.currentTarget)) {
240
+ return;
241
+ }
207
242
  cancelTimeout();
208
243
  setHoverTarget === null || setHoverTarget === void 0 ? void 0 : setHoverTarget(event.currentTarget);
209
244
  setIsWithinRange(true);
210
- }, [cancelTimeout, setHoverTarget, setIsWithinRange]);
245
+ }, [cancelTimeout, resolveCommentTarget, setHoverTarget, setIsWithinRange]);
211
246
  const onBlur = useCallback(event => {
212
- if (!event.currentTarget.contains(event.relatedTarget)) {
247
+ if (isCommentTargetRef.current && !event.currentTarget.contains(event.relatedTarget)) {
213
248
  initiateTimeout();
214
249
  }
215
250
  }, [initiateTimeout]);
216
- const commentTargetOptions = isCommentTarget && isFullPageRenderer ? {
217
- isCommentTarget: true,
251
+ // Listen whenever comments are supported, so the first hover or focus can check creation.
252
+ const commentTargetOptions = supportsComments && isFullPageRenderer ? {
253
+ isCommentTarget,
218
254
  onBlur,
219
255
  onFocus,
220
256
  onMouseEnter,
@@ -64,7 +64,7 @@ export const DEGRADED_SEVERITY_THRESHOLD = 3000;
64
64
  const TABLE_INFO_TIMEOUT = 10000;
65
65
  const RENDER_EVENT_SAMPLE_RATE = 0.1;
66
66
  const packageName = "@atlaskit/renderer";
67
- const packageVersion = "150.0.7";
67
+ const packageVersion = "151.0.1";
68
68
  const setAsQueryContainerStyles = css({
69
69
  containerName: 'ak-renderer-wrapper',
70
70
  containerType: 'inline-size'
@@ -1,6 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
3
  import _extends from "@babel/runtime/helpers/extends";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
5
  var _excluded = ["commentProps", "commentTargetOptions"];
5
6
  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; }
6
7
  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; }
@@ -9,7 +10,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
9
10
  * @jsx jsx
10
11
  */
11
12
 
12
- import React, { useCallback, useContext, useEffect, useMemo, useRef } from 'react';
13
+ import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
13
14
 
14
15
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
15
16
  import { jsx, css } from '@emotion/react';
@@ -205,35 +206,72 @@ var ExtensionWithAnnotations = function ExtensionWithAnnotations(props) {
205
206
  return Boolean(props.extensionNode && (isBlockNodeSupported === null || isBlockNodeSupported === void 0 ? void 0 : isBlockNodeSupported(props.extensionNode)) === true);
206
207
  }, [props.extensionNode, isBlockNodeSupported]);
207
208
  var canCreateCommentOnBlockNode = providers === null || providers === void 0 || (_providers$inlineComm2 = providers.inlineComment) === null || _providers$inlineComm2 === void 0 ? void 0 : _providers$inlineComm2.canCreateCommentOnBlockNode;
208
- var isCommentTarget = useMemo(function () {
209
- return Boolean(supportsComments && props.extensionNode && (!canCreateCommentOnBlockNode || canCreateCommentOnBlockNode(props.extensionNode)));
210
- }, [supportsComments, props.extensionNode, canCreateCommentOnBlockNode]);
211
209
  var isFullPageRenderer = props.rendererAppearance === 'full-page' || props.rendererAppearance === 'full-width';
210
+ // The creation policy may fire an experiment exposure. In the full-page renderer it is only
211
+ // checked once the user hovers or focuses the extension, where the comment target appears.
212
+ // Other renderers have no hover entry point, so they keep checking during render. Saved
213
+ // threads stay viewable through `supportsComments`.
214
+ // Only an allowed result is stored. A rejection is not cached because it can be temporary (for
215
+ // example before Statsig initializes), so the check runs again on the next hover or focus.
216
+ var _useState = useState(),
217
+ _useState2 = _slicedToArray(_useState, 2),
218
+ allowedCommentNode = _useState2[0],
219
+ setAllowedCommentNode = _useState2[1];
220
+ var canCreateDuringRender = useMemo(function () {
221
+ return !isFullPageRenderer && Boolean(supportsComments && props.extensionNode && (canCreateCommentOnBlockNode === null || canCreateCommentOnBlockNode === void 0 ? void 0 : canCreateCommentOnBlockNode(props.extensionNode)));
222
+ }, [isFullPageRenderer, supportsComments, props.extensionNode, canCreateCommentOnBlockNode]);
223
+ var isCommentTarget = Boolean(supportsComments && props.extensionNode && (!canCreateCommentOnBlockNode || canCreateDuringRender || allowedCommentNode === props.extensionNode));
224
+ var isCommentTargetRef = useRef(isCommentTarget);
225
+ isCommentTargetRef.current = isCommentTarget;
226
+ var resolveCommentTarget = useCallback(function (target) {
227
+ if (isCommentTargetRef.current) {
228
+ return true;
229
+ }
230
+ var node = props.extensionNode;
231
+ if (!supportsComments || !node || !canCreateCommentOnBlockNode || !canCreateCommentOnBlockNode(node)) {
232
+ return false;
233
+ }
234
+ // The hover target is matched against this attribute before React re-renders, so set it
235
+ // now; the batched render below writes the same value.
236
+ target.dataset.inlineCommentsTarget = 'true';
237
+ isCommentTargetRef.current = true;
238
+ setAllowedCommentNode(node);
239
+ return true;
240
+ }, [supportsComments, props.extensionNode, canCreateCommentOnBlockNode]);
212
241
  var onMouseEnter = useCallback(function (event) {
242
+ if (!resolveCommentTarget(event.currentTarget)) {
243
+ return;
244
+ }
213
245
  cancelTimeout();
214
246
  if (event.buttons === 0) {
215
247
  setHoverTarget === null || setHoverTarget === void 0 || setHoverTarget(event.currentTarget);
216
248
  setIsWithinRange(true);
217
249
  }
218
- }, [cancelTimeout, setHoverTarget, setIsWithinRange]);
250
+ }, [cancelTimeout, resolveCommentTarget, setHoverTarget, setIsWithinRange]);
219
251
  var onMouseLeave = useCallback(function () {
220
- return initiateTimeout();
252
+ if (isCommentTargetRef.current) {
253
+ initiateTimeout();
254
+ }
221
255
  }, [initiateTimeout]);
222
256
  var onFocus = useCallback(function (event) {
223
257
  if (event.currentTarget.contains(event.relatedTarget)) {
224
258
  return;
225
259
  }
260
+ if (!resolveCommentTarget(event.currentTarget)) {
261
+ return;
262
+ }
226
263
  cancelTimeout();
227
264
  setHoverTarget === null || setHoverTarget === void 0 || setHoverTarget(event.currentTarget);
228
265
  setIsWithinRange(true);
229
- }, [cancelTimeout, setHoverTarget, setIsWithinRange]);
266
+ }, [cancelTimeout, resolveCommentTarget, setHoverTarget, setIsWithinRange]);
230
267
  var onBlur = useCallback(function (event) {
231
- if (!event.currentTarget.contains(event.relatedTarget)) {
268
+ if (isCommentTargetRef.current && !event.currentTarget.contains(event.relatedTarget)) {
232
269
  initiateTimeout();
233
270
  }
234
271
  }, [initiateTimeout]);
235
- var commentTargetOptions = isCommentTarget && isFullPageRenderer ? {
236
- isCommentTarget: true,
272
+ // Listen whenever comments are supported, so the first hover or focus can check creation.
273
+ var commentTargetOptions = supportsComments && isFullPageRenderer ? {
274
+ isCommentTarget: isCommentTarget,
237
275
  onBlur: onBlur,
238
276
  onFocus: onFocus,
239
277
  onMouseEnter: onMouseEnter,
@@ -69,7 +69,7 @@ export var DEGRADED_SEVERITY_THRESHOLD = 3000;
69
69
  var TABLE_INFO_TIMEOUT = 10000;
70
70
  var RENDER_EVENT_SAMPLE_RATE = 0.1;
71
71
  var packageName = "@atlaskit/renderer";
72
- var packageVersion = "150.0.7";
72
+ var packageVersion = "151.0.1";
73
73
  var setAsQueryContainerStyles = css({
74
74
  containerName: 'ak-renderer-wrapper',
75
75
  containerType: 'inline-size'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/renderer",
3
- "version": "151.0.0",
3
+ "version": "151.0.1",
4
4
  "description": "Renderer component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"