@contentful/field-editor-reference 6.12.1 → 6.13.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.
Files changed (27) hide show
  1. package/dist/cjs/__fixtures__/FakeSdk.js +6 -6
  2. package/dist/cjs/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +9 -15
  3. package/dist/cjs/assets/WrappedAssetCard/WrappedAssetCard.js +3 -4
  4. package/dist/cjs/assets/WrappedAssetCard/WrappedAssetLink.js +2 -3
  5. package/dist/cjs/common/EntityStore.js +96 -32
  6. package/dist/cjs/components/EntityStatusBadge/EntityStatusBadge.js +5 -6
  7. package/dist/cjs/components/LinkActions/CombinedLinkActions.js +2 -2
  8. package/dist/cjs/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +10 -22
  9. package/dist/cjs/entries/WrappedEntryCard/WrappedEntryCard.js +3 -4
  10. package/dist/cjs/resources/Cards/ResourceCard.spec.js +14 -11
  11. package/dist/esm/__fixtures__/FakeSdk.js +7 -7
  12. package/dist/esm/assets/WrappedAssetCard/FetchingWrappedAssetCard.js +10 -16
  13. package/dist/esm/assets/WrappedAssetCard/WrappedAssetCard.js +3 -4
  14. package/dist/esm/assets/WrappedAssetCard/WrappedAssetLink.js +2 -3
  15. package/dist/esm/common/EntityStore.js +97 -33
  16. package/dist/esm/components/EntityStatusBadge/EntityStatusBadge.js +5 -6
  17. package/dist/esm/components/LinkActions/CombinedLinkActions.js +2 -2
  18. package/dist/esm/entries/WrappedEntryCard/FetchingWrappedEntryCard.js +11 -18
  19. package/dist/esm/entries/WrappedEntryCard/WrappedEntryCard.js +3 -4
  20. package/dist/esm/resources/Cards/ResourceCard.spec.js +14 -11
  21. package/dist/types/assets/WrappedAssetCard/WrappedAssetCard.d.ts +4 -5
  22. package/dist/types/assets/WrappedAssetCard/WrappedAssetLink.d.ts +3 -4
  23. package/dist/types/common/EntityStore.d.ts +7 -2
  24. package/dist/types/common/customCardTypes.d.ts +7 -8
  25. package/dist/types/components/EntityStatusBadge/EntityStatusBadge.d.ts +4 -5
  26. package/dist/types/entries/WrappedEntryCard/WrappedEntryCard.d.ts +4 -5
  27. package/package.json +5 -5
