@contentful/field-editor-reference 6.12.1 → 6.13.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 (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 +102 -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 +103 -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
@@ -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') {
@@ -30,7 +30,7 @@ function getFileType(file) {
30
30
  });
31
31
  return groupToIconMap[groupName] || 'archive';
32
32
  }
33
- export const WrappedAssetCard = ({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction, releaseLocalesStatusMap, isReleasesLoading, activeRelease })=>{
33
+ export const WrappedAssetCard = ({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction, releaseStatusMap, release })=>{
34
34
  const status = entityHelpers.getEntityStatus(asset.sys, useLocalizedEntityStatus ? localeCode : undefined);
35
35
  if (status === 'deleted') {
36
36
  return /*#__PURE__*/ React.createElement(MissingAssetCard, {
@@ -63,9 +63,8 @@ export const WrappedAssetCard = ({ asset, className, size, localeCode, defaultLo
63
63
  localesStatusMap: localesStatusMap,
64
64
  activeLocales: activeLocales,
65
65
  releaseAction: releaseAction,
66
- releaseLocalesStatusMap: releaseLocalesStatusMap,
67
- isReleasesLoading: isReleasesLoading,
68
- activeRelease: activeRelease
66
+ releaseStatusMap: releaseStatusMap,
67
+ release: release
69
68
  }),
70
69
  src: entityFile && entityFile.url ? size === 'small' ? `${entityFile.url}?w=150&h=150&fit=thumb` : `${entityFile.url}?h=300` : '',
71
70
  onClick: isClickable ? (e)=>{
@@ -35,9 +35,8 @@ export const WrappedAssetLink = (props)=>{
35
35
  localesStatusMap: props.localesStatusMap,
36
36
  activeLocales: props.activeLocales,
37
37
  releaseAction: props.releaseAction,
38
- releaseLocalesStatusMap: props.releaseLocalesStatusMap,
39
- isReleasesLoading: props.isReleasesLoading,
40
- activeRelease: props.activeRelease
38
+ releaseStatusMap: props.releaseStatusMap,
39
+ release: props.release
41
40
  }),
42
41
  thumbnailElement: entityFile && isValidImage(entityFile) ? /*#__PURE__*/ React.createElement(AssetThumbnail, {
43
42
  file: entityFile
@@ -13,7 +13,7 @@ function _define_property(obj, key, value) {
13
13
  }
14
14
  import React, { useCallback, useEffect, useMemo, useRef } from 'react';
15
15
  import constate from 'constate';
16
- import { createClient, fetchAll } from 'contentful-management';
16
+ import { fetchAll } from 'contentful-management';
17
17
  import PQueue from 'p-queue';
18
18
  import { SharedQueryClientProvider, useQuery, useQueryClient } from './queryClient';
19
19
  export function isContentfulResourceInfo(info) {
@@ -153,12 +153,20 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
153
153
  'resource-types',
154
154
  spaceId,
155
155
  environmentId
156
- ], ({ cmaClient })=>fetchAll(({ query })=>cmaClient.resourceType.getForEnvironment({
156
+ ], ({ cmaClient })=>{
157
+ console.log('>> fetch resource types', {
158
+ spaceId,
159
+ environmentId
160
+ });
161
+ return fetchAll(({ query })=>cmaClient.resourceType.getForEnvironment({
157
162
  spaceId,
158
163
  environmentId,
159
164
  query
160
- }), {}))
165
+ }), {});
166
+ })
161
167
  ]);
168
+ console.log('>> resource', resource);
169
+ console.log('>> resourceTypes', resourceTypes);
162
170
  const resourceTypeEntity = resourceTypes.find((rt)=>rt.sys.id === resourceType);
163
171
  if (!resourceTypeEntity) {
164
172
  throw new UnsupportedError('Unsupported resource type');
@@ -177,6 +185,7 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
177
185
  const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = constate(function useInitServices(props) {
178
186
  const currentSpaceId = props.sdk.ids.space;
179
187
  const currentEnvironmentId = props.sdk.ids.environmentAlias ?? props.sdk.ids.environment;
188
+ const releaseId = props.sdk.ids.release;
180
189
  const environmentIds = useMemo(()=>[
181
190
  props.sdk.ids.environmentAlias,
182
191
  props.sdk.ids.environment
@@ -187,13 +196,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
187
196
  const queryClient = useQueryClient();
188
197
  const queryCache = queryClient.getQueryCache();
189
198
  const entityChangeUnsubscribers = useRef({});
190
- const cmaClient = useMemo(()=>createClient({
191
- apiAdapter: props.sdk.cmaAdapter
192
- }, {
193
- type: 'plain'
194
- }), [
195
- props.sdk.cmaAdapter
196
- ]);
199
+ const cmaClient = props.sdk.cma;
197
200
  const queryQueue = useMemo(()=>{
198
201
  if (props.queryConcurrency) {
199
202
  return new PQueue({
@@ -216,38 +219,92 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
216
219
  queryQueue,
217
220
  cmaClient
218
221
  ]);
219
- const getEntity = useCallback(function getEntity(entityType, entityId, options) {
222
+ const isReleaseRequestError = useCallback(function isReleaseRequestError(error, spaceId, environmentId) {
223
+ return !!releaseId && (!spaceId || spaceId === currentSpaceId) && (!environmentId || environmentId === currentEnvironmentId) && error instanceof Error && 'status' in error && error.status === 404;
224
+ }, [
225
+ releaseId,
226
+ currentSpaceId,
227
+ currentEnvironmentId
228
+ ]);
229
+ const getEntity = useCallback(function getEntity(entityType, entityId, releaseId, options) {
220
230
  const spaceId = options?.spaceId ?? currentSpaceId;
221
231
  const environmentId = options?.environmentId ?? currentEnvironmentId;
222
232
  const queryKey = [
223
233
  entityType,
224
234
  entityId,
225
235
  spaceId,
226
- environmentId
236
+ environmentId,
237
+ releaseId
227
238
  ];
228
- return fetch(queryKey, ({ cmaClient })=>{
239
+ return fetch(queryKey, async ({ cmaClient })=>{
229
240
  if (entityType === 'Entry') {
230
- return cmaClient.entry.get({
231
- entryId: entityId,
232
- spaceId,
233
- environmentId
234
- });
241
+ try {
242
+ return cmaClient.entry.get({
243
+ entryId: entityId,
244
+ spaceId,
245
+ environmentId,
246
+ releaseId
247
+ });
248
+ } catch (error) {
249
+ if (isReleaseRequestError(error, spaceId, environmentId)) {
250
+ const currentEntry = await cmaClient.entry.get({
251
+ entryId: entityId,
252
+ spaceId,
253
+ environmentId,
254
+ releaseId: undefined
255
+ });
256
+ currentEntry.sys.release = {
257
+ sys: {
258
+ type: 'Link',
259
+ linkType: 'Release',
260
+ id: releaseId
261
+ }
262
+ };
263
+ return currentEntry;
264
+ }
265
+ throw error;
266
+ }
235
267
  }
236
268
  if (entityType === 'Asset') {
237
- return cmaClient.asset.get({
238
- assetId: entityId,
239
- spaceId,
240
- environmentId
241
- });
269
+ try {
270
+ return cmaClient.asset.get({
271
+ assetId: entityId,
272
+ spaceId,
273
+ environmentId,
274
+ releaseId
275
+ });
276
+ } catch (error) {
277
+ if (isReleaseRequestError(error, spaceId, environmentId)) {
278
+ const currentAsset = cmaClient.asset.get({
279
+ assetId: entityId,
280
+ spaceId,
281
+ environmentId,
282
+ releaseId: undefined
283
+ });
284
+ currentAsset.sys.release = {
285
+ sys: {
286
+ type: 'Link',
287
+ linkType: 'Release',
288
+ id: releaseId
289
+ }
290
+ };
291
+ return currentAsset;
292
+ }
293
+ throw error;
294
+ }
242
295
  }
243
296
  throw new UnsupportedError('Unsupported entity type');
244
297
  }, options);
245
298
  }, [
246
299
  fetch,
247
300
  currentSpaceId,
248
- currentEnvironmentId
301
+ currentEnvironmentId,
302
+ isReleaseRequestError
249
303
  ]);
250
304
  const getEntityScheduledActions = useCallback(function getEntityScheduledActions(entityType, entityId, options) {
305
+ if (releaseId) {
306
+ return new Promise((resolve)=>resolve([]));
307
+ }
251
308
  const fixedEntityCacheId = 'scheduledActionEntityId';
252
309
  const maxScheduledActions = 500;
253
310
  const spaceId = options?.spaceId ?? currentSpaceId;
@@ -257,7 +314,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
257
314
  entityType,
258
315
  fixedEntityCacheId,
259
316
  spaceId,
260
- environmentId
317
+ environmentId,
318
+ releaseId
261
319
  ];
262
320
  return fetch(queryKey, async ({ cmaClient })=>{
263
321
  const response = await cmaClient.scheduledActions.getMany({
@@ -274,7 +332,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
274
332
  }, [
275
333
  fetch,
276
334
  currentSpaceId,
277
- currentEnvironmentId
335
+ currentEnvironmentId,
336
+ releaseId
278
337
  ]);
279
338
  const getResource = useCallback(function getResource(resourceType, urn, options) {
280
339
  const queryKey = [
@@ -402,23 +461,34 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
402
461
  getResourceProvider
403
462
  }), ({ ids })=>({
404
463
  environment: ids.environmentAlias ?? ids.environment,
405
- space: ids.space
464
+ space: ids.space,
465
+ releaseId: ids.release
406
466
  }));
407
467
  export function useEntity(entityType, entityId, options) {
408
- const { space, environment } = useCurrentIds();
468
+ const { space, environment, releaseId } = useCurrentIds();
409
469
  const { getEntity } = useEntityLoader();
410
- const queryKey = [
470
+ const { status, data } = useQuery([
411
471
  entityType,
412
472
  entityId,
413
473
  options?.spaceId ?? space,
414
- options?.environmentId ?? environment
415
- ];
416
- const { status, data } = useQuery(queryKey, ()=>getEntity(entityType, entityId, options), {
474
+ options?.environmentId ?? environment,
475
+ releaseId
476
+ ], ()=>getEntity(entityType, entityId, releaseId, options), {
417
477
  enabled: options?.enabled
418
478
  });
479
+ const { data: currentEntity } = useQuery([
480
+ entityType,
481
+ entityId,
482
+ options?.spaceId ?? space,
483
+ options?.environmentId ?? environment,
484
+ undefined
485
+ ], ()=>getEntity(entityType, entityId, undefined, options), {
486
+ enabled: options?.enabled && !!releaseId
487
+ });
419
488
  return {
420
489
  status,
421
- data
490
+ data,
491
+ currentEntity
422
492
  };
423
493
  }
424
494
  export function useResource(resourceType, urn, { locale, ...options } = {}) {
@@ -3,20 +3,19 @@ import { EntityStatusBadge as StatusBadge } from '@contentful/f36-components';
3
3
  import { LocalePublishingPopover, ReleaseEntityStatusPopover, ReleaseEntityStatusBadge } from '@contentful/field-editor-shared';
4
4
  import { useScheduledActions } from '../ScheduledIconWithTooltip/ScheduledIconWithTooltip';
5
5
  import { ScheduleTooltip } from '../ScheduledIconWithTooltip/ScheduleTooltip';
6
- export function EntityStatusBadge({ entityType, getEntityScheduledActions, status, useLocalizedEntityStatus, localesStatusMap, activeLocales, entity, releaseLocalesStatusMap, isReleasesLoading, releaseAction, activeRelease, ...props }) {
6
+ export function EntityStatusBadge({ entityType, getEntityScheduledActions, status, useLocalizedEntityStatus, localesStatusMap, activeLocales, entity, releaseStatusMap, releaseAction, release, ...props }) {
7
7
  const { isError, isLoading, jobs } = useScheduledActions({
8
8
  entityId: entity.sys.id,
9
9
  entityType,
10
10
  getEntityScheduledActions
11
11
  });
12
- if (activeRelease && releaseLocalesStatusMap && useLocalizedEntityStatus && activeLocales) {
12
+ if (release && releaseStatusMap && useLocalizedEntityStatus && activeLocales) {
13
13
  return /*#__PURE__*/ React.createElement(ReleaseEntityStatusPopover, {
14
- releaseLocalesStatusMap: releaseLocalesStatusMap,
15
- activeLocales: activeLocales,
16
- isLoading: isReleasesLoading
14
+ releaseStatusMap: releaseStatusMap,
15
+ activeLocales: activeLocales
17
16
  });
18
17
  }
19
- if (activeRelease && releaseAction) {
18
+ if (release && releaseAction) {
20
19
  return /*#__PURE__*/ React.createElement(ReleaseEntityStatusBadge, {
21
20
  action: releaseAction
22
21
  });
@@ -33,12 +33,12 @@ function CombinedEntryLinkActions(props) {
33
33
  onSelect: (contentTypeId)=>{
34
34
  return contentTypeId ? props.onCreate(contentTypeId) : Promise.resolve();
35
35
  },
36
- customDropdownItems: props.canLinkEntity ? /*#__PURE__*/ React.createElement(Menu, null, /*#__PURE__*/ React.createElement(Menu.Item, {
36
+ customDropdownItems: props.canLinkEntity ? /*#__PURE__*/ React.createElement(Menu.Item, {
37
37
  testId: testIds.linkExisting,
38
38
  onClick: ()=>{
39
39
  props.onLinkExisting();
40
40
  }
41
- }, "Add existing content")) : undefined
41
+ }, "Add existing content") : undefined
42
42
  });
43
43
  } else if (props.canLinkEntity) {
44
44
  return /*#__PURE__*/ React.createElement(Button, {
@@ -1,7 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { EntryCard } from '@contentful/f36-components';
3
- import { parseReleaseParams, useLocalePublishStatus, useActiveReleaseLocalesStatuses, getEntityReleaseStatus } from '@contentful/field-editor-shared';
4
- import get from 'lodash/get';
3
+ import { useLocalePublishStatus, useReleaseStatus } from '@contentful/field-editor-shared';
5
4
  import { useEntity, useEntityLoader } from '../../common/EntityStore';
6
5
  import { MissingEntityCard } from '../../components';
7
6
  import { WrappedEntryCard } from './WrappedEntryCard';
@@ -25,24 +24,19 @@ async function openEntry(sdk, entryId, options) {
25
24
  return slide;
26
25
  }
27
26
  export function FetchingWrappedEntryCard(props) {
28
- const { releaseVersionMap, locales, activeRelease, releases, isActiveReleaseLoading } = parseReleaseParams(props.sdk.parameters.instance.release);
29
- const { data: entry, status } = useEntity('Entry', props.entryId);
27
+ const { data: entry, status, currentEntity } = useEntity('Entry', props.entryId);
30
28
  const { getEntityScheduledActions } = useEntityLoader();
31
29
  const loadEntityScheduledActions = React.useCallback(()=>getEntityScheduledActions('Entry', props.entryId), [
32
30
  getEntityScheduledActions,
33
31
  props.entryId
34
32
  ]);
35
33
  const localesStatusMap = useLocalePublishStatus(entry, props.sdk.locales);
36
- const { releaseLocalesStatusMap } = useActiveReleaseLocalesStatuses({
37
- currentEntityDraft: entry,
38
- entityId: props.entryId,
39
- entityType: 'Entry',
40
- releaseVersionMap,
41
- locales,
42
- activeRelease,
43
- releases
34
+ const { releaseStatusMap, releaseAction } = useReleaseStatus({
35
+ entity: entry,
36
+ previousEntityOnTimeline: currentEntity,
37
+ release: props.sdk.release,
38
+ locales: props.sdk.locales
44
39
  });
45
- const { releaseAction } = getEntityReleaseStatus(props.entryId, locales, activeRelease);
46
40
  const size = props.viewType === 'link' ? 'small' : 'default';
47
41
  const { getEntity } = useEntityLoader();
48
42
  const getAsset = (assetId)=>getEntity('Asset', assetId);
@@ -55,7 +49,7 @@ export function FetchingWrappedEntryCard(props) {
55
49
  entity: 'Entry',
56
50
  type: 'edit',
57
51
  id: props.entryId,
58
- contentTypeId: get(entry, 'sys.contentType.sys.id'),
52
+ contentTypeId: entry.sys.contentType.sys.id,
59
53
  slide
60
54
  });
61
55
  };
@@ -65,7 +59,7 @@ export function FetchingWrappedEntryCard(props) {
65
59
  entity: 'Entry',
66
60
  type: 'delete',
67
61
  id: props.entryId,
68
- contentTypeId: get(entry, 'sys.contentType.sys.id')
62
+ contentTypeId: entry.sys.contentType.sys.id
69
63
  });
70
64
  };
71
65
  React.useEffect(()=>{
@@ -120,9 +114,8 @@ export function FetchingWrappedEntryCard(props) {
120
114
  useLocalizedEntityStatus: props.sdk.parameters.instance.useLocalizedEntityStatus,
121
115
  localesStatusMap,
122
116
  activeLocales: props.activeLocales,
123
- releaseLocalesStatusMap,
124
- isReleasesLoading: isActiveReleaseLoading,
125
- activeRelease,
117
+ releaseStatusMap,
118
+ release: props.sdk.release,
126
119
  releaseAction
127
120
  };
128
121
  const { hasCardEditActions, hasCardMoveActions, hasCardRemoveActions } = props;
@@ -10,7 +10,7 @@ const defaultProps = {
10
10
  hasCardMoveActions: true,
11
11
  hasCardRemoveActions: true
12
12
  };
13
- export 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 }) {
13
+ export 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 }) {
14
14
  const [file, setFile] = React.useState(null);
15
15
  React.useEffect(()=>{
16
16
  let mounted = true;
@@ -78,9 +78,8 @@ export function WrappedEntryCard({ entry, entryUrl, contentType, activeLocales,
78
78
  localesStatusMap: localesStatusMap,
79
79
  activeLocales: activeLocales,
80
80
  releaseAction: releaseAction,
81
- releaseLocalesStatusMap: releaseLocalesStatusMap,
82
- isReleasesLoading: isReleasesLoading,
83
- activeRelease: activeRelease
81
+ releaseStatusMap: releaseStatusMap,
82
+ release: release
84
83
  }),
85
84
  icon: spaceName ? /*#__PURE__*/ React.createElement(SpaceName, {
86
85
  spaceName: spaceName,
@@ -1,6 +1,5 @@
1
1
  import * as React from 'react';
2
2
  import '@testing-library/jest-dom';
3
- import { createFakeCMAAdapter } from '@contentful/field-editor-test-utils';
4
3
  import { configure, fireEvent, render, waitFor } from '@testing-library/react';
5
4
  import publishedCT from '../../__fixtures__/content-type/published_content_type.json';
6
5
  import publishedEntryNonMasterEnvironment from '../../__fixtures__/entry/published_entry_non_master.json';
@@ -27,11 +26,11 @@ const sdk = {
27
26
  locales: {
28
27
  default: 'en-US'
29
28
  },
30
- cmaAdapter: createFakeCMAAdapter({
31
- ContentType: {
29
+ cma: {
30
+ contentType: {
32
31
  get: jest.fn().mockReturnValue(publishedCT)
33
32
  },
34
- Entry: {
33
+ entry: {
35
34
  get: jest.fn().mockImplementation(({ spaceId, environmentId, entryId })=>{
36
35
  if (spaceId === 'space-id' && environmentId === 'master' && entryId === 'linked-entry-urn') {
37
36
  return Promise.resolve(publishedEntry);
@@ -42,7 +41,7 @@ const sdk = {
42
41
  return Promise.reject(new Error());
43
42
  })
44
43
  },
45
- Locale: {
44
+ locale: {
46
45
  getMany: jest.fn().mockResolvedValue({
47
46
  items: [
48
47
  {
@@ -52,7 +51,7 @@ const sdk = {
52
51
  ]
53
52
  })
54
53
  },
55
- Resource: {
54
+ resource: {
56
55
  getMany: jest.fn().mockImplementation(({ spaceId, environmentId, resourceTypeId, query })=>{
57
56
  if (spaceId === 'space-id' && environmentId === 'environment-id' && resourceTypeId === resolvableExternalResourceType && query['sys.urn[in]'] === resolvableExternalEntityUrn) {
58
57
  return Promise.resolve({
@@ -72,8 +71,12 @@ const sdk = {
72
71
  });
73
72
  })
74
73
  },
75
- ResourceType: {
74
+ resourceType: {
76
75
  getForEnvironment: jest.fn().mockImplementation(({ spaceId, environmentId })=>{
76
+ console.log('>> getForEnvironment', {
77
+ spaceId,
78
+ environmentId
79
+ });
77
80
  if (spaceId === 'space-id' && environmentId === 'environment-id') {
78
81
  return Promise.resolve({
79
82
  items: [
@@ -87,16 +90,16 @@ const sdk = {
87
90
  });
88
91
  })
89
92
  },
90
- ScheduledAction: {
93
+ scheduledActions: {
91
94
  getMany: jest.fn().mockResolvedValue({
92
95
  items: [],
93
96
  total: 0
94
97
  })
95
98
  },
96
- Space: {
99
+ space: {
97
100
  get: jest.fn().mockResolvedValue(space)
98
101
  },
99
- ResourceProvider: {
102
+ resourceProvider: {
100
103
  get: jest.fn().mockImplementation(()=>{
101
104
  return Promise.resolve({
102
105
  function: {
@@ -107,7 +110,7 @@ const sdk = {
107
110
  });
108
111
  })
109
112
  }
110
- }),
113
+ },
111
114
  space: {
112
115
  onEntityChanged: jest.fn()
113
116
  },
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { SpaceAPI } from '@contentful/app-sdk';
3
- import { type LocalePublishStatusMap, type ReleaseAction, type ReleaseLocalesStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
3
+ import { type LocalePublishStatusMap, type ReleaseAction, type ReleaseStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
4
4
  import { LocaleProps } from 'contentful-management';
5
5
  import { Asset, RenderDragFn } from '../../types';
6
6
  export interface WrappedAssetCardProps {
@@ -21,12 +21,11 @@ export interface WrappedAssetCardProps {
21
21
  localesStatusMap?: LocalePublishStatusMap;
22
22
  activeLocales?: Pick<LocaleProps, 'code'>[];
23
23
  releaseAction?: ReleaseAction;
24
- releaseLocalesStatusMap?: ReleaseLocalesStatusMap;
25
- isReleasesLoading?: boolean;
26
- activeRelease?: ReleaseV2Props;
24
+ releaseStatusMap?: ReleaseStatusMap;
25
+ release?: ReleaseV2Props;
27
26
  }
28
27
  export declare const WrappedAssetCard: {
29
- ({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction, releaseLocalesStatusMap, isReleasesLoading, activeRelease, }: WrappedAssetCardProps): React.JSX.Element;
28
+ ({ asset, className, size, localeCode, defaultLocaleCode, activeLocales, localesStatusMap, isDisabled, isSelected, isClickable, useLocalizedEntityStatus, renderDragHandle, getEntityScheduledActions, onEdit, getAssetUrl, onRemove, releaseAction, releaseStatusMap, release, }: WrappedAssetCardProps): React.JSX.Element;
30
29
  defaultProps: {
31
30
  isClickable: boolean;
32
31
  };
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { type ReleaseAction, type LocalePublishStatusMap, type ReleaseLocalesStatusMap, type ReleaseV2Props, type SpaceAPI } from '@contentful/field-editor-shared';
2
+ import { type ReleaseAction, type LocalePublishStatusMap, type ReleaseStatusMap, type ReleaseV2Props, type SpaceAPI } from '@contentful/field-editor-shared';
3
3
  import type { LocaleProps } from 'contentful-management';
4
4
  import { Asset, RenderDragFn } from '../../types';
5
5
  export interface WrappedAssetLinkProps {
@@ -18,8 +18,7 @@ export interface WrappedAssetLinkProps {
18
18
  activeLocales?: Pick<LocaleProps, 'code'>[];
19
19
  isClickable?: boolean;
20
20
  releaseAction?: ReleaseAction;
21
- releaseLocalesStatusMap?: ReleaseLocalesStatusMap;
22
- isReleasesLoading?: boolean;
23
- activeRelease?: ReleaseV2Props;
21
+ releaseStatusMap?: ReleaseStatusMap;
22
+ release?: ReleaseV2Props;
24
23
  }
25
24
  export declare const WrappedAssetLink: (props: WrappedAssetLinkProps) => React.JSX.Element;
@@ -24,6 +24,7 @@ type GetOptions = {
24
24
  type GetEntityOptions = GetOptions & {
25
25
  spaceId?: string;
26
26
  environmentId?: string;
27
+ releaseId?: string;
27
28
  };
28
29
  type UseEntityOptions = GetEntityOptions & {
29
30
  enabled?: boolean;
@@ -41,15 +42,19 @@ type UseResourceOptions = GetResourceOptions & {
41
42
  type UseEntityResult<E> = {
42
43
  status: 'idle';
43
44
  data: never;
45
+ currentEntity: never;
44
46
  } | {
45
47
  status: 'loading';
46
48
  data: never;
49
+ currentEntity: never;
47
50
  } | {
48
51
  status: 'error';
49
52
  data: never;
53
+ currentEntity: never;
50
54
  } | {
51
55
  status: 'success';
52
56
  data: E;
57
+ currentEntity?: E;
53
58
  };
54
59
  type FetchableEntityType = 'Entry' | 'Asset';
55
60
  type FetchableEntity = Entry | Asset;
@@ -77,11 +82,11 @@ export declare class FunctionInvocationError extends Error {
77
82
  export declare function isFunctionInvocationError(value: unknown): value is FunctionInvocationError;
78
83
  declare const useEntityLoader: () => {
79
84
  getResource: <R extends Resource = Resource>(resourceType: string, urn: string, options?: GetResourceOptions) => QueryResourceResult<R>;
80
- getEntity: <E extends FetchableEntity>(entityType: FetchableEntityType, entityId: string, options?: GetEntityOptions) => QueryEntityResult<E>;
85
+ getEntity: <E extends FetchableEntity>(entityType: FetchableEntityType, entityId: string, releaseId?: string, options?: GetEntityOptions) => QueryEntityResult<E>;
81
86
  getEntityScheduledActions: (entityType: FetchableEntityType, entityId: string, options?: GetEntityOptions) => QueryEntityResult<ScheduledAction[]>;
82
87
  getResourceProvider: (organizationId: string, appDefinitionId: string) => QueryEntityResult<ResourceProvider>;
83
88
  };
84
- export declare function useEntity<E extends FetchableEntity>(entityType: FetchableEntityType, entityId: string, options?: UseEntityOptions): UseEntityResult<E>;
89
+ export declare function useEntity<E extends FetchableEntity>(entityType: FetchableEntityType, entityId: string, options?: Omit<UseEntityOptions, 'releaseId'>): UseEntityResult<E>;
85
90
  export declare function useResource<R extends Resource = Resource>(resourceType: string, urn: string, { locale, ...options }?: UseResourceOptions): {
86
91
  status: "error" | "success" | "loading";
87
92
  data: ResourceInfo<R> | undefined;
@@ -1,9 +1,9 @@
1
1
  import * as React from 'react';
2
- import { LocalePublishStatusMap, type ReleaseAction, type ReleaseLocalesStatusMap, type ReleaseV2Props } from '@contentful/field-editor-shared';
3
- import { LocaleProps } from 'contentful-management';
4
- import { WrappedAssetCardProps } from '../assets/WrappedAssetCard/WrappedAssetCard';
5
- import { Asset, ContentType, Entry, RenderDragFn } from '../types';
6
- import { CustomActionProps } from './ReferenceEditor';
2
+ import type { LocalePublishStatusMap, ReleaseAction, ReleaseStatusMap, ReleaseV2Props } from '@contentful/field-editor-shared';
3
+ import type { LocaleProps } from 'contentful-management';
4
+ import type { WrappedAssetCardProps } from '../assets/WrappedAssetCard/WrappedAssetCard';
5
+ import type { Asset, ContentType, Entry, RenderDragFn } from '../types';
6
+ import type { CustomActionProps } from './ReferenceEditor';
7
7
  export type MissingEntityCardProps = {
8
8
  defaultCard: React.ReactElement;
9
9
  entity: {
@@ -32,8 +32,7 @@ export type CustomEntityCardProps = {
32
32
  useLocalizedEntityStatus?: boolean;
33
33
  localesStatusMap?: LocalePublishStatusMap;
34
34
  activeLocales?: Pick<LocaleProps, 'code'>[];
35
- releaseLocalesStatusMap?: ReleaseLocalesStatusMap;
36
- isReleasesLoading?: boolean;
35
+ releaseStatusMap?: ReleaseStatusMap;
37
36
  releaseAction?: ReleaseAction;
38
- activeRelease?: ReleaseV2Props;
37
+ release?: ReleaseV2Props;
39
38
  } & Partial<WrappedAssetCardProps>;