@atlaskit/editor-synced-block-renderer 5.1.0 → 5.2.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,26 @@
1
1
  # @atlaskit/editor-synced-block-renderer
2
2
 
3
+ ## 5.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`1f4c761b661e1`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/1f4c761b661e1) -
8
+ [ux] EDITOR-4174 wrap synced block and bodied sync block with sentry error boundaries
9
+ - Updated dependencies
10
+
11
+ ## 5.2.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [`8100ae00326b4`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/8100ae00326b4) -
16
+ EDITOR-2850-add media ssr support for sync blocks
17
+
18
+ ### Patch Changes
19
+
20
+ - [`fff45a651440a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/fff45a651440a) -
21
+ EDITOR-1665 add experience tracking analytics for sync block save, fetch and delete
22
+ - Updated dependencies
23
+
3
24
  ## 5.1.0
4
25
 
5
26
  ### Minor Changes
@@ -1,5 +1,5 @@
1
1
  {
2
- "extends": "../../../../tsconfig.entry-points.confluence.json",
2
+ "extends": "../../../../tsconfig.local-consumption.json",
3
3
  "compilerOptions": {
4
4
  "target": "es5",
5
5
  "outDir": "../../../../../confluence/tsDist/@atlaskit__editor-synced-block-renderer",
@@ -47,6 +47,9 @@
47
47
  {
48
48
  "path": "../../../design-system/image/afm-jira/tsconfig.json"
49
49
  },
50
+ {
51
+ "path": "../../../platform/feature-flags/afm-jira/tsconfig.json"
52
+ },
50
53
  {
51
54
  "path": "../../../design-system/primitives/afm-jira/tsconfig.json"
52
55
  },
@@ -47,6 +47,9 @@
47
47
  {
48
48
  "path": "../../../design-system/image/afm-products/tsconfig.json"
49
49
  },
50
+ {
51
+ "path": "../../../platform/feature-flags/afm-products/tsconfig.json"
52
+ },
50
53
  {
51
54
  "path": "../../../design-system/primitives/afm-products/tsconfig.json"
52
55
  },
@@ -10,6 +10,8 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
10
10
  var _react = _interopRequireDefault(require("react"));
11
11
  var _syncBlock = require("@atlaskit/editor-common/sync-block");
12
12
  var _editorSyncedBlockProvider = require("@atlaskit/editor-synced-block-provider");
13
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
14
+ var _experienceTracking = require("../utils/experience-tracking");
13
15
  var _AKRendererWrapper = require("./AKRendererWrapper");
14
16
  var _SyncedBlockErrorComponent = require("./SyncedBlockErrorComponent");
15
17
  var _SyncedBlockLoadingState = require("./SyncedBlockLoadingState");
@@ -21,6 +23,9 @@ var SyncedBlockNodeComponentRenderer = exports.SyncedBlockNodeComponentRenderer
21
23
  localId = nodeProps.localId,
22
24
  fireAnalyticsEvent = nodeProps.fireAnalyticsEvent;
23
25
  syncBlockStoreManager.referenceManager.updateFireAnalyticsEvent(fireAnalyticsEvent);
26
+ if ((0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
27
+ (0, _experienceTracking.setupExperienceTracking)(syncBlockStoreManager, fireAnalyticsEvent);
28
+ }
24
29
  var _useFetchSyncBlockDat = (0, _editorSyncedBlockProvider.useFetchSyncBlockData)(syncBlockStoreManager, resourceId, localId, fireAnalyticsEvent),
25
30
  syncBlockInstance = _useFetchSyncBlockDat.syncBlockInstance,
26
31
  isLoading = _useFetchSyncBlockDat.isLoading,
@@ -1,17 +1,23 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.SyncedBlockRenderer = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
10
  var _react = _interopRequireWildcard(require("react"));
11
+ var _coreUtils = require("@atlaskit/editor-common/core-utils");
9
12
  var _hooks = require("@atlaskit/editor-common/hooks");
10
13
  var _editorSyncedBlockProvider = require("@atlaskit/editor-synced-block-provider");
14
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
15
  var _AKRendererWrapper = require("./AKRendererWrapper");
12
16
  var _SyncedBlockErrorComponent = require("./SyncedBlockErrorComponent");
13
17
  var _SyncedBlockLoadingState = require("./SyncedBlockLoadingState");
14
18
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
19
+ 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; }
20
+ 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) { (0, _defineProperty2.default)(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; }
15
21
  var SyncedBlockRendererComponent = function SyncedBlockRendererComponent(_ref) {
16
22
  var useFetchSyncBlockData = _ref.useFetchSyncBlockData,
17
23
  syncBlockRendererOptions = _ref.syncBlockRendererOptions,
@@ -20,7 +26,25 @@ var SyncedBlockRendererComponent = function SyncedBlockRendererComponent(_ref) {
20
26
  syncBlockInstance = _useFetchSyncBlockDat.syncBlockInstance,
21
27
  providerFactory = _useFetchSyncBlockDat.providerFactory,
22
28
  isLoading = _useFetchSyncBlockDat.isLoading,
23
- reloadData = _useFetchSyncBlockDat.reloadData;
29
+ reloadData = _useFetchSyncBlockDat.reloadData,
30
+ ssrProviders = _useFetchSyncBlockDat.ssrProviders;
31
+ var rendererOptions = (0, _react.useMemo)(function () {
32
+ var _syncBlockRendererOpt, _ssrProviders$media;
33
+ if (!(0, _coreUtils.isSSR)() || syncBlockRendererOptions !== null && syncBlockRendererOptions !== void 0 && (_syncBlockRendererOpt = syncBlockRendererOptions.media) !== null && _syncBlockRendererOpt !== void 0 && _syncBlockRendererOpt.ssr ||
34
+ // already has ssr config
35
+ !(ssrProviders !== null && ssrProviders !== void 0 && (_ssrProviders$media = ssrProviders.media) !== null && _ssrProviders$media !== void 0 && _ssrProviders$media.viewMediaClientConfig) || !(0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
36
+ return syncBlockRendererOptions;
37
+ }
38
+ var mediaSSR = {
39
+ mode: 'server',
40
+ config: ssrProviders === null || ssrProviders === void 0 ? void 0 : ssrProviders.media.viewMediaClientConfig
41
+ };
42
+ return _objectSpread(_objectSpread({}, syncBlockRendererOptions), {}, {
43
+ media: _objectSpread(_objectSpread({}, (syncBlockRendererOptions === null || syncBlockRendererOptions === void 0 ? void 0 : syncBlockRendererOptions.media) || {}), {}, {
44
+ ssr: mediaSSR
45
+ })
46
+ });
47
+ }, [syncBlockRendererOptions, ssrProviders]);
24
48
  var _useSharedPluginState = (0, _hooks.useSharedPluginStateWithSelector)(api, ['connectivity'], function (_ref2) {
25
49
  var connectivityState = _ref2.connectivityState;
26
50
  return {
@@ -54,7 +78,7 @@ var SyncedBlockRendererComponent = function SyncedBlockRendererComponent(_ref) {
54
78
  return /*#__PURE__*/_react.default.createElement(_AKRendererWrapper.AKRendererWrapper, {
55
79
  doc: syncBlockDoc,
56
80
  dataProviders: providerFactory,
57
- options: syncBlockRendererOptions
81
+ options: rendererOptions
58
82
  });
59
83
  };
60
84
  var SyncedBlockRenderer = exports.SyncedBlockRenderer = /*#__PURE__*/(0, _react.memo)(SyncedBlockRendererComponent);
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.useMemoizedSyncedBlockNodeComponent = exports.getSyncBlockNodesFromDoc = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
+ var _analytics = require("@atlaskit/editor-common/analytics");
10
+ var _errorBoundary = require("@atlaskit/editor-common/error-boundary");
9
11
  var _editorSyncedBlockProvider = require("@atlaskit/editor-synced-block-provider");
10
12
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
13
  var _SyncedBlockNodeComponentRenderer = require("./ui/SyncedBlockNodeComponentRenderer");
@@ -43,11 +45,20 @@ var useMemoizedSyncedBlockNodeComponent = exports.useMemoizedSyncedBlockNodeComp
43
45
  syncBlockStoreManager.referenceManager.fetchSyncBlocksData(syncBlockNodes);
44
46
  }, [syncBlockNodes, syncBlockStoreManager.referenceManager]);
45
47
  return (0, _react.useCallback)(function (props) {
46
- return /*#__PURE__*/_react.default.createElement(_SyncedBlockNodeComponentRenderer.SyncedBlockNodeComponentRenderer, {
48
+ return (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding') ? /*#__PURE__*/_react.default.createElement(_errorBoundary.ErrorBoundary, {
49
+ component: _analytics.ACTION_SUBJECT.SYNCED_BLOCK,
50
+ dispatchAnalyticsEvent: fireAnalyticsEvent,
51
+ fallbackComponent: null
52
+ }, /*#__PURE__*/_react.default.createElement(_SyncedBlockNodeComponentRenderer.SyncedBlockNodeComponentRenderer, {
53
+ key: props.localId,
54
+ nodeProps: props,
55
+ syncBlockStoreManager: syncBlockStoreManager,
56
+ rendererOptions: syncBlockRendererOptions
57
+ })) : /*#__PURE__*/_react.default.createElement(_SyncedBlockNodeComponentRenderer.SyncedBlockNodeComponentRenderer, {
47
58
  key: props.localId,
48
59
  nodeProps: props,
49
60
  syncBlockStoreManager: syncBlockStoreManager,
50
61
  rendererOptions: syncBlockRendererOptions
51
62
  });
52
- }, [syncBlockStoreManager, syncBlockRendererOptions]);
63
+ }, [syncBlockStoreManager, syncBlockRendererOptions, fireAnalyticsEvent]);
53
64
  };
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.setupExperienceTracking = exports.getSaveReferenceExperience = exports.getFetchSourceInfoExperience = exports.getFetchExperience = exports.createExperienceDispatcher = void 0;
7
+ var _analytics = require("@atlaskit/editor-common/analytics");
8
+ var _experiences = require("@atlaskit/editor-common/experiences");
9
+ var setupExperienceTracking = exports.setupExperienceTracking = function setupExperienceTracking(syncBlockStoreManager, fireAnalyticsEvent) {
10
+ if (!fireAnalyticsEvent) {
11
+ return;
12
+ }
13
+ var dispatchAnalyticsEvent = createExperienceDispatcher(fireAnalyticsEvent);
14
+ syncBlockStoreManager.referenceManager.setExperiences(getFetchExperience(dispatchAnalyticsEvent), getFetchSourceInfoExperience(dispatchAnalyticsEvent), getSaveReferenceExperience(dispatchAnalyticsEvent));
15
+ };
16
+ var createExperienceDispatcher = exports.createExperienceDispatcher = function createExperienceDispatcher(fireAnalyticsEvent) {
17
+ return function (payload) {
18
+ // Runtime type guard - only forward experience events
19
+ if (payload.action === 'experienceMeasured' || payload.action === 'experienceSampled') {
20
+ fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 || fireAnalyticsEvent(payload);
21
+ }
22
+ };
23
+ };
24
+
25
+ /**
26
+ * This experience tracks when a reference sync block data is fetched from the BE.
27
+ *
28
+ * Start: When the fetchNodesData function is called.
29
+ * Success: When the fetching the data is successful within 1500ms of start.
30
+ * Failure: When 1500ms passes without the data being successfully fetched, or the fetch fails
31
+ */
32
+ var getFetchExperience = exports.getFetchExperience = function getFetchExperience(dispatchAnalyticsEvent) {
33
+ return new _experiences.Experience(_analytics.ACTION_SUBJECT.SYNCED_BLOCK, {
34
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_FETCH,
35
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
36
+ checks: [new _experiences.ExperienceCheckTimeout({
37
+ durationMs: 1500
38
+ })]
39
+ });
40
+ };
41
+
42
+ /**
43
+ * This experience tracks when a reference sync block source info data (title, url) is fetched from the BE.
44
+ *
45
+ * Start: When the fetchSourceInfo function is called.
46
+ * Success: When the fetching the data is successful within 2500ms of start.
47
+ * Failure: When 2500ms passes without the data being successfully fetched, or the fetch fails
48
+ */
49
+ var getFetchSourceInfoExperience = exports.getFetchSourceInfoExperience = function getFetchSourceInfoExperience(dispatchAnalyticsEvent) {
50
+ return new _experiences.Experience(_analytics.ACTION_SUBJECT.SYNCED_BLOCK, {
51
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.SYNCED_BLOCK_GET_SOURCE_INFO,
52
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
53
+ checks: [new _experiences.ExperienceCheckTimeout({
54
+ durationMs: 2500
55
+ })]
56
+ });
57
+ };
58
+
59
+ /**
60
+ * This experience tracks when a reference sync block is saved to the BE.
61
+ *
62
+ * Start: When the flush sync block function is called.
63
+ * Success: When the sync block save is successful within 1500ms of start.
64
+ * Failure: When 1500ms passes before the sync block save is marked as successful
65
+ */
66
+ var getSaveReferenceExperience = exports.getSaveReferenceExperience = function getSaveReferenceExperience(dispatchAnalyticsEvent) {
67
+ return new _experiences.Experience(_analytics.ACTION_SUBJECT.SYNCED_BLOCK, {
68
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.REFERENCE_SYNCED_BLOCK_UPDATE,
69
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
70
+ checks: [new _experiences.ExperienceCheckTimeout({
71
+ durationMs: 1500
72
+ })]
73
+ });
74
+ };
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
2
  import { SyncBlockSharedCssClassName, SyncBlockRendererDataAttributeName } from '@atlaskit/editor-common/sync-block';
3
3
  import { SyncBlockError, useFetchSyncBlockData } from '@atlaskit/editor-synced-block-provider';
4
+ import { fg } from '@atlaskit/platform-feature-flags';
5
+ import { setupExperienceTracking } from '../utils/experience-tracking';
4
6
  import { AKRendererWrapper } from './AKRendererWrapper';
5
7
  import { SyncedBlockErrorComponent } from './SyncedBlockErrorComponent';
6
8
  import { SyncedBlockLoadingState } from './SyncedBlockLoadingState';
@@ -15,6 +17,9 @@ export const SyncedBlockNodeComponentRenderer = ({
15
17
  fireAnalyticsEvent
16
18
  } = nodeProps;
17
19
  syncBlockStoreManager.referenceManager.updateFireAnalyticsEvent(fireAnalyticsEvent);
20
+ if (fg('platform_synced_block_dogfooding')) {
21
+ setupExperienceTracking(syncBlockStoreManager, fireAnalyticsEvent);
22
+ }
18
23
  const {
19
24
  syncBlockInstance,
20
25
  isLoading,
@@ -1,6 +1,8 @@
1
- import React, { memo } from 'react';
1
+ import React, { memo, useMemo } from 'react';
2
+ import { isSSR } from '@atlaskit/editor-common/core-utils';
2
3
  import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
3
4
  import { SyncBlockError } from '@atlaskit/editor-synced-block-provider';
5
+ import { fg } from '@atlaskit/platform-feature-flags';
4
6
  import { AKRendererWrapper } from './AKRendererWrapper';
5
7
  import { SyncedBlockErrorComponent } from './SyncedBlockErrorComponent';
6
8
  import { SyncedBlockLoadingState } from './SyncedBlockLoadingState';
@@ -13,8 +15,28 @@ const SyncedBlockRendererComponent = ({
13
15
  syncBlockInstance,
14
16
  providerFactory,
15
17
  isLoading,
16
- reloadData
18
+ reloadData,
19
+ ssrProviders
17
20
  } = useFetchSyncBlockData();
21
+ const rendererOptions = useMemo(() => {
22
+ var _syncBlockRendererOpt, _ssrProviders$media;
23
+ if (!isSSR() || syncBlockRendererOptions !== null && syncBlockRendererOptions !== void 0 && (_syncBlockRendererOpt = syncBlockRendererOptions.media) !== null && _syncBlockRendererOpt !== void 0 && _syncBlockRendererOpt.ssr ||
24
+ // already has ssr config
25
+ !(ssrProviders !== null && ssrProviders !== void 0 && (_ssrProviders$media = ssrProviders.media) !== null && _ssrProviders$media !== void 0 && _ssrProviders$media.viewMediaClientConfig) || !fg('platform_synced_block_dogfooding')) {
26
+ return syncBlockRendererOptions;
27
+ }
28
+ const mediaSSR = {
29
+ mode: 'server',
30
+ config: ssrProviders === null || ssrProviders === void 0 ? void 0 : ssrProviders.media.viewMediaClientConfig
31
+ };
32
+ return {
33
+ ...syncBlockRendererOptions,
34
+ media: {
35
+ ...((syncBlockRendererOptions === null || syncBlockRendererOptions === void 0 ? void 0 : syncBlockRendererOptions.media) || {}),
36
+ ssr: mediaSSR
37
+ }
38
+ };
39
+ }, [syncBlockRendererOptions, ssrProviders]);
18
40
  const {
19
41
  isInternetOffline
20
42
  } = useSharedPluginStateWithSelector(api, ['connectivity'], ({
@@ -48,7 +70,7 @@ const SyncedBlockRendererComponent = ({
48
70
  return /*#__PURE__*/React.createElement(AKRendererWrapper, {
49
71
  doc: syncBlockDoc,
50
72
  dataProviders: providerFactory,
51
- options: syncBlockRendererOptions
73
+ options: rendererOptions
52
74
  });
53
75
  };
54
76
  export const SyncedBlockRenderer = /*#__PURE__*/memo(SyncedBlockRendererComponent);
@@ -1,4 +1,6 @@
1
1
  import React, { useCallback, useEffect } from 'react';
2
+ import { ACTION_SUBJECT } from '@atlaskit/editor-common/analytics';
3
+ import { ErrorBoundary } from '@atlaskit/editor-common/error-boundary';
2
4
  import { convertSyncBlockJSONNodeToSyncBlockNode, useMemoizedSyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
3
5
  import { fg } from '@atlaskit/platform-feature-flags';
4
6
  import { SyncedBlockNodeComponentRenderer } from './ui/SyncedBlockNodeComponentRenderer';
@@ -33,10 +35,19 @@ export const useMemoizedSyncedBlockNodeComponent = ({
33
35
  useEffect(() => {
34
36
  syncBlockStoreManager.referenceManager.fetchSyncBlocksData(syncBlockNodes);
35
37
  }, [syncBlockNodes, syncBlockStoreManager.referenceManager]);
36
- return useCallback(props => /*#__PURE__*/React.createElement(SyncedBlockNodeComponentRenderer, {
38
+ return useCallback(props => fg('platform_synced_block_dogfooding') ? /*#__PURE__*/React.createElement(ErrorBoundary, {
39
+ component: ACTION_SUBJECT.SYNCED_BLOCK,
40
+ dispatchAnalyticsEvent: fireAnalyticsEvent,
41
+ fallbackComponent: null
42
+ }, /*#__PURE__*/React.createElement(SyncedBlockNodeComponentRenderer, {
37
43
  key: props.localId,
38
44
  nodeProps: props,
39
45
  syncBlockStoreManager: syncBlockStoreManager,
40
46
  rendererOptions: syncBlockRendererOptions
41
- }), [syncBlockStoreManager, syncBlockRendererOptions]);
47
+ })) : /*#__PURE__*/React.createElement(SyncedBlockNodeComponentRenderer, {
48
+ key: props.localId,
49
+ nodeProps: props,
50
+ syncBlockStoreManager: syncBlockStoreManager,
51
+ rendererOptions: syncBlockRendererOptions
52
+ }), [syncBlockStoreManager, syncBlockRendererOptions, fireAnalyticsEvent]);
42
53
  };
@@ -0,0 +1,68 @@
1
+ import { ACTION_SUBJECT, ACTION_SUBJECT_ID } from '@atlaskit/editor-common/analytics';
2
+ import { Experience, ExperienceCheckTimeout } from '@atlaskit/editor-common/experiences';
3
+ export const setupExperienceTracking = (syncBlockStoreManager, fireAnalyticsEvent) => {
4
+ if (!fireAnalyticsEvent) {
5
+ return;
6
+ }
7
+ const dispatchAnalyticsEvent = createExperienceDispatcher(fireAnalyticsEvent);
8
+ syncBlockStoreManager.referenceManager.setExperiences(getFetchExperience(dispatchAnalyticsEvent), getFetchSourceInfoExperience(dispatchAnalyticsEvent), getSaveReferenceExperience(dispatchAnalyticsEvent));
9
+ };
10
+ export const createExperienceDispatcher = fireAnalyticsEvent => {
11
+ return payload => {
12
+ // Runtime type guard - only forward experience events
13
+ if (payload.action === 'experienceMeasured' || payload.action === 'experienceSampled') {
14
+ fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 ? void 0 : fireAnalyticsEvent(payload);
15
+ }
16
+ };
17
+ };
18
+
19
+ /**
20
+ * This experience tracks when a reference sync block data is fetched from the BE.
21
+ *
22
+ * Start: When the fetchNodesData function is called.
23
+ * Success: When the fetching the data is successful within 1500ms of start.
24
+ * Failure: When 1500ms passes without the data being successfully fetched, or the fetch fails
25
+ */
26
+ export const getFetchExperience = dispatchAnalyticsEvent => {
27
+ return new Experience(ACTION_SUBJECT.SYNCED_BLOCK, {
28
+ actionSubjectId: ACTION_SUBJECT_ID.SYNCED_BLOCK_FETCH,
29
+ dispatchAnalyticsEvent,
30
+ checks: [new ExperienceCheckTimeout({
31
+ durationMs: 1500
32
+ })]
33
+ });
34
+ };
35
+
36
+ /**
37
+ * This experience tracks when a reference sync block source info data (title, url) is fetched from the BE.
38
+ *
39
+ * Start: When the fetchSourceInfo function is called.
40
+ * Success: When the fetching the data is successful within 2500ms of start.
41
+ * Failure: When 2500ms passes without the data being successfully fetched, or the fetch fails
42
+ */
43
+ export const getFetchSourceInfoExperience = dispatchAnalyticsEvent => {
44
+ return new Experience(ACTION_SUBJECT.SYNCED_BLOCK, {
45
+ actionSubjectId: ACTION_SUBJECT_ID.SYNCED_BLOCK_GET_SOURCE_INFO,
46
+ dispatchAnalyticsEvent,
47
+ checks: [new ExperienceCheckTimeout({
48
+ durationMs: 2500
49
+ })]
50
+ });
51
+ };
52
+
53
+ /**
54
+ * This experience tracks when a reference sync block is saved to the BE.
55
+ *
56
+ * Start: When the flush sync block function is called.
57
+ * Success: When the sync block save is successful within 1500ms of start.
58
+ * Failure: When 1500ms passes before the sync block save is marked as successful
59
+ */
60
+ export const getSaveReferenceExperience = dispatchAnalyticsEvent => {
61
+ return new Experience(ACTION_SUBJECT.SYNCED_BLOCK, {
62
+ actionSubjectId: ACTION_SUBJECT_ID.REFERENCE_SYNCED_BLOCK_UPDATE,
63
+ dispatchAnalyticsEvent,
64
+ checks: [new ExperienceCheckTimeout({
65
+ durationMs: 1500
66
+ })]
67
+ });
68
+ };
@@ -3,6 +3,8 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import React from 'react';
4
4
  import { SyncBlockSharedCssClassName, SyncBlockRendererDataAttributeName } from '@atlaskit/editor-common/sync-block';
5
5
  import { SyncBlockError, useFetchSyncBlockData } from '@atlaskit/editor-synced-block-provider';
6
+ import { fg } from '@atlaskit/platform-feature-flags';
7
+ import { setupExperienceTracking } from '../utils/experience-tracking';
6
8
  import { AKRendererWrapper } from './AKRendererWrapper';
7
9
  import { SyncedBlockErrorComponent } from './SyncedBlockErrorComponent';
8
10
  import { SyncedBlockLoadingState } from './SyncedBlockLoadingState';
@@ -14,6 +16,9 @@ export var SyncedBlockNodeComponentRenderer = function SyncedBlockNodeComponentR
14
16
  localId = nodeProps.localId,
15
17
  fireAnalyticsEvent = nodeProps.fireAnalyticsEvent;
16
18
  syncBlockStoreManager.referenceManager.updateFireAnalyticsEvent(fireAnalyticsEvent);
19
+ if (fg('platform_synced_block_dogfooding')) {
20
+ setupExperienceTracking(syncBlockStoreManager, fireAnalyticsEvent);
21
+ }
17
22
  var _useFetchSyncBlockDat = useFetchSyncBlockData(syncBlockStoreManager, resourceId, localId, fireAnalyticsEvent),
18
23
  syncBlockInstance = _useFetchSyncBlockDat.syncBlockInstance,
19
24
  isLoading = _useFetchSyncBlockDat.isLoading,
@@ -1,6 +1,11 @@
1
- import React, { memo } from 'react';
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ 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; }
3
+ 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; }
4
+ import React, { memo, useMemo } from 'react';
5
+ import { isSSR } from '@atlaskit/editor-common/core-utils';
2
6
  import { useSharedPluginStateWithSelector } from '@atlaskit/editor-common/hooks';
3
7
  import { SyncBlockError } from '@atlaskit/editor-synced-block-provider';
8
+ import { fg } from '@atlaskit/platform-feature-flags';
4
9
  import { AKRendererWrapper } from './AKRendererWrapper';
5
10
  import { SyncedBlockErrorComponent } from './SyncedBlockErrorComponent';
6
11
  import { SyncedBlockLoadingState } from './SyncedBlockLoadingState';
@@ -12,7 +17,25 @@ var SyncedBlockRendererComponent = function SyncedBlockRendererComponent(_ref) {
12
17
  syncBlockInstance = _useFetchSyncBlockDat.syncBlockInstance,
13
18
  providerFactory = _useFetchSyncBlockDat.providerFactory,
14
19
  isLoading = _useFetchSyncBlockDat.isLoading,
15
- reloadData = _useFetchSyncBlockDat.reloadData;
20
+ reloadData = _useFetchSyncBlockDat.reloadData,
21
+ ssrProviders = _useFetchSyncBlockDat.ssrProviders;
22
+ var rendererOptions = useMemo(function () {
23
+ var _syncBlockRendererOpt, _ssrProviders$media;
24
+ if (!isSSR() || syncBlockRendererOptions !== null && syncBlockRendererOptions !== void 0 && (_syncBlockRendererOpt = syncBlockRendererOptions.media) !== null && _syncBlockRendererOpt !== void 0 && _syncBlockRendererOpt.ssr ||
25
+ // already has ssr config
26
+ !(ssrProviders !== null && ssrProviders !== void 0 && (_ssrProviders$media = ssrProviders.media) !== null && _ssrProviders$media !== void 0 && _ssrProviders$media.viewMediaClientConfig) || !fg('platform_synced_block_dogfooding')) {
27
+ return syncBlockRendererOptions;
28
+ }
29
+ var mediaSSR = {
30
+ mode: 'server',
31
+ config: ssrProviders === null || ssrProviders === void 0 ? void 0 : ssrProviders.media.viewMediaClientConfig
32
+ };
33
+ return _objectSpread(_objectSpread({}, syncBlockRendererOptions), {}, {
34
+ media: _objectSpread(_objectSpread({}, (syncBlockRendererOptions === null || syncBlockRendererOptions === void 0 ? void 0 : syncBlockRendererOptions.media) || {}), {}, {
35
+ ssr: mediaSSR
36
+ })
37
+ });
38
+ }, [syncBlockRendererOptions, ssrProviders]);
16
39
  var _useSharedPluginState = useSharedPluginStateWithSelector(api, ['connectivity'], function (_ref2) {
17
40
  var connectivityState = _ref2.connectivityState;
18
41
  return {
@@ -46,7 +69,7 @@ var SyncedBlockRendererComponent = function SyncedBlockRendererComponent(_ref) {
46
69
  return /*#__PURE__*/React.createElement(AKRendererWrapper, {
47
70
  doc: syncBlockDoc,
48
71
  dataProviders: providerFactory,
49
- options: syncBlockRendererOptions
72
+ options: rendererOptions
50
73
  });
51
74
  };
52
75
  export var SyncedBlockRenderer = /*#__PURE__*/memo(SyncedBlockRendererComponent);
@@ -1,4 +1,6 @@
1
1
  import React, { useCallback, useEffect } from 'react';
2
+ import { ACTION_SUBJECT } from '@atlaskit/editor-common/analytics';
3
+ import { ErrorBoundary } from '@atlaskit/editor-common/error-boundary';
2
4
  import { convertSyncBlockJSONNodeToSyncBlockNode, useMemoizedSyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
3
5
  import { fg } from '@atlaskit/platform-feature-flags';
4
6
  import { SyncedBlockNodeComponentRenderer } from './ui/SyncedBlockNodeComponentRenderer';
@@ -35,11 +37,20 @@ export var useMemoizedSyncedBlockNodeComponent = function useMemoizedSyncedBlock
35
37
  syncBlockStoreManager.referenceManager.fetchSyncBlocksData(syncBlockNodes);
36
38
  }, [syncBlockNodes, syncBlockStoreManager.referenceManager]);
37
39
  return useCallback(function (props) {
38
- return /*#__PURE__*/React.createElement(SyncedBlockNodeComponentRenderer, {
40
+ return fg('platform_synced_block_dogfooding') ? /*#__PURE__*/React.createElement(ErrorBoundary, {
41
+ component: ACTION_SUBJECT.SYNCED_BLOCK,
42
+ dispatchAnalyticsEvent: fireAnalyticsEvent,
43
+ fallbackComponent: null
44
+ }, /*#__PURE__*/React.createElement(SyncedBlockNodeComponentRenderer, {
45
+ key: props.localId,
46
+ nodeProps: props,
47
+ syncBlockStoreManager: syncBlockStoreManager,
48
+ rendererOptions: syncBlockRendererOptions
49
+ })) : /*#__PURE__*/React.createElement(SyncedBlockNodeComponentRenderer, {
39
50
  key: props.localId,
40
51
  nodeProps: props,
41
52
  syncBlockStoreManager: syncBlockStoreManager,
42
53
  rendererOptions: syncBlockRendererOptions
43
54
  });
44
- }, [syncBlockStoreManager, syncBlockRendererOptions]);
55
+ }, [syncBlockStoreManager, syncBlockRendererOptions, fireAnalyticsEvent]);
45
56
  };
@@ -0,0 +1,68 @@
1
+ import { ACTION_SUBJECT, ACTION_SUBJECT_ID } from '@atlaskit/editor-common/analytics';
2
+ import { Experience, ExperienceCheckTimeout } from '@atlaskit/editor-common/experiences';
3
+ export var setupExperienceTracking = function setupExperienceTracking(syncBlockStoreManager, fireAnalyticsEvent) {
4
+ if (!fireAnalyticsEvent) {
5
+ return;
6
+ }
7
+ var dispatchAnalyticsEvent = createExperienceDispatcher(fireAnalyticsEvent);
8
+ syncBlockStoreManager.referenceManager.setExperiences(getFetchExperience(dispatchAnalyticsEvent), getFetchSourceInfoExperience(dispatchAnalyticsEvent), getSaveReferenceExperience(dispatchAnalyticsEvent));
9
+ };
10
+ export var createExperienceDispatcher = function createExperienceDispatcher(fireAnalyticsEvent) {
11
+ return function (payload) {
12
+ // Runtime type guard - only forward experience events
13
+ if (payload.action === 'experienceMeasured' || payload.action === 'experienceSampled') {
14
+ fireAnalyticsEvent === null || fireAnalyticsEvent === void 0 || fireAnalyticsEvent(payload);
15
+ }
16
+ };
17
+ };
18
+
19
+ /**
20
+ * This experience tracks when a reference sync block data is fetched from the BE.
21
+ *
22
+ * Start: When the fetchNodesData function is called.
23
+ * Success: When the fetching the data is successful within 1500ms of start.
24
+ * Failure: When 1500ms passes without the data being successfully fetched, or the fetch fails
25
+ */
26
+ export var getFetchExperience = function getFetchExperience(dispatchAnalyticsEvent) {
27
+ return new Experience(ACTION_SUBJECT.SYNCED_BLOCK, {
28
+ actionSubjectId: ACTION_SUBJECT_ID.SYNCED_BLOCK_FETCH,
29
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
30
+ checks: [new ExperienceCheckTimeout({
31
+ durationMs: 1500
32
+ })]
33
+ });
34
+ };
35
+
36
+ /**
37
+ * This experience tracks when a reference sync block source info data (title, url) is fetched from the BE.
38
+ *
39
+ * Start: When the fetchSourceInfo function is called.
40
+ * Success: When the fetching the data is successful within 2500ms of start.
41
+ * Failure: When 2500ms passes without the data being successfully fetched, or the fetch fails
42
+ */
43
+ export var getFetchSourceInfoExperience = function getFetchSourceInfoExperience(dispatchAnalyticsEvent) {
44
+ return new Experience(ACTION_SUBJECT.SYNCED_BLOCK, {
45
+ actionSubjectId: ACTION_SUBJECT_ID.SYNCED_BLOCK_GET_SOURCE_INFO,
46
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
47
+ checks: [new ExperienceCheckTimeout({
48
+ durationMs: 2500
49
+ })]
50
+ });
51
+ };
52
+
53
+ /**
54
+ * This experience tracks when a reference sync block is saved to the BE.
55
+ *
56
+ * Start: When the flush sync block function is called.
57
+ * Success: When the sync block save is successful within 1500ms of start.
58
+ * Failure: When 1500ms passes before the sync block save is marked as successful
59
+ */
60
+ export var getSaveReferenceExperience = function getSaveReferenceExperience(dispatchAnalyticsEvent) {
61
+ return new Experience(ACTION_SUBJECT.SYNCED_BLOCK, {
62
+ actionSubjectId: ACTION_SUBJECT_ID.REFERENCE_SYNCED_BLOCK_UPDATE,
63
+ dispatchAnalyticsEvent: dispatchAnalyticsEvent,
64
+ checks: [new ExperienceCheckTimeout({
65
+ durationMs: 1500
66
+ })]
67
+ });
68
+ };
@@ -1,12 +1,12 @@
1
1
  import React from 'react';
2
2
  import type { DocNode } from '@atlaskit/adf-schema';
3
- import type { SyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
3
+ import { type AnalyticsEventPayload } from '@atlaskit/editor-common/analytics';
4
4
  import { type SyncBlockInstance, type SyncBlockNode } from '@atlaskit/editor-synced-block-provider';
5
5
  import type { SyncedBlockProvider } from '@atlaskit/editor-synced-block-provider';
6
6
  import type { SyncedBlockRendererOptions } from './types';
7
7
  import { type SyncedBlockNodeProps } from './ui/SyncedBlockNodeComponentRenderer';
8
8
  export type GetSyncedBlockNodeComponentProps = {
9
- fireAnalyticsEvent?: (payload: SyncBlockEventPayload) => void;
9
+ fireAnalyticsEvent?: (payload: AnalyticsEventPayload) => void;
10
10
  getSSRData?: () => Record<string, SyncBlockInstance> | undefined;
11
11
  syncBlockNodes: SyncBlockNode[];
12
12
  syncBlockProvider: SyncedBlockProvider;
@@ -0,0 +1,30 @@
1
+ import { type DispatchAnalyticsEvent } from '@atlaskit/editor-common/analytics';
2
+ import { Experience } from '@atlaskit/editor-common/experiences';
3
+ import type { SyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
4
+ import type { AnalyticsEventPayload as RendererAnalyticsEventPayload } from '@atlaskit/renderer';
5
+ export declare const setupExperienceTracking: (syncBlockStoreManager: SyncBlockStoreManager, fireAnalyticsEvent?: ((payload: RendererAnalyticsEventPayload) => void)) => void;
6
+ export declare const createExperienceDispatcher: (fireAnalyticsEvent?: ((payload: RendererAnalyticsEventPayload) => void)) => DispatchAnalyticsEvent;
7
+ /**
8
+ * This experience tracks when a reference sync block data is fetched from the BE.
9
+ *
10
+ * Start: When the fetchNodesData function is called.
11
+ * Success: When the fetching the data is successful within 1500ms of start.
12
+ * Failure: When 1500ms passes without the data being successfully fetched, or the fetch fails
13
+ */
14
+ export declare const getFetchExperience: (dispatchAnalyticsEvent: DispatchAnalyticsEvent) => Experience;
15
+ /**
16
+ * This experience tracks when a reference sync block source info data (title, url) is fetched from the BE.
17
+ *
18
+ * Start: When the fetchSourceInfo function is called.
19
+ * Success: When the fetching the data is successful within 2500ms of start.
20
+ * Failure: When 2500ms passes without the data being successfully fetched, or the fetch fails
21
+ */
22
+ export declare const getFetchSourceInfoExperience: (dispatchAnalyticsEvent: DispatchAnalyticsEvent) => Experience;
23
+ /**
24
+ * This experience tracks when a reference sync block is saved to the BE.
25
+ *
26
+ * Start: When the flush sync block function is called.
27
+ * Success: When the sync block save is successful within 1500ms of start.
28
+ * Failure: When 1500ms passes before the sync block save is marked as successful
29
+ */
30
+ export declare const getSaveReferenceExperience: (dispatchAnalyticsEvent: DispatchAnalyticsEvent) => Experience;
@@ -1,12 +1,12 @@
1
1
  import React from 'react';
2
2
  import type { DocNode } from '@atlaskit/adf-schema';
3
- import type { SyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
3
+ import { type AnalyticsEventPayload } from '@atlaskit/editor-common/analytics';
4
4
  import { type SyncBlockInstance, type SyncBlockNode } from '@atlaskit/editor-synced-block-provider';
5
5
  import type { SyncedBlockProvider } from '@atlaskit/editor-synced-block-provider';
6
6
  import type { SyncedBlockRendererOptions } from './types';
7
7
  import { type SyncedBlockNodeProps } from './ui/SyncedBlockNodeComponentRenderer';
8
8
  export type GetSyncedBlockNodeComponentProps = {
9
- fireAnalyticsEvent?: (payload: SyncBlockEventPayload) => void;
9
+ fireAnalyticsEvent?: (payload: AnalyticsEventPayload) => void;
10
10
  getSSRData?: () => Record<string, SyncBlockInstance> | undefined;
11
11
  syncBlockNodes: SyncBlockNode[];
12
12
  syncBlockProvider: SyncedBlockProvider;
@@ -0,0 +1,30 @@
1
+ import { type DispatchAnalyticsEvent } from '@atlaskit/editor-common/analytics';
2
+ import { Experience } from '@atlaskit/editor-common/experiences';
3
+ import type { SyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
4
+ import type { AnalyticsEventPayload as RendererAnalyticsEventPayload } from '@atlaskit/renderer';
5
+ export declare const setupExperienceTracking: (syncBlockStoreManager: SyncBlockStoreManager, fireAnalyticsEvent?: ((payload: RendererAnalyticsEventPayload) => void)) => void;
6
+ export declare const createExperienceDispatcher: (fireAnalyticsEvent?: ((payload: RendererAnalyticsEventPayload) => void)) => DispatchAnalyticsEvent;
7
+ /**
8
+ * This experience tracks when a reference sync block data is fetched from the BE.
9
+ *
10
+ * Start: When the fetchNodesData function is called.
11
+ * Success: When the fetching the data is successful within 1500ms of start.
12
+ * Failure: When 1500ms passes without the data being successfully fetched, or the fetch fails
13
+ */
14
+ export declare const getFetchExperience: (dispatchAnalyticsEvent: DispatchAnalyticsEvent) => Experience;
15
+ /**
16
+ * This experience tracks when a reference sync block source info data (title, url) is fetched from the BE.
17
+ *
18
+ * Start: When the fetchSourceInfo function is called.
19
+ * Success: When the fetching the data is successful within 2500ms of start.
20
+ * Failure: When 2500ms passes without the data being successfully fetched, or the fetch fails
21
+ */
22
+ export declare const getFetchSourceInfoExperience: (dispatchAnalyticsEvent: DispatchAnalyticsEvent) => Experience;
23
+ /**
24
+ * This experience tracks when a reference sync block is saved to the BE.
25
+ *
26
+ * Start: When the flush sync block function is called.
27
+ * Success: When the sync block save is successful within 1500ms of start.
28
+ * Failure: When 1500ms passes before the sync block save is marked as successful
29
+ */
30
+ export declare const getSaveReferenceExperience: (dispatchAnalyticsEvent: DispatchAnalyticsEvent) => Experience;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-synced-block-renderer",
3
- "version": "5.1.0",
3
+ "version": "5.2.1",
4
4
  "description": "SyncedBlockRenderer for @atlaskit/editor-plugin-synced-block",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -31,23 +31,23 @@
31
31
  "@atlaskit/button": "^23.9.0",
32
32
  "@atlaskit/css": "^0.19.0",
33
33
  "@atlaskit/editor-plugin-synced-block": "^5.1.0",
34
- "@atlaskit/editor-synced-block-provider": "^3.5.0",
34
+ "@atlaskit/editor-synced-block-provider": "^3.6.0",
35
35
  "@atlaskit/heading": "^5.2.0",
36
36
  "@atlaskit/icon": "^29.4.0",
37
37
  "@atlaskit/icon-lab": "^5.14.0",
38
38
  "@atlaskit/image": "^3.0.0",
39
39
  "@atlaskit/platform-feature-flags": "^1.1.0",
40
40
  "@atlaskit/primitives": "^17.0.0",
41
- "@atlaskit/renderer": "^125.2.0",
41
+ "@atlaskit/renderer": "^125.4.0",
42
42
  "@atlaskit/spinner": "^19.0.0",
43
43
  "@atlaskit/tokens": "^9.1.0",
44
- "@atlaskit/tooltip": "^20.12.0",
44
+ "@atlaskit/tooltip": "^20.14.0",
45
45
  "@babel/runtime": "^7.0.0",
46
46
  "react-relay": "npm:atl-react-relay@0.0.0-main-39e79f66",
47
47
  "relay-runtime": "npm:atl-relay-runtime@0.0.0-main-39e79f66"
48
48
  },
49
49
  "peerDependencies": {
50
- "@atlaskit/editor-common": "^111.7.0",
50
+ "@atlaskit/editor-common": "^111.8.0",
51
51
  "react": "^18.2.0",
52
52
  "react-intl-next": "npm:react-intl@^5.18.1"
53
53
  },
@@ -1,22 +0,0 @@
1
- {
2
- "extends": "../tsconfig",
3
- "compilerOptions": {
4
- "target": "es5",
5
- "paths": {}
6
- },
7
- "include": [
8
- "../src/**/*.ts",
9
- "../src/**/*.tsx"
10
- ],
11
- "exclude": [
12
- "../src/**/__tests__/*",
13
- "../src/**/*.test.*",
14
- "../src/**/test.*",
15
- "../src/**/examples.*",
16
- "../src/**/examples/*",
17
- "../src/**/examples/**/*",
18
- "../src/**/*.stories.*",
19
- "../src/**/stories/*",
20
- "../src/**/stories/**/*"
21
- ]
22
- }