@@ -57,8 +57,8 @@ function newReferenceEditorFakeSdk(props) {
57
57
  const sdk = {
58
58
  field,
59
59
  locales,
60
- cmaAdapter: (0, _fieldeditortestutils.createFakeCMAAdapter)({
61
- Entry: {
60
+ cma: {
61
+ entry: {
62
62
  get: async ({ entryId })=>{
63
63
  if (props?.fetchDelay) {
64
64
  await delay(props.fetchDelay);
@@ -75,7 +75,7 @@ function newReferenceEditorFakeSdk(props) {
75
75
  return Promise.reject({});
76
76
  }
77
77
  },
78
- Asset: {
78
+ asset: {
79
79
  get: async ({ assetId })=>{
80
80
  if (props?.fetchDelay) {
81
81
  await delay(props.fetchDelay);
@@ -92,7 +92,7 @@ function newReferenceEditorFakeSdk(props) {
92
92
  return Promise.reject({});
93
93
  }
94
94
  },
95
- Space: {
95
+ space: {
96
96
  get: async (params)=>{
97
97
  if (params.spaceId === _fixtures.spaces.indifferent.sys.id) {
98
98
  return _fixtures.spaces.indifferent;
@@ -100,7 +100,7 @@ function newReferenceEditorFakeSdk(props) {
100
100
  return Promise.reject({});
101
101
  }
102
102
  },
103
- ContentType: {
103
+ contentType: {
104
104
  get: async ({ contentTypeId })=>{
105
105
  if (contentTypeId === _fixtures.contentTypes.published.sys.id) {
106
106
  return _fixtures.contentTypes.published;
@@ -111,7 +111,7 @@ function newReferenceEditorFakeSdk(props) {
111
111
  Locale: {
112
112
  getMany: async ()=>_fixtures.locales.list
113
113
  }
114
- }),
114
+ },
115
115
  space: {
116
116
  ...space,
117
117
  getCachedContentTypes () {
@@ -57,25 +57,20 @@ function _interop_require_wildcard(obj, nodeInterop) {
57
57
  return newObj;
58
58
  }
59
59
  function FetchingWrappedAssetCard(props) {
60
- const { releaseVersionMap, locales, activeRelease, releases, isActiveReleaseLoading } = (0, _fieldeditorshared.parseReleaseParams)(props.sdk.parameters.instance.release);
61
- const { data: asset, status } = (0, _EntityStore.useEntity)('Asset', props.assetId);
60
+ const { data: asset, status, currentEntity } = (0, _EntityStore.useEntity)('Asset', props.assetId);
62
61
  const { getEntityScheduledActions } = (0, _EntityStore.useEntityLoader)();
63
62
  const loadEntityScheduledActions = _react.useCallback(()=>getEntityScheduledActions('Asset', props.assetId), [
64
63
  getEntityScheduledActions,
65
64
  props.assetId
66
65
  ]);
66
+ const activeLocales = (0, _fieldeditorshared.useActiveLocales)(props.sdk);
67
67
  const localesStatusMap = (0, _fieldeditorshared.useLocalePublishStatus)(asset, props.sdk.locales);
68
- const { releaseLocalesStatusMap } = (0, _fieldeditorshared.useActiveReleaseLocalesStatuses)({
69
- currentEntityDraft: asset,
70
- entityId: props.assetId,
71
- entityType: 'Asset',
72
- releaseVersionMap,
73
- locales,
74
- activeRelease,
75
- releases
68
+ const { releaseStatusMap, releaseAction } = (0, _fieldeditorshared.useReleaseStatus)({
69
+ entity: asset,
70
+ previousEntityOnTimeline: currentEntity,
71
+ release: props.sdk.release,
72
+ locales: props.sdk.locales
76
73
  });
77
- const { releaseAction } = (0, _fieldeditorshared.getEntityReleaseStatus)(props.assetId, locales, activeRelease);
78
- const activeLocales = (0, _fieldeditorshared.useActiveLocales)(props.sdk);
79
74
  _react.useEffect(()=>{
80
75
  if (asset) {
81
76
  props.onAction && props.onAction({
@@ -140,9 +135,8 @@ function FetchingWrappedAssetCard(props) {
140
135
  useLocalizedEntityStatus: props.sdk.parameters.instance.useLocalizedEntityStatus,
141
136
  localesStatusMap,
142
137
  activeLocales,
143
- releaseLocalesStatusMap,
144
- isReleasesLoading: isActiveReleaseLoading,
145
- activeRelease,
138
+ releaseStatusMap,
139
+ release: props.sdk.release,
146
140
  releaseAction
147
141
  };
148
142
  if (status === 'loading') {
@@ -86,7 +86,7 @@ function getFileType(file) {
86
86
  });
87
87
  return groupToIconMap[groupName] || 'archive';
88
88
  }
89
- const WrappedAssetCard = ({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction, releaseLocalesStatusMap, isReleasesLoading, activeRelease })=>{
89
+ const WrappedAssetCard = ({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction, releaseStatusMap, release })=>{
90
90
  const status = _fieldeditorshared.entityHelpers.getEntityStatus(asset.sys, useLocalizedEntityStatus ? localeCode : undefined);
91
91
  if (status === 'deleted') {
92
92
  return /*#__PURE__*/ _react.createElement(_components.MissingAssetCard, {
@@ -119,9 +119,8 @@ const WrappedAssetCard = ({ asset, className, size, localeCode, defaultLocaleCod
119
119
  localesStatusMap: localesStatusMap,
120
120
  activeLocales: activeLocales,
121
121
  releaseAction: releaseAction,
122
- releaseLocalesStatusMap: releaseLocalesStatusMap,
123
- isReleasesLoading: isReleasesLoading,
124
- activeRelease: activeRelease
122
+ releaseStatusMap: releaseStatusMap,
123
+ release: release
125
124
  }),
126
125
  src: entityFile && entityFile.url ? size === 'small' ? `${entityFile.url}?w=150&h=150&fit=thumb` : `${entityFile.url}?h=300` : '',
127
126
  onClick: isClickable ? (e)=>{
@@ -86,9 +86,8 @@ const WrappedAssetLink = (props)=>{
86
86
  localesStatusMap: props.localesStatusMap,
87
87
  activeLocales: props.activeLocales,
88
88
  releaseAction: props.releaseAction,
89
- releaseLocalesStatusMap: props.releaseLocalesStatusMap,
90
- isReleasesLoading: props.isReleasesLoading,
91
- activeRelease: props.activeRelease
89
+ releaseStatusMap: props.releaseStatusMap,
90
+ release: props.release
92
91
  }),
93
92
  thumbnailElement: entityFile && (0, _fieldeditorshared.isValidImage)(entityFile) ? /*#__PURE__*/ _react.createElement(_components.AssetThumbnail, {
94
93
  file: entityFile
@@ -241,11 +241,13 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
241
241
  'resource-types',
242
242
  spaceId,
243
243
  environmentId
244
- ], ({ cmaClient })=>(0, _contentfulmanagement.fetchAll)(({ query })=>cmaClient.resourceType.getForEnvironment({
244
+ ], ({ cmaClient })=>{
245
+ return (0, _contentfulmanagement.fetchAll)(({ query })=>cmaClient.resourceType.getForEnvironment({
245
246
  spaceId,
246
247
  environmentId,
247
248
  query
248
- }), {}))
249
+ }), {});
250
+ })
249
251
  ]);
250
252
  const resourceTypeEntity = resourceTypes.find((rt)=>rt.sys.id === resourceType);
251
253
  if (!resourceTypeEntity) {
@@ -265,6 +267,7 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
265
267
  const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0, _constate.default)(function useInitServices(props) {
266
268
  const currentSpaceId = props.sdk.ids.space;
267
269
  const currentEnvironmentId = props.sdk.ids.environmentAlias ?? props.sdk.ids.environment;
270
+ const releaseId = props.sdk.ids.release;
268
271
  const environmentIds = (0, _react.useMemo)(()=>[
269
272
  props.sdk.ids.environmentAlias,
270
273
  props.sdk.ids.environment
@@ -275,13 +278,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
275
278
  const queryClient = (0, _queryClient.useQueryClient)();
276
279
  const queryCache = queryClient.getQueryCache();
277
280
  const entityChangeUnsubscribers = (0, _react.useRef)({});
278
- const cmaClient = (0, _react.useMemo)(()=>(0, _contentfulmanagement.createClient)({
279
- apiAdapter: props.sdk.cmaAdapter
280
- }, {
281
- type: 'plain'
282
- }), [
283
- props.sdk.cmaAdapter
284
- ]);
281
+ const cmaClient = props.sdk.cma;
285
282
  const queryQueue = (0, _react.useMemo)(()=>{
286
283
  if (props.queryConcurrency) {
287
284
  return new _pqueue.default({
@@ -304,38 +301,92 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
304
301
  queryQueue,
305
302
  cmaClient
306
303
  ]);
307
- const getEntity = (0, _react.useCallback)(function getEntity(entityType, entityId, options) {
304
+ const isReleaseRequestError = (0, _react.useCallback)(function isReleaseRequestError(error, spaceId, environmentId) {
305
+ return !!releaseId && (!spaceId || spaceId === currentSpaceId) && (!environmentId || environmentId === currentEnvironmentId) && error instanceof Error && 'status' in error && error.status === 404;
306
+ }, [
307
+ releaseId,
308
+ currentSpaceId,
309
+ currentEnvironmentId
310
+ ]);
311
+ const getEntity = (0, _react.useCallback)(function getEntity(entityType, entityId, releaseId, options) {
308
312
  const spaceId = options?.spaceId ?? currentSpaceId;
309
313
  const environmentId = options?.environmentId ?? currentEnvironmentId;
310
314
  const queryKey = [
311
315
  entityType,
312
316
  entityId,
313
317
  spaceId,
314
- environmentId
318
+ environmentId,
319
+ releaseId
315
320
  ];
316
- return fetch(queryKey, ({ cmaClient })=>{
321
+ return fetch(queryKey, async ({ cmaClient })=>{
317
322
  if (entityType === 'Entry') {
318
- return cmaClient.entry.get({
319
- entryId: entityId,
320
- spaceId,
321
- environmentId
322
- });
323
+ try {
324
+ return cmaClient.entry.get({
325
+ entryId: entityId,
326
+ spaceId,
327
+ environmentId,
328
+ releaseId
329
+ });
330
+ } catch (error) {
331
+ if (isReleaseRequestError(error, spaceId, environmentId)) {
332
+ const currentEntry = await cmaClient.entry.get({
333
+ entryId: entityId,
334
+ spaceId,
335
+ environmentId,
336
+ releaseId: undefined
337
+ });
338
+ currentEntry.sys.release = {
339
+ sys: {
340
+ type: 'Link',
341
+ linkType: 'Release',
342
+ id: releaseId
343
+ }
344
+ };
345
+ return currentEntry;
346
+ }
347
+ throw error;
348
+ }
323
349
  }
324
350
  if (entityType === 'Asset') {
325
- return cmaClient.asset.get({
326
- assetId: entityId,
327
- spaceId,
328
- environmentId
329
- });
351
+ try {
352
+ return cmaClient.asset.get({
353
+ assetId: entityId,
354
+ spaceId,
355
+ environmentId,
356
+ releaseId
357
+ });
358
+ } catch (error) {
359
+ if (isReleaseRequestError(error, spaceId, environmentId)) {
360
+ const currentAsset = cmaClient.asset.get({
361
+ assetId: entityId,
362
+ spaceId,
363
+ environmentId,
364
+ releaseId: undefined
365
+ });
366
+ currentAsset.sys.release = {
367
+ sys: {
368
+ type: 'Link',
369
+ linkType: 'Release',
370
+ id: releaseId
371
+ }
372
+ };
373
+ return currentAsset;
374
+ }
375
+ throw error;
376
+ }
330
377
  }
331
378
  throw new UnsupportedError('Unsupported entity type');
332
379
  }, options);
333
380
  }, [
334
381
  fetch,
335
382
  currentSpaceId,
336
- currentEnvironmentId
383
+ currentEnvironmentId,
384
+ isReleaseRequestError
337
385
  ]);
338
386
  const getEntityScheduledActions = (0, _react.useCallback)(function getEntityScheduledActions(entityType, entityId, options) {
387
+ if (releaseId) {
388
+ return new Promise((resolve)=>resolve([]));
389
+ }
339
390
  const fixedEntityCacheId = 'scheduledActionEntityId';
340
391
  const maxScheduledActions = 500;
341
392
  const spaceId = options?.spaceId ?? currentSpaceId;
@@ -345,7 +396,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
345
396
  entityType,
346
397
  fixedEntityCacheId,
347
398
  spaceId,
348
- environmentId
399
+ environmentId,
400
+ releaseId
349
401
  ];
350
402
  return fetch(queryKey, async ({ cmaClient })=>{
351
403
  const response = await cmaClient.scheduledActions.getMany({
@@ -362,7 +414,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
362
414
  }, [
363
415
  fetch,
364
416
  currentSpaceId,
365
- currentEnvironmentId
417
+ currentEnvironmentId,
418
+ releaseId
366
419
  ]);
367
420
  const getResource = (0, _react.useCallback)(function getResource(resourceType, urn, options) {
368
421
  const queryKey = [
@@ -490,23 +543,34 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
490
543
  getResourceProvider
491
544
  }), ({ ids })=>({
492
545
  environment: ids.environmentAlias ?? ids.environment,
493
- space: ids.space
546
+ space: ids.space,
547
+ releaseId: ids.release
494
548
  }));
495
549
  function useEntity(entityType, entityId, options) {
496
- const { space, environment } = useCurrentIds();
550
+ const { space, environment, releaseId } = useCurrentIds();
497
551
  const { getEntity } = useEntityLoader();
498
- const queryKey = [
552
+ const { status, data } = (0, _queryClient.useQuery)([
499
553
  entityType,
500
554
  entityId,
501
555
  options?.spaceId ?? space,
502
- options?.environmentId ?? environment
503
- ];
504
- const { status, data } = (0, _queryClient.useQuery)(queryKey, ()=>getEntity(entityType, entityId, options), {
556
+ options?.environmentId ?? environment,
557
+ releaseId
558
+ ], ()=>getEntity(entityType, entityId, releaseId, options), {
505
559
  enabled: options?.enabled
506
560
  });
561
+ const { data: currentEntity } = (0, _queryClient.useQuery)([
562
+ entityType,
563
+ entityId,
564
+ options?.spaceId ?? space,
565
+ options?.environmentId ?? environment,
566
+ undefined
567
+ ], ()=>getEntity(entityType, entityId, undefined, options), {
568
+ enabled: options?.enabled && !!releaseId
569
+ });
507
570
  return {
508
571
  status,
509
- data
572
+ data,
573
+ currentEntity
510
574
  };
511
575
  }
512
576
  function useResource(resourceType, urn, { locale, ...options } = {}) {
@@ -18,20 +18,19 @@ function _interop_require_default(obj) {
18
18
  default: obj
19
19
  };
20
20
  }
21
- function EntityStatusBadge({ entityType, getEntityScheduledActions, status, useLocalizedEntityStatus, localesStatusMap, activeLocales, entity, releaseLocalesStatusMap, isReleasesLoading, releaseAction, activeRelease, ...props }) {
21
+ function EntityStatusBadge({ entityType, getEntityScheduledActions, status, useLocalizedEntityStatus, localesStatusMap, activeLocales, entity, releaseStatusMap, releaseAction, release, ...props }) {
22
22
  const { isError, isLoading, jobs } = (0, _ScheduledIconWithTooltip.useScheduledActions)({
23
23
  entityId: entity.sys.id,
24
24
  entityType,
25
25
  getEntityScheduledActions
26
26
  });
27
- if (activeRelease && releaseLocalesStatusMap && useLocalizedEntityStatus && activeLocales) {
27
+ if (release && releaseStatusMap && useLocalizedEntityStatus && activeLocales) {
28
28
  return /*#__PURE__*/ _react.default.createElement(_fieldeditorshared.ReleaseEntityStatusPopover, {
29
- releaseLocalesStatusMap: releaseLocalesStatusMap,
30
- activeLocales: activeLocales,
31
- isLoading: isReleasesLoading
29
+ releaseStatusMap: releaseStatusMap,
30
+ activeLocales: activeLocales
32
31
  });
33
32
  }
34
- if (activeRelease && releaseAction) {
33
+ if (release && releaseAction) {
35
34
  return /*#__PURE__*/ _react.default.createElement(_fieldeditorshared.ReleaseEntityStatusBadge, {
36
35
  action: releaseAction
37
36
  });
@@ -84,12 +84,12 @@ function CombinedEntryLinkActions(props) {
84
84
  onSelect: (contentTypeId)=>{
85
85
  return contentTypeId ? props.onCreate(contentTypeId) : Promise.resolve();
86
86
  },
87
- customDropdownItems: props.canLinkEntity ? /*#__PURE__*/ _react.createElement(_f36components.Menu, null, /*#__PURE__*/ _react.createElement(_f36components.Menu.Item, {
87
+ customDropdownItems: props.canLinkEntity ? /*#__PURE__*/ _react.createElement(_f36components.Menu.Item, {
88
88
  testId: testIds.linkExisting,
89
89
  onClick: ()=>{
90
90
  props.onLinkExisting();
91
91
  }
92
- }, "Add existing content")) : undefined
92
+ }, "Add existing content") : undefined
93
93
  });
94
94
  } else if (props.canLinkEntity) {
95
95
  return /*#__PURE__*/ _react.createElement(_f36components.Button, {
@@ -11,15 +11,9 @@ Object.defineProperty(exports, "FetchingWrappedEntryCard", {
11
11
  const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
12
12
  const _f36components = require("@contentful/f36-components");
13
13
  const _fieldeditorshared = require("@contentful/field-editor-shared");
14
- const _get = /*#__PURE__*/ _interop_require_default(require("lodash/get"));
15
14
  const _EntityStore = require("../../common/EntityStore");
16
15
  const _components = require("../../components");
17
16
  const _WrappedEntryCard = require("./WrappedEntryCard");
18
- function _interop_require_default(obj) {
19
- return obj && obj.__esModule ? obj : {
20
- default: obj
21
- };
22
- }
23
17
  function _getRequireWildcardCache(nodeInterop) {
24
18
  if (typeof WeakMap !== "function") return null;
25
19
  var cacheBabelInterop = new WeakMap();
@@ -81,24 +75,19 @@ async function openEntry(sdk, entryId, options) {
81
75
  return slide;
82
76
  }
83
77
  function FetchingWrappedEntryCard(props) {
84
- const { releaseVersionMap, locales, activeRelease, releases, isActiveReleaseLoading } = (0, _fieldeditorshared.parseReleaseParams)(props.sdk.parameters.instance.release);
85
- const { data: entry, status } = (0, _EntityStore.useEntity)('Entry', props.entryId);
78
+ const { data: entry, status, currentEntity } = (0, _EntityStore.useEntity)('Entry', props.entryId);
86
79
  const { getEntityScheduledActions } = (0, _EntityStore.useEntityLoader)();
87
80
  const loadEntityScheduledActions = _react.useCallback(()=>getEntityScheduledActions('Entry', props.entryId), [
88
81
  getEntityScheduledActions,
89
82
  props.entryId
90
83
  ]);
91
84
  const localesStatusMap = (0, _fieldeditorshared.useLocalePublishStatus)(entry, props.sdk.locales);
92
- const { releaseLocalesStatusMap } = (0, _fieldeditorshared.useActiveReleaseLocalesStatuses)({
93
- currentEntityDraft: entry,
94
- entityId: props.entryId,
95
- entityType: 'Entry',
96
- releaseVersionMap,
97
- locales,
98
- activeRelease,
99
- releases
85
+ const { releaseStatusMap, releaseAction } = (0, _fieldeditorshared.useReleaseStatus)({
86
+ entity: entry,
87
+ previousEntityOnTimeline: currentEntity,
88
+ release: props.sdk.release,
89
+ locales: props.sdk.locales
100
90
  });
101
- const { releaseAction } = (0, _fieldeditorshared.getEntityReleaseStatus)(props.entryId, locales, activeRelease);
102
91
  const size = props.viewType === 'link' ? 'small' : 'default';
103
92
  const { getEntity } = (0, _EntityStore.useEntityLoader)();
104
93
  const getAsset = (assetId)=>getEntity('Asset', assetId);
@@ -111,7 +100,7 @@ function FetchingWrappedEntryCard(props) {
111
100
  entity: 'Entry',
112
101
  type: 'edit',
113
102
  id: props.entryId,
114
- contentTypeId: (0, _get.default)(entry, 'sys.contentType.sys.id'),
103
+ contentTypeId: entry.sys.contentType.sys.id,
115
104
  slide
116
105
  });
117
106
  };
@@ -121,7 +110,7 @@ function FetchingWrappedEntryCard(props) {
121
110
  entity: 'Entry',
122
111
  type: 'delete',
123
112
  id: props.entryId,
124
- contentTypeId: (0, _get.default)(entry, 'sys.contentType.sys.id')
113
+ contentTypeId: entry.sys.contentType.sys.id
125
114
  });
126
115
  };
127
116
  _react.useEffect(()=>{
@@ -176,9 +165,8 @@ function FetchingWrappedEntryCard(props) {
176
165
  useLocalizedEntityStatus: props.sdk.parameters.instance.useLocalizedEntityStatus,
177
166
  localesStatusMap,
178
167
  activeLocales: props.activeLocales,
179
- releaseLocalesStatusMap,
180
- isReleasesLoading: isActiveReleaseLoading,
181
- activeRelease,
168
+ releaseStatusMap,
169
+ release: props.sdk.release,
182
170
  releaseAction
183
171
  };
184
172
  const { hasCardEditActions, hasCardMoveActions, hasCardRemoveActions } = props;
@@ -61,7 +61,7 @@ const defaultProps = {
61
61
  hasCardMoveActions: true,
62
62
  hasCardRemoveActions: true
63
63
  };
64
- function WrappedEntryCard({ entry, entryUrl, contentType, activeLocales, localeCode, defaultLocaleCode, localesStatusMap, useLocalizedEntityStatus, size, spaceName, isClickable, isDisabled, isSelected, hasCardMoveActions, hasCardEditActions, hasCardRemoveActions, renderDragHandle, getAsset, getEntityScheduledActions, onClick, onEdit, onRemove, onMoveTop, onMoveBottom, releaseAction, releaseLocalesStatusMap, isReleasesLoading, activeRelease }) {
64
+ function WrappedEntryCard({ entry, entryUrl, contentType, activeLocales, localeCode, defaultLocaleCode, localesStatusMap, useLocalizedEntityStatus, size, spaceName, isClickable, isDisabled, isSelected, hasCardMoveActions, hasCardEditActions, hasCardRemoveActions, renderDragHandle, getAsset, getEntityScheduledActions, onClick, onEdit, onRemove, onMoveTop, onMoveBottom, releaseAction, releaseStatusMap, release }) {
65
65
  const [file, setFile] = _react.useState(null);
66
66
  _react.useEffect(()=>{
67
67
  let mounted = true;
@@ -129,9 +129,8 @@ function WrappedEntryCard({ entry, entryUrl, contentType, activeLocales, localeC
129
129
  localesStatusMap: localesStatusMap,
130
130
  activeLocales: activeLocales,
131
131
  releaseAction: releaseAction,
132
- releaseLocalesStatusMap: releaseLocalesStatusMap,
133
- isReleasesLoading: isReleasesLoading,
134
- activeRelease: activeRelease
132
+ releaseStatusMap: releaseStatusMap,
133
+ release: release
135
134
  }),
136
135
  icon: spaceName ? /*#__PURE__*/ _react.createElement(_SpaceName.SpaceName, {
137
136
  spaceName: spaceName,
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
6
6
  require("@testing-library/jest-dom");
7
- const _fieldeditortestutils = require("@contentful/field-editor-test-utils");
8
7
  const _react1 = require("@testing-library/react");
9
8
  const _published_content_typejson = /*#__PURE__*/ _interop_require_default(require("../../__fixtures__/content-type/published_content_type.json"));
10
9
  const _published_entry_non_masterjson = /*#__PURE__*/ _interop_require_default(require("../../__fixtures__/entry/published_entry_non_master.json"));
@@ -77,11 +76,11 @@ const sdk = {
77
76
  locales: {
78
77
  default: 'en-US'
79
78
  },
80
- cmaAdapter: (0, _fieldeditortestutils.createFakeCMAAdapter)({
81
- ContentType: {
79
+ cma: {
80
+ contentType: {
82
81
  get: jest.fn().mockReturnValue(_published_content_typejson.default)
83
82
  },
84
- Entry: {
83
+ entry: {
85
84
  get: jest.fn().mockImplementation(({ spaceId, environmentId, entryId })=>{
86
85
  if (spaceId === 'space-id' && environmentId === 'master' && entryId === 'linked-entry-urn') {
87
86
  return Promise.resolve(_published_entryjson.default);
@@ -92,7 +91,7 @@ const sdk = {
92
91
  return Promise.reject(new Error());
93
92
  })
94
93
  },
95
- Locale: {
94
+ locale: {
96
95
  getMany: jest.fn().mockResolvedValue({
97
96
  items: [
98
97
  {
@@ -102,7 +101,7 @@ const sdk = {
102
101
  ]
103
102
  })
104
103
  },
105
- Resource: {
104
+ resource: {
106
105
  getMany: jest.fn().mockImplementation(({ spaceId, environmentId, resourceTypeId, query })=>{
107
106
  if (spaceId === 'space-id' && environmentId === 'environment-id' && resourceTypeId === resolvableExternalResourceType && query['sys.urn[in]'] === resolvableExternalEntityUrn) {
108
107
  return Promise.resolve({
@@ -122,8 +121,12 @@ const sdk = {
122
121
  });
123
122
  })
124
123
  },
125
- ResourceType: {
124
+ resourceType: {
126
125
  getForEnvironment: jest.fn().mockImplementation(({ spaceId, environmentId })=>{
126
+ console.log('>> getForEnvironment', {
127
+ spaceId,
128
+ environmentId
129
+ });
127
130
  if (spaceId === 'space-id' && environmentId === 'environment-id') {
128
131
  return Promise.resolve({
129
132
  items: [
@@ -137,16 +140,16 @@ const sdk = {
137
140
  });
138
141
  })
139
142
  },
140
- ScheduledAction: {
143
+ scheduledActions: {
141
144
  getMany: jest.fn().mockResolvedValue({
142
145
  items: [],
143
146
  total: 0
144
147
  })
145
148
  },
146
- Space: {
149
+ space: {
147
150
  get: jest.fn().mockResolvedValue(_indifferent_spacejson.default)
148
151
  },
149
- ResourceProvider: {
152
+ resourceProvider: {
150
153
  get: jest.fn().mockImplementation(()=>{
151
154
  return Promise.resolve({
152
155
  function: {
@@ -157,7 +160,7 @@ const sdk = {
157
160
  });
158
161
  })
159
162
  }
160
- }),
163
+ },
161
164
  space: {
162
165
  onEntityChanged: jest.fn()
163
166
  },
@@ -1,4 +1,4 @@
1
- import { createFakeCMAAdapter, createFakeFieldAPI, createFakeLocalesAPI, createFakeSpaceAPI } from '@contentful/field-editor-test-utils';
1
+ import { createFakeFieldAPI, createFakeLocalesAPI, createFakeSpaceAPI } from '@contentful/field-editor-test-utils';
2
2
  import { assets, contentTypes, entries, locales as localesFixtures, spaces } from './fixtures';
3
3
  const newLink = (linkType, id)=>({
4
4
  sys: {
@@ -47,8 +47,8 @@ export function newReferenceEditorFakeSdk(props) {
47
47
  const sdk = {
48
48
  field,
49
49
  locales,
50
- cmaAdapter: createFakeCMAAdapter({
51
- Entry: {
50
+ cma: {
51
+ entry: {
52
52
  get: async ({ entryId })=>{
53
53
  if (props?.fetchDelay) {
54
54
  await delay(props.fetchDelay);
@@ -65,7 +65,7 @@ export function newReferenceEditorFakeSdk(props) {
65
65
  return Promise.reject({});
66
66
  }
67
67
  },
68
- Asset: {
68
+ asset: {
69
69
  get: async ({ assetId })=>{
70
70
  if (props?.fetchDelay) {
71
71
  await delay(props.fetchDelay);
@@ -82,7 +82,7 @@ export function newReferenceEditorFakeSdk(props) {
82
82
  return Promise.reject({});
83
83
  }
84
84
  },
85
- Space: {
85
+ space: {
86
86
  get: async (params)=>{
87
87
  if (params.spaceId === spaces.indifferent.sys.id) {
88
88
  return spaces.indifferent;
@@ -90,7 +90,7 @@ export function newReferenceEditorFakeSdk(props) {
90
90
  return Promise.reject({});
91
91
  }
92
92
  },
93
- ContentType: {
93
+ contentType: {
94
94
  get: async ({ contentTypeId })=>{
95
95
  if (contentTypeId === contentTypes.published.sys.id) {
96
96
  return contentTypes.published;
@@ -101,7 +101,7 @@ export function newReferenceEditorFakeSdk(props) {
101
101
  Locale: {
102
102
  getMany: async ()=>localesFixtures.list
103
103
  }
104
- }),
104
+ },
105
105
  space: {
106
106
  ...space,
107
107
  getCachedContentTypes () {
@@ -1,30 +1,25 @@
1
1
  import * as React from 'react';
2
2
  import { AssetCard, EntryCard } from '@contentful/f36-components';
3
- import { useLocalePublishStatus, useActiveLocales, useActiveReleaseLocalesStatuses, parseReleaseParams, getEntityReleaseStatus } from '@contentful/field-editor-shared';
3
+ import { useLocalePublishStatus, useActiveLocales, useReleaseStatus } from '@contentful/field-editor-shared';
4
4
  import { useEntity, useEntityLoader } from '../../common/EntityStore';
5
5
  import { MissingAssetCard } from '../../components';
6
6
  import { WrappedAssetCard } from './WrappedAssetCard';
7
7
  import { WrappedAssetLink } from './WrappedAssetLink';
8
8
  export function FetchingWrappedAssetCard(props) {
9
- const { releaseVersionMap, locales, activeRelease, releases, isActiveReleaseLoading } = parseReleaseParams(props.sdk.parameters.instance.release);
10
- const { data: asset, status } = useEntity('Asset', props.assetId);
9
+ const { data: asset, status, currentEntity } = useEntity('Asset', props.assetId);
11
10
  const { getEntityScheduledActions } = useEntityLoader();
12
11
  const loadEntityScheduledActions = React.useCallback(()=>getEntityScheduledActions('Asset', props.assetId), [
13
12
  getEntityScheduledActions,
14
13
  props.assetId
15
14
  ]);
15
+ const activeLocales = useActiveLocales(props.sdk);
16
16
  const localesStatusMap = useLocalePublishStatus(asset, props.sdk.locales);
17
- const { releaseLocalesStatusMap } = useActiveReleaseLocalesStatuses({
18
- currentEntityDraft: asset,
19
- entityId: props.assetId,
20
- entityType: 'Asset',
21
- releaseVersionMap,
22
- locales,
23
- activeRelease,
24
- releases
17
+ const { releaseStatusMap, releaseAction } = useReleaseStatus({
18
+ entity: asset,
19
+ previousEntityOnTimeline: currentEntity,
20
+ release: props.sdk.release,
21
+ locales: props.sdk.locales
25
22
  });
26
- const { releaseAction } = getEntityReleaseStatus(props.assetId, locales, activeRelease);
27
- const activeLocales = useActiveLocales(props.sdk);
28
23
  React.useEffect(()=>{
29
24
  if (asset) {
30
25
  props.onAction && props.onAction({
@@ -89,9 +84,8 @@ export function FetchingWrappedAssetCard(props) {
89
84
  useLocalizedEntityStatus: props.sdk.parameters.instance.useLocalizedEntityStatus,
90
85
  localesStatusMap,
91
86
  activeLocales,
92
- releaseLocalesStatusMap,
93
- isReleasesLoading: isActiveReleaseLoading,
94
- activeRelease,
87
+ releaseStatusMap,
88
+ release: props.sdk.release,
95
89
  releaseAction
96
90
  };
97
91
  if (status === 'loading') {