@atlaskit/editor-synced-block-renderer 5.0.3 → 5.2.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 (32) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/afm-cc/tsconfig.json +4 -1
  3. package/afm-jira/tsconfig.json +3 -0
  4. package/afm-products/tsconfig.json +3 -0
  5. package/dist/cjs/index.js +1 -8
  6. package/dist/cjs/ui/SyncedBlockNodeComponentRenderer.js +5 -0
  7. package/dist/cjs/ui/SyncedBlockRenderer.js +26 -2
  8. package/dist/cjs/useSyncedBlockNodeComponent.js +25 -3
  9. package/dist/cjs/utils/experience-tracking.js +74 -0
  10. package/dist/es2019/index.js +1 -2
  11. package/dist/es2019/ui/SyncedBlockNodeComponentRenderer.js +5 -0
  12. package/dist/es2019/ui/SyncedBlockRenderer.js +25 -3
  13. package/dist/es2019/useSyncedBlockNodeComponent.js +23 -3
  14. package/dist/es2019/utils/experience-tracking.js +68 -0
  15. package/dist/esm/index.js +1 -2
  16. package/dist/esm/ui/SyncedBlockNodeComponentRenderer.js +5 -0
  17. package/dist/esm/ui/SyncedBlockRenderer.js +26 -3
  18. package/dist/esm/useSyncedBlockNodeComponent.js +25 -3
  19. package/dist/esm/utils/experience-tracking.js +68 -0
  20. package/dist/types/index.d.ts +1 -2
  21. package/dist/types/useSyncedBlockNodeComponent.d.ts +14 -2
  22. package/dist/types/utils/experience-tracking.d.ts +30 -0
  23. package/dist/types-ts4.5/index.d.ts +1 -2
  24. package/dist/types-ts4.5/useSyncedBlockNodeComponent.d.ts +14 -2
  25. package/dist/types-ts4.5/utils/experience-tracking.d.ts +30 -0
  26. package/package.json +12 -6
  27. package/build/tsconfig.json +0 -22
  28. package/dist/cjs/getSyncedBlockNodeComponent.js +0 -41
  29. package/dist/es2019/getSyncedBlockNodeComponent.js +0 -31
  30. package/dist/esm/getSyncedBlockNodeComponent.js +0 -34
  31. package/dist/types/getSyncedBlockNodeComponent.d.ts +0 -15
  32. package/dist/types-ts4.5/getSyncedBlockNodeComponent.d.ts +0 -15
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @atlaskit/editor-synced-block-renderer
2
2
 
3
+ ## 5.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`8100ae00326b4`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/8100ae00326b4) -
8
+ EDITOR-2850-add media ssr support for sync blocks
9
+
10
+ ### Patch Changes
11
+
12
+ - [`fff45a651440a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/fff45a651440a) -
13
+ EDITOR-1665 add experience tracking analytics for sync block save, fetch and delete
14
+ - Updated dependencies
15
+
16
+ ## 5.1.0
17
+
18
+ ### Minor Changes
19
+
20
+ - [`fc67bbb84995b`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/fc67bbb84995b) -
21
+ The renderer version of synced blocks should also use the SSR preloaded data
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies
26
+
3
27
  ## 5.0.3
4
28
 
5
29
  ### Patch 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-cc/tsconfig.json"
49
49
  },
50
+ {
51
+ "path": "../../../platform/feature-flags/afm-cc/tsconfig.json"
52
+ },
50
53
  {
51
54
  "path": "../../../design-system/primitives/afm-cc/tsconfig.json"
52
55
  },
@@ -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
  },
package/dist/cjs/index.js CHANGED
@@ -6,13 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  Object.defineProperty(exports, "getSyncBlockNodesFromDoc", {
7
7
  enumerable: true,
8
8
  get: function get() {
9
- return _getSyncedBlockNodeComponent.getSyncBlockNodesFromDoc;
10
- }
11
- });
12
- Object.defineProperty(exports, "getSyncedBlockNodeComponent", {
13
- enumerable: true,
14
- get: function get() {
15
- return _getSyncedBlockNodeComponent.getSyncedBlockNodeComponent;
9
+ return _useSyncedBlockNodeComponent.getSyncBlockNodesFromDoc;
16
10
  }
17
11
  });
18
12
  Object.defineProperty(exports, "getSyncedBlockRenderer", {
@@ -28,5 +22,4 @@ Object.defineProperty(exports, "useMemoizedSyncedBlockNodeComponent", {
28
22
  }
29
23
  });
30
24
  var _useSyncedBlockNodeComponent = require("./useSyncedBlockNodeComponent");
31
- var _getSyncedBlockNodeComponent = require("./getSyncedBlockNodeComponent");
32
25
  var _getSyncedBlockRenderer = require("./getSyncedBlockRenderer");
@@ -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);
@@ -4,19 +4,41 @@ var _typeof = require("@babel/runtime/helpers/typeof");
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useMemoizedSyncedBlockNodeComponent = void 0;
7
+ exports.useMemoizedSyncedBlockNodeComponent = exports.getSyncBlockNodesFromDoc = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _editorSyncedBlockProvider = require("@atlaskit/editor-synced-block-provider");
10
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
10
11
  var _SyncedBlockNodeComponentRenderer = require("./ui/SyncedBlockNodeComponentRenderer");
11
12
  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); }
13
+ var getSyncBlockNodesFromDoc = exports.getSyncBlockNodesFromDoc = function getSyncBlockNodesFromDoc(doc) {
14
+ var content = doc.content;
15
+ var isEmpty = !content || !Array.isArray(content) || content.length === 0;
16
+ var syncBlockNodes = isEmpty ? [] : content.map(function (node) {
17
+ return (0, _editorSyncedBlockProvider.convertSyncBlockJSONNodeToSyncBlockNode)(node);
18
+ }).filter(function (node) {
19
+ return node !== undefined;
20
+ });
21
+ return syncBlockNodes;
22
+ };
12
23
  var useMemoizedSyncedBlockNodeComponent = exports.useMemoizedSyncedBlockNodeComponent = function useMemoizedSyncedBlockNodeComponent(_ref) {
13
24
  var syncBlockNodes = _ref.syncBlockNodes,
14
25
  syncBlockProvider = _ref.syncBlockProvider,
15
26
  syncBlockRendererOptions = _ref.syncBlockRendererOptions,
16
- fireAnalyticsEvent = _ref.fireAnalyticsEvent;
27
+ fireAnalyticsEvent = _ref.fireAnalyticsEvent,
28
+ getSSRData = _ref.getSSRData;
17
29
  var syncBlockStoreManager = (0, _editorSyncedBlockProvider.useMemoizedSyncBlockStoreManager)(syncBlockProvider, fireAnalyticsEvent);
18
30
 
19
- // Initial fetch sync block data
31
+ // Initialize SSR data if available
32
+ (0, _react.useEffect)(function () {
33
+ if (getSSRData && (0, _platformFeatureFlags.fg)('platform_synced_block_dogfooding')) {
34
+ var ssrData = getSSRData();
35
+ if (ssrData && syncBlockProvider.setSSRData) {
36
+ syncBlockProvider.setSSRData(ssrData);
37
+ }
38
+ }
39
+ }, [getSSRData, syncBlockProvider]);
40
+
41
+ // Initial fetch sync block data (will use SSR data as initial cache if available)
20
42
  (0, _react.useEffect)(function () {
21
43
  syncBlockStoreManager.referenceManager.fetchSyncBlocksData(syncBlockNodes);
22
44
  }, [syncBlockNodes, syncBlockStoreManager.referenceManager]);
@@ -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,4 +1,3 @@
1
1
  /* eslint-disable @atlaskit/editor/no-re-export */
2
- export { useMemoizedSyncedBlockNodeComponent } from './useSyncedBlockNodeComponent';
3
- export { getSyncedBlockNodeComponent, getSyncBlockNodesFromDoc } from './getSyncedBlockNodeComponent';
2
+ export { getSyncBlockNodesFromDoc, useMemoizedSyncedBlockNodeComponent } from './useSyncedBlockNodeComponent';
4
3
  export { getSyncedBlockRenderer } from './getSyncedBlockRenderer';
@@ -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,15 +1,35 @@
1
1
  import React, { useCallback, useEffect } from 'react';
2
- import { useMemoizedSyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
2
+ import { convertSyncBlockJSONNodeToSyncBlockNode, useMemoizedSyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
3
+ import { fg } from '@atlaskit/platform-feature-flags';
3
4
  import { SyncedBlockNodeComponentRenderer } from './ui/SyncedBlockNodeComponentRenderer';
5
+ export const getSyncBlockNodesFromDoc = doc => {
6
+ const {
7
+ content
8
+ } = doc;
9
+ const isEmpty = !content || !Array.isArray(content) || content.length === 0;
10
+ const syncBlockNodes = isEmpty ? [] : content.map(node => convertSyncBlockJSONNodeToSyncBlockNode(node)).filter(node => node !== undefined);
11
+ return syncBlockNodes;
12
+ };
4
13
  export const useMemoizedSyncedBlockNodeComponent = ({
5
14
  syncBlockNodes,
6
15
  syncBlockProvider,
7
16
  syncBlockRendererOptions,
8
- fireAnalyticsEvent
17
+ fireAnalyticsEvent,
18
+ getSSRData
9
19
  }) => {
10
20
  const syncBlockStoreManager = useMemoizedSyncBlockStoreManager(syncBlockProvider, fireAnalyticsEvent);
11
21
 
12
- // Initial fetch sync block data
22
+ // Initialize SSR data if available
23
+ useEffect(() => {
24
+ if (getSSRData && fg('platform_synced_block_dogfooding')) {
25
+ const ssrData = getSSRData();
26
+ if (ssrData && syncBlockProvider.setSSRData) {
27
+ syncBlockProvider.setSSRData(ssrData);
28
+ }
29
+ }
30
+ }, [getSSRData, syncBlockProvider]);
31
+
32
+ // Initial fetch sync block data (will use SSR data as initial cache if available)
13
33
  useEffect(() => {
14
34
  syncBlockStoreManager.referenceManager.fetchSyncBlocksData(syncBlockNodes);
15
35
  }, [syncBlockNodes, syncBlockStoreManager.referenceManager]);
@@ -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
+ };
package/dist/esm/index.js CHANGED
@@ -1,4 +1,3 @@
1
1
  /* eslint-disable @atlaskit/editor/no-re-export */
2
- export { useMemoizedSyncedBlockNodeComponent } from './useSyncedBlockNodeComponent';
3
- export { getSyncedBlockNodeComponent, getSyncBlockNodesFromDoc } from './getSyncedBlockNodeComponent';
2
+ export { getSyncBlockNodesFromDoc, useMemoizedSyncedBlockNodeComponent } from './useSyncedBlockNodeComponent';
4
3
  export { getSyncedBlockRenderer } from './getSyncedBlockRenderer';
@@ -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,14 +1,36 @@
1
1
  import React, { useCallback, useEffect } from 'react';
2
- import { useMemoizedSyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
2
+ import { convertSyncBlockJSONNodeToSyncBlockNode, useMemoizedSyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
3
+ import { fg } from '@atlaskit/platform-feature-flags';
3
4
  import { SyncedBlockNodeComponentRenderer } from './ui/SyncedBlockNodeComponentRenderer';
5
+ export var getSyncBlockNodesFromDoc = function getSyncBlockNodesFromDoc(doc) {
6
+ var content = doc.content;
7
+ var isEmpty = !content || !Array.isArray(content) || content.length === 0;
8
+ var syncBlockNodes = isEmpty ? [] : content.map(function (node) {
9
+ return convertSyncBlockJSONNodeToSyncBlockNode(node);
10
+ }).filter(function (node) {
11
+ return node !== undefined;
12
+ });
13
+ return syncBlockNodes;
14
+ };
4
15
  export var useMemoizedSyncedBlockNodeComponent = function useMemoizedSyncedBlockNodeComponent(_ref) {
5
16
  var syncBlockNodes = _ref.syncBlockNodes,
6
17
  syncBlockProvider = _ref.syncBlockProvider,
7
18
  syncBlockRendererOptions = _ref.syncBlockRendererOptions,
8
- fireAnalyticsEvent = _ref.fireAnalyticsEvent;
19
+ fireAnalyticsEvent = _ref.fireAnalyticsEvent,
20
+ getSSRData = _ref.getSSRData;
9
21
  var syncBlockStoreManager = useMemoizedSyncBlockStoreManager(syncBlockProvider, fireAnalyticsEvent);
10
22
 
11
- // Initial fetch sync block data
23
+ // Initialize SSR data if available
24
+ useEffect(function () {
25
+ if (getSSRData && fg('platform_synced_block_dogfooding')) {
26
+ var ssrData = getSSRData();
27
+ if (ssrData && syncBlockProvider.setSSRData) {
28
+ syncBlockProvider.setSSRData(ssrData);
29
+ }
30
+ }
31
+ }, [getSSRData, syncBlockProvider]);
32
+
33
+ // Initial fetch sync block data (will use SSR data as initial cache if available)
12
34
  useEffect(function () {
13
35
  syncBlockStoreManager.referenceManager.fetchSyncBlocksData(syncBlockNodes);
14
36
  }, [syncBlockNodes, syncBlockStoreManager.referenceManager]);
@@ -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,4 +1,3 @@
1
- export { useMemoizedSyncedBlockNodeComponent } from './useSyncedBlockNodeComponent';
2
- export { getSyncedBlockNodeComponent, getSyncBlockNodesFromDoc, } from './getSyncedBlockNodeComponent';
1
+ export { getSyncBlockNodesFromDoc, useMemoizedSyncedBlockNodeComponent, type GetSyncedBlockNodeComponentProps, } from './useSyncedBlockNodeComponent';
3
2
  export { getSyncedBlockRenderer } from './getSyncedBlockRenderer';
4
3
  export type { SyncedBlockNodeProps } from './ui/SyncedBlockNodeComponentRenderer';
@@ -1,4 +1,16 @@
1
1
  import React from 'react';
2
- import type { GetSyncedBlockNodeComponentProps } from './getSyncedBlockNodeComponent';
2
+ import type { DocNode } from '@atlaskit/adf-schema';
3
+ import type { SyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
4
+ import { type SyncBlockInstance, type SyncBlockNode } from '@atlaskit/editor-synced-block-provider';
5
+ import type { SyncedBlockProvider } from '@atlaskit/editor-synced-block-provider';
6
+ import type { SyncedBlockRendererOptions } from './types';
3
7
  import { type SyncedBlockNodeProps } from './ui/SyncedBlockNodeComponentRenderer';
4
- export declare const useMemoizedSyncedBlockNodeComponent: ({ syncBlockNodes, syncBlockProvider, syncBlockRendererOptions, fireAnalyticsEvent, }: GetSyncedBlockNodeComponentProps) => ((props: SyncedBlockNodeProps) => React.JSX.Element);
8
+ export type GetSyncedBlockNodeComponentProps = {
9
+ fireAnalyticsEvent?: (payload: SyncBlockEventPayload) => void;
10
+ getSSRData?: () => Record<string, SyncBlockInstance> | undefined;
11
+ syncBlockNodes: SyncBlockNode[];
12
+ syncBlockProvider: SyncedBlockProvider;
13
+ syncBlockRendererOptions: SyncedBlockRendererOptions | undefined;
14
+ };
15
+ export declare const getSyncBlockNodesFromDoc: (doc: DocNode) => SyncBlockNode[];
16
+ export declare const useMemoizedSyncedBlockNodeComponent: ({ syncBlockNodes, syncBlockProvider, syncBlockRendererOptions, fireAnalyticsEvent, getSSRData, }: GetSyncedBlockNodeComponentProps) => ((props: SyncedBlockNodeProps) => React.JSX.Element);
@@ -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,4 +1,3 @@
1
- export { useMemoizedSyncedBlockNodeComponent } from './useSyncedBlockNodeComponent';
2
- export { getSyncedBlockNodeComponent, getSyncBlockNodesFromDoc, } from './getSyncedBlockNodeComponent';
1
+ export { getSyncBlockNodesFromDoc, useMemoizedSyncedBlockNodeComponent, type GetSyncedBlockNodeComponentProps, } from './useSyncedBlockNodeComponent';
3
2
  export { getSyncedBlockRenderer } from './getSyncedBlockRenderer';
4
3
  export type { SyncedBlockNodeProps } from './ui/SyncedBlockNodeComponentRenderer';
@@ -1,4 +1,16 @@
1
1
  import React from 'react';
2
- import type { GetSyncedBlockNodeComponentProps } from './getSyncedBlockNodeComponent';
2
+ import type { DocNode } from '@atlaskit/adf-schema';
3
+ import type { SyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
4
+ import { type SyncBlockInstance, type SyncBlockNode } from '@atlaskit/editor-synced-block-provider';
5
+ import type { SyncedBlockProvider } from '@atlaskit/editor-synced-block-provider';
6
+ import type { SyncedBlockRendererOptions } from './types';
3
7
  import { type SyncedBlockNodeProps } from './ui/SyncedBlockNodeComponentRenderer';
4
- export declare const useMemoizedSyncedBlockNodeComponent: ({ syncBlockNodes, syncBlockProvider, syncBlockRendererOptions, fireAnalyticsEvent, }: GetSyncedBlockNodeComponentProps) => ((props: SyncedBlockNodeProps) => React.JSX.Element);
8
+ export type GetSyncedBlockNodeComponentProps = {
9
+ fireAnalyticsEvent?: (payload: SyncBlockEventPayload) => void;
10
+ getSSRData?: () => Record<string, SyncBlockInstance> | undefined;
11
+ syncBlockNodes: SyncBlockNode[];
12
+ syncBlockProvider: SyncedBlockProvider;
13
+ syncBlockRendererOptions: SyncedBlockRendererOptions | undefined;
14
+ };
15
+ export declare const getSyncBlockNodesFromDoc: (doc: DocNode) => SyncBlockNode[];
16
+ export declare const useMemoizedSyncedBlockNodeComponent: ({ syncBlockNodes, syncBlockProvider, syncBlockRendererOptions, fireAnalyticsEvent, getSSRData, }: GetSyncedBlockNodeComponentProps) => ((props: SyncedBlockNodeProps) => React.JSX.Element);
@@ -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.0.3",
3
+ "version": "5.2.0",
4
4
  "description": "SyncedBlockRenderer for @atlaskit/editor-plugin-synced-block",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -31,22 +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
- "@atlaskit/icon-lab": "^5.13.0",
37
+ "@atlaskit/icon-lab": "^5.14.0",
38
38
  "@atlaskit/image": "^3.0.0",
39
+ "@atlaskit/platform-feature-flags": "^1.1.0",
39
40
  "@atlaskit/primitives": "^17.0.0",
40
- "@atlaskit/renderer": "^125.2.0",
41
+ "@atlaskit/renderer": "^125.4.0",
41
42
  "@atlaskit/spinner": "^19.0.0",
42
43
  "@atlaskit/tokens": "^9.1.0",
43
- "@atlaskit/tooltip": "^20.12.0",
44
+ "@atlaskit/tooltip": "^20.14.0",
44
45
  "@babel/runtime": "^7.0.0",
45
46
  "react-relay": "npm:atl-react-relay@0.0.0-main-39e79f66",
46
47
  "relay-runtime": "npm:atl-relay-runtime@0.0.0-main-39e79f66"
47
48
  },
48
49
  "peerDependencies": {
49
- "@atlaskit/editor-common": "^111.6.0",
50
+ "@atlaskit/editor-common": "^111.8.0",
50
51
  "react": "^18.2.0",
51
52
  "react-intl-next": "npm:react-intl@^5.18.1"
52
53
  },
@@ -85,5 +86,10 @@
85
86
  "import-no-extraneous-disable-for-examples-and-docs"
86
87
  ]
87
88
  }
89
+ },
90
+ "platform-feature-flags": {
91
+ "platform_synced_block_dogfooding": {
92
+ "type": "boolean"
93
+ }
88
94
  }
89
95
  }
@@ -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
- }
@@ -1,41 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.getSyncedBlockNodeComponent = exports.getSyncBlockNodesFromDoc = void 0;
8
- var _react = _interopRequireDefault(require("react"));
9
- var _editorSyncedBlockProvider = require("@atlaskit/editor-synced-block-provider");
10
- var _SyncedBlockNodeComponentRenderer = require("./ui/SyncedBlockNodeComponentRenderer");
11
- var getSyncBlockNodesFromDoc = exports.getSyncBlockNodesFromDoc = function getSyncBlockNodesFromDoc(doc) {
12
- var content = doc.content;
13
- var isEmpty = !content || !Array.isArray(content) || content.length === 0;
14
- var syncBlockNodes = isEmpty ? [] : content.map(function (node) {
15
- return (0, _editorSyncedBlockProvider.convertSyncBlockJSONNodeToSyncBlockNode)(node);
16
- }).filter(function (node) {
17
- return node !== undefined;
18
- });
19
- return syncBlockNodes;
20
- };
21
- var getSyncedBlockNodeComponent = exports.getSyncedBlockNodeComponent = function getSyncedBlockNodeComponent(_ref) {
22
- var syncBlockNodes = _ref.syncBlockNodes,
23
- syncBlockProvider = _ref.syncBlockProvider,
24
- syncBlockRendererOptions = _ref.syncBlockRendererOptions,
25
- fireAnalyticsEvent = _ref.fireAnalyticsEvent;
26
- var syncBlockStoreManager = (0, _editorSyncedBlockProvider.createAndInitializeSyncBlockStoreManager)({
27
- dataProvider: syncBlockProvider,
28
- fireAnalyticsEvent: fireAnalyticsEvent
29
- });
30
-
31
- // Initial fetch sync block data
32
- syncBlockStoreManager.referenceManager.fetchSyncBlocksData(syncBlockNodes);
33
- return function (props) {
34
- return /*#__PURE__*/_react.default.createElement(_SyncedBlockNodeComponentRenderer.SyncedBlockNodeComponentRenderer, {
35
- key: props.localId,
36
- nodeProps: props,
37
- syncBlockStoreManager: syncBlockStoreManager,
38
- rendererOptions: syncBlockRendererOptions
39
- });
40
- };
41
- };
@@ -1,31 +0,0 @@
1
- import React from 'react';
2
- import { convertSyncBlockJSONNodeToSyncBlockNode, createAndInitializeSyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
3
- import { SyncedBlockNodeComponentRenderer } from './ui/SyncedBlockNodeComponentRenderer';
4
- export const getSyncBlockNodesFromDoc = doc => {
5
- const {
6
- content
7
- } = doc;
8
- const isEmpty = !content || !Array.isArray(content) || content.length === 0;
9
- const syncBlockNodes = isEmpty ? [] : content.map(node => convertSyncBlockJSONNodeToSyncBlockNode(node)).filter(node => node !== undefined);
10
- return syncBlockNodes;
11
- };
12
- export const getSyncedBlockNodeComponent = ({
13
- syncBlockNodes,
14
- syncBlockProvider,
15
- syncBlockRendererOptions,
16
- fireAnalyticsEvent
17
- }) => {
18
- const syncBlockStoreManager = createAndInitializeSyncBlockStoreManager({
19
- dataProvider: syncBlockProvider,
20
- fireAnalyticsEvent
21
- });
22
-
23
- // Initial fetch sync block data
24
- syncBlockStoreManager.referenceManager.fetchSyncBlocksData(syncBlockNodes);
25
- return props => /*#__PURE__*/React.createElement(SyncedBlockNodeComponentRenderer, {
26
- key: props.localId,
27
- nodeProps: props,
28
- syncBlockStoreManager: syncBlockStoreManager,
29
- rendererOptions: syncBlockRendererOptions
30
- });
31
- };
@@ -1,34 +0,0 @@
1
- import React from 'react';
2
- import { convertSyncBlockJSONNodeToSyncBlockNode, createAndInitializeSyncBlockStoreManager } from '@atlaskit/editor-synced-block-provider';
3
- import { SyncedBlockNodeComponentRenderer } from './ui/SyncedBlockNodeComponentRenderer';
4
- export var getSyncBlockNodesFromDoc = function getSyncBlockNodesFromDoc(doc) {
5
- var content = doc.content;
6
- var isEmpty = !content || !Array.isArray(content) || content.length === 0;
7
- var syncBlockNodes = isEmpty ? [] : content.map(function (node) {
8
- return convertSyncBlockJSONNodeToSyncBlockNode(node);
9
- }).filter(function (node) {
10
- return node !== undefined;
11
- });
12
- return syncBlockNodes;
13
- };
14
- export var getSyncedBlockNodeComponent = function getSyncedBlockNodeComponent(_ref) {
15
- var syncBlockNodes = _ref.syncBlockNodes,
16
- syncBlockProvider = _ref.syncBlockProvider,
17
- syncBlockRendererOptions = _ref.syncBlockRendererOptions,
18
- fireAnalyticsEvent = _ref.fireAnalyticsEvent;
19
- var syncBlockStoreManager = createAndInitializeSyncBlockStoreManager({
20
- dataProvider: syncBlockProvider,
21
- fireAnalyticsEvent: fireAnalyticsEvent
22
- });
23
-
24
- // Initial fetch sync block data
25
- syncBlockStoreManager.referenceManager.fetchSyncBlocksData(syncBlockNodes);
26
- return function (props) {
27
- return /*#__PURE__*/React.createElement(SyncedBlockNodeComponentRenderer, {
28
- key: props.localId,
29
- nodeProps: props,
30
- syncBlockStoreManager: syncBlockStoreManager,
31
- rendererOptions: syncBlockRendererOptions
32
- });
33
- };
34
- };
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
- import type { DocNode } from '@atlaskit/adf-schema';
3
- import type { SyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
4
- import { type SyncBlockNode } from '@atlaskit/editor-synced-block-provider';
5
- import type { SyncedBlockProvider } from '@atlaskit/editor-synced-block-provider';
6
- import type { SyncedBlockRendererOptions } from './types';
7
- import { type SyncedBlockNodeProps } from './ui/SyncedBlockNodeComponentRenderer';
8
- export type GetSyncedBlockNodeComponentProps = {
9
- fireAnalyticsEvent?: (payload: SyncBlockEventPayload) => void;
10
- syncBlockNodes: SyncBlockNode[];
11
- syncBlockProvider: SyncedBlockProvider;
12
- syncBlockRendererOptions: SyncedBlockRendererOptions | undefined;
13
- };
14
- export declare const getSyncBlockNodesFromDoc: (doc: DocNode) => SyncBlockNode[];
15
- export declare const getSyncedBlockNodeComponent: ({ syncBlockNodes, syncBlockProvider, syncBlockRendererOptions, fireAnalyticsEvent, }: GetSyncedBlockNodeComponentProps) => (props: SyncedBlockNodeProps) => React.JSX.Element;
@@ -1,15 +0,0 @@
1
- import React from 'react';
2
- import type { DocNode } from '@atlaskit/adf-schema';
3
- import type { SyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
4
- import { type SyncBlockNode } from '@atlaskit/editor-synced-block-provider';
5
- import type { SyncedBlockProvider } from '@atlaskit/editor-synced-block-provider';
6
- import type { SyncedBlockRendererOptions } from './types';
7
- import { type SyncedBlockNodeProps } from './ui/SyncedBlockNodeComponentRenderer';
8
- export type GetSyncedBlockNodeComponentProps = {
9
- fireAnalyticsEvent?: (payload: SyncBlockEventPayload) => void;
10
- syncBlockNodes: SyncBlockNode[];
11
- syncBlockProvider: SyncedBlockProvider;
12
- syncBlockRendererOptions: SyncedBlockRendererOptions | undefined;
13
- };
14
- export declare const getSyncBlockNodesFromDoc: (doc: DocNode) => SyncBlockNode[];
15
- export declare const getSyncedBlockNodeComponent: ({ syncBlockNodes, syncBlockProvider, syncBlockRendererOptions, fireAnalyticsEvent, }: GetSyncedBlockNodeComponentProps) => (props: SyncedBlockNodeProps) => React.JSX.Element;