@contentful/field-editor-reference 6.18.0 → 6.19.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.
@@ -149,7 +149,7 @@ function handleResourceFetchError(resourceFetchError, resourceTypeEntity) {
149
149
  throw resourceFetchError;
150
150
  }
151
151
  const isEntityQueryKey = (queryKey)=>{
152
- return Array.isArray(queryKey) && (queryKey[0] === 'Entry' || queryKey[0] === 'Asset') && queryKey.length === 4;
152
+ return Array.isArray(queryKey) && (queryKey[0] === 'Entry' || queryKey[0] === 'Asset') && (queryKey.length === 4 || queryKey.length === 5);
153
153
  };
154
154
  async function fetchContentfulEntry({ urn, fetch, options }) {
155
155
  const resourceId = urn.split(':', 6)[5];
@@ -214,7 +214,7 @@ async function fetchContentfulEntry({ urn, fetch, options }) {
214
214
  contentType: contentType
215
215
  };
216
216
  }
217
- async function fetchExternalResource({ urn, fetch, options, spaceId, environmentId, resourceType, locale }) {
217
+ async function fetchExternalResource({ urn, fetch, options, spaceId, environmentId, resourceType, locale, referencingEntryId }) {
218
218
  let resourceFetchError;
219
219
  const [resource, resourceTypes] = await Promise.all([
220
220
  fetch([
@@ -223,14 +223,16 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
223
223
  environmentId,
224
224
  resourceType,
225
225
  urn,
226
- locale
226
+ locale,
227
+ referencingEntryId
227
228
  ], ({ cmaClient })=>cmaClient.resource.getMany({
228
229
  spaceId,
229
230
  environmentId,
230
231
  resourceTypeId: resourceType,
231
232
  query: {
232
233
  'sys.urn[in]': urn,
233
- locale
234
+ locale,
235
+ referencingEntryId
234
236
  }
235
237
  }).then(({ items })=>{
236
238
  return items[0] ?? null;
@@ -426,7 +428,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
426
428
  'Resource',
427
429
  resourceType,
428
430
  urn,
429
- options?.locale
431
+ options?.locale,
432
+ options?.referencingEntryId
430
433
  ];
431
434
  return fetch(queryKey, ()=>{
432
435
  if (resourceType === 'Contentful:Entry') {
@@ -443,6 +446,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
443
446
  fetch,
444
447
  urn,
445
448
  locale: options?.locale,
449
+ referencingEntryId: options?.referencingEntryId,
446
450
  options,
447
451
  resourceType,
448
452
  spaceId: currentSpaceId,
@@ -466,10 +470,11 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
466
470
  const onSlideInNavigation = props.sdk.navigator.onSlideInNavigation;
467
471
  (0, _react.useEffect)(()=>{
468
472
  function findSameSpaceQueries() {
469
- return queryCache.findAll({
473
+ const queries = queryCache.findAll({
470
474
  type: 'active',
471
475
  predicate: (query)=>isSameSpaceEntityQueryKey(query.queryKey)
472
476
  });
477
+ return queries;
473
478
  }
474
479
  if (typeof onEntityChanged !== 'function') {
475
480
  return onSlideInNavigation(({ oldSlideLevel, newSlideLevel })=>{
@@ -483,8 +488,11 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = (0,
483
488
  const subscribeQuery = ({ queryKey, queryHash })=>{
484
489
  const [entityType, entityId, , , releaseId] = queryKey;
485
490
  entityChangeUnsubscribers.current[queryHash] = onEntityChanged(entityType, entityId, (data)=>{
486
- if ((0, _lodash.get)(data, 'sys.release.id') === releaseId) {
491
+ const dataReleaseId = (0, _lodash.get)(data, 'sys.release.id');
492
+ if (dataReleaseId === releaseId) {
487
493
  queryClient.setQueryData(queryKey, data);
494
+ } else if (releaseId && !dataReleaseId) {
495
+ void queryClient.invalidateQueries(queryKey);
488
496
  }
489
497
  });
490
498
  };
@@ -581,20 +589,23 @@ function useEntity(entityType, entityId, options) {
581
589
  currentEntity
582
590
  };
583
591
  }
584
- function useResource(resourceType, urn, { locale, ...options } = {}) {
592
+ function useResource(resourceType, urn, { locale, referencingEntryId, ...options } = {}) {
585
593
  if (resourceType.startsWith('Contentful:')) {
586
594
  locale = undefined;
595
+ referencingEntryId = undefined;
587
596
  }
588
597
  const queryKey = [
589
598
  'Resource',
590
599
  resourceType,
591
600
  urn,
592
- locale
601
+ locale,
602
+ referencingEntryId
593
603
  ];
594
604
  const { getResource } = useEntityLoader();
595
605
  const { status, data, error } = (0, _queryClient.useQuery)(queryKey, ()=>getResource(resourceType, urn, {
596
606
  ...options,
597
- locale
607
+ locale,
608
+ referencingEntryId
598
609
  }), {
599
610
  enabled: options?.enabled
600
611
  });
@@ -63,9 +63,10 @@ function ResourceCardSkeleton() {
63
63
  });
64
64
  }
65
65
  function ExistingResourceCard(props) {
66
- const { resourceLink, inView, index = 0, locale } = props;
66
+ const { resourceLink, inView, index = 0, locale, referencingEntryId } = props;
67
67
  const resourceOptions = {
68
68
  locale,
69
+ referencingEntryId,
69
70
  priority: index * -1,
70
71
  enabled: inView,
71
72
  allowExternal: true
@@ -149,6 +149,7 @@ function MultipleResourceReferenceEditor(props) {
149
149
  index: index,
150
150
  resourceLink: item,
151
151
  locale: props.sdk.field.locale,
152
+ referencingEntryId: props.sdk.ids.entry,
152
153
  isDisabled: isDisabled,
153
154
  renderDragHandle: DragHandle,
154
155
  onMoveTop: onMoveTop,
@@ -118,7 +118,8 @@ describe('Multiple resource editor', ()=>{
118
118
  const options = dialogFn.mock.calls[0][0];
119
119
  expect(options).toEqual({
120
120
  allowedResources: fieldDefinition.allowedResources,
121
- locale: 'en'
121
+ locale: 'en',
122
+ referencingEntryId: 'testEntry'
122
123
  });
123
124
  });
124
125
  it('hides the action button when insufficient permissions', async ()=>{
@@ -71,6 +71,7 @@ function SingleResourceReferenceEditor(props) {
71
71
  onRemove: ()=>props.sdk.field.removeValue(),
72
72
  resourceLink: value,
73
73
  locale: props.sdk.field.locale,
74
+ referencingEntryId: props.sdk.ids.entry,
74
75
  isDisabled: disabled,
75
76
  getEntryRouteHref: props.getEntryRouteHref
76
77
  }) : /*#__PURE__*/ _react.createElement(_LinkEntityActions.CombinedLinkEntityActions, {
@@ -114,7 +114,8 @@ describe('Single resource editor', ()=>{
114
114
  const options = dialogFn.mock.calls[0][0];
115
115
  expect(options).toEqual({
116
116
  allowedResources: fieldDefinition.allowedResources,
117
- locale: 'en'
117
+ locale: 'en',
118
+ referencingEntryId: 'testEntry'
118
119
  });
119
120
  });
120
121
  it('renders no the action button when permissions insufficient', async ()=>{
@@ -35,14 +35,18 @@ function useResourceLinkActions({ parameters, sdk }) {
35
35
  field
36
36
  ]);
37
37
  const multiple = field.type === 'Array';
38
+ const referencingEntryId = sdk.ids.entry;
39
+ const allowedResources = field.allowedResources;
38
40
  const onLinkExisting = (0, _react.useMemo)(()=>{
39
41
  const promptSelection = multiple ? async ()=>await dialogs.selectMultipleResourceEntities({
40
- allowedResources: field.allowedResources,
41
- locale: field.locale
42
+ allowedResources,
43
+ locale: field.locale,
44
+ referencingEntryId
42
45
  }) : async ()=>[
43
46
  await dialogs.selectSingleResourceEntity({
44
- allowedResources: field.allowedResources,
45
- locale: field.locale
47
+ allowedResources,
48
+ locale: field.locale,
49
+ referencingEntryId
46
50
  })
47
51
  ];
48
52
  return async ()=>{
@@ -50,8 +54,9 @@ function useResourceLinkActions({ parameters, sdk }) {
50
54
  };
51
55
  }, [
52
56
  dialogs,
53
- field.allowedResources,
57
+ allowedResources,
54
58
  field.locale,
59
+ referencingEntryId,
55
60
  multiple,
56
61
  onLinkedExisting
57
62
  ]);
@@ -61,7 +61,7 @@ function handleResourceFetchError(resourceFetchError, resourceTypeEntity) {
61
61
  throw resourceFetchError;
62
62
  }
63
63
  const isEntityQueryKey = (queryKey)=>{
64
- return Array.isArray(queryKey) && (queryKey[0] === 'Entry' || queryKey[0] === 'Asset') && queryKey.length === 4;
64
+ return Array.isArray(queryKey) && (queryKey[0] === 'Entry' || queryKey[0] === 'Asset') && (queryKey.length === 4 || queryKey.length === 5);
65
65
  };
66
66
  async function fetchContentfulEntry({ urn, fetch, options }) {
67
67
  const resourceId = urn.split(':', 6)[5];
@@ -126,7 +126,7 @@ async function fetchContentfulEntry({ urn, fetch, options }) {
126
126
  contentType: contentType
127
127
  };
128
128
  }
129
- async function fetchExternalResource({ urn, fetch, options, spaceId, environmentId, resourceType, locale }) {
129
+ async function fetchExternalResource({ urn, fetch, options, spaceId, environmentId, resourceType, locale, referencingEntryId }) {
130
130
  let resourceFetchError;
131
131
  const [resource, resourceTypes] = await Promise.all([
132
132
  fetch([
@@ -135,14 +135,16 @@ async function fetchExternalResource({ urn, fetch, options, spaceId, environment
135
135
  environmentId,
136
136
  resourceType,
137
137
  urn,
138
- locale
138
+ locale,
139
+ referencingEntryId
139
140
  ], ({ cmaClient })=>cmaClient.resource.getMany({
140
141
  spaceId,
141
142
  environmentId,
142
143
  resourceTypeId: resourceType,
143
144
  query: {
144
145
  'sys.urn[in]': urn,
145
- locale
146
+ locale,
147
+ referencingEntryId
146
148
  }
147
149
  }).then(({ items })=>{
148
150
  return items[0] ?? null;
@@ -338,7 +340,8 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
338
340
  'Resource',
339
341
  resourceType,
340
342
  urn,
341
- options?.locale
343
+ options?.locale,
344
+ options?.referencingEntryId
342
345
  ];
343
346
  return fetch(queryKey, ()=>{
344
347
  if (resourceType === 'Contentful:Entry') {
@@ -355,6 +358,7 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
355
358
  fetch,
356
359
  urn,
357
360
  locale: options?.locale,
361
+ referencingEntryId: options?.referencingEntryId,
358
362
  options,
359
363
  resourceType,
360
364
  spaceId: currentSpaceId,
@@ -378,10 +382,11 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
378
382
  const onSlideInNavigation = props.sdk.navigator.onSlideInNavigation;
379
383
  useEffect(()=>{
380
384
  function findSameSpaceQueries() {
381
- return queryCache.findAll({
385
+ const queries = queryCache.findAll({
382
386
  type: 'active',
383
387
  predicate: (query)=>isSameSpaceEntityQueryKey(query.queryKey)
384
388
  });
389
+ return queries;
385
390
  }
386
391
  if (typeof onEntityChanged !== 'function') {
387
392
  return onSlideInNavigation(({ oldSlideLevel, newSlideLevel })=>{
@@ -395,8 +400,11 @@ const [InternalServiceProvider, useFetch, useEntityLoader, useCurrentIds] = cons
395
400
  const subscribeQuery = ({ queryKey, queryHash })=>{
396
401
  const [entityType, entityId, , , releaseId] = queryKey;
397
402
  entityChangeUnsubscribers.current[queryHash] = onEntityChanged(entityType, entityId, (data)=>{
398
- if (get(data, 'sys.release.id') === releaseId) {
403
+ const dataReleaseId = get(data, 'sys.release.id');
404
+ if (dataReleaseId === releaseId) {
399
405
  queryClient.setQueryData(queryKey, data);
406
+ } else if (releaseId && !dataReleaseId) {
407
+ void queryClient.invalidateQueries(queryKey);
400
408
  }
401
409
  });
402
410
  };
@@ -493,20 +501,23 @@ export function useEntity(entityType, entityId, options) {
493
501
  currentEntity
494
502
  };
495
503
  }
496
- export function useResource(resourceType, urn, { locale, ...options } = {}) {
504
+ export function useResource(resourceType, urn, { locale, referencingEntryId, ...options } = {}) {
497
505
  if (resourceType.startsWith('Contentful:')) {
498
506
  locale = undefined;
507
+ referencingEntryId = undefined;
499
508
  }
500
509
  const queryKey = [
501
510
  'Resource',
502
511
  resourceType,
503
512
  urn,
504
- locale
513
+ locale,
514
+ referencingEntryId
505
515
  ];
506
516
  const { getResource } = useEntityLoader();
507
517
  const { status, data, error } = useQuery(queryKey, ()=>getResource(resourceType, urn, {
508
518
  ...options,
509
- locale
519
+ locale,
520
+ referencingEntryId
510
521
  }), {
511
522
  enabled: options?.enabled
512
523
  });
@@ -12,9 +12,10 @@ function ResourceCardSkeleton() {
12
12
  });
13
13
  }
14
14
  function ExistingResourceCard(props) {
15
- const { resourceLink, inView, index = 0, locale } = props;
15
+ const { resourceLink, inView, index = 0, locale, referencingEntryId } = props;
16
16
  const resourceOptions = {
17
17
  locale,
18
+ referencingEntryId,
18
19
  priority: index * -1,
19
20
  enabled: inView,
20
21
  allowExternal: true
@@ -94,6 +94,7 @@ export function MultipleResourceReferenceEditor(props) {
94
94
  index: index,
95
95
  resourceLink: item,
96
96
  locale: props.sdk.field.locale,
97
+ referencingEntryId: props.sdk.ids.entry,
97
98
  isDisabled: isDisabled,
98
99
  renderDragHandle: DragHandle,
99
100
  onMoveTop: onMoveTop,
@@ -73,7 +73,8 @@ describe('Multiple resource editor', ()=>{
73
73
  const options = dialogFn.mock.calls[0][0];
74
74
  expect(options).toEqual({
75
75
  allowedResources: fieldDefinition.allowedResources,
76
- locale: 'en'
76
+ locale: 'en',
77
+ referencingEntryId: 'testEntry'
77
78
  });
78
79
  });
79
80
  it('hides the action button when insufficient permissions', async ()=>{
@@ -20,6 +20,7 @@ export function SingleResourceReferenceEditor(props) {
20
20
  onRemove: ()=>props.sdk.field.removeValue(),
21
21
  resourceLink: value,
22
22
  locale: props.sdk.field.locale,
23
+ referencingEntryId: props.sdk.ids.entry,
23
24
  isDisabled: disabled,
24
25
  getEntryRouteHref: props.getEntryRouteHref
25
26
  }) : /*#__PURE__*/ React.createElement(CombinedLinkEntityActions, {
@@ -69,7 +69,8 @@ describe('Single resource editor', ()=>{
69
69
  const options = dialogFn.mock.calls[0][0];
70
70
  expect(options).toEqual({
71
71
  allowedResources: fieldDefinition.allowedResources,
72
- locale: 'en'
72
+ locale: 'en',
73
+ referencingEntryId: 'testEntry'
73
74
  });
74
75
  });
75
76
  it('renders no the action button when permissions insufficient', async ()=>{
@@ -25,14 +25,18 @@ export function useResourceLinkActions({ parameters, sdk }) {
25
25
  field
26
26
  ]);
27
27
  const multiple = field.type === 'Array';
28
+ const referencingEntryId = sdk.ids.entry;
29
+ const allowedResources = field.allowedResources;
28
30
  const onLinkExisting = useMemo(()=>{
29
31
  const promptSelection = multiple ? async ()=>await dialogs.selectMultipleResourceEntities({
30
- allowedResources: field.allowedResources,
31
- locale: field.locale
32
+ allowedResources,
33
+ locale: field.locale,
34
+ referencingEntryId
32
35
  }) : async ()=>[
33
36
  await dialogs.selectSingleResourceEntity({
34
- allowedResources: field.allowedResources,
35
- locale: field.locale
37
+ allowedResources,
38
+ locale: field.locale,
39
+ referencingEntryId
36
40
  })
37
41
  ];
38
42
  return async ()=>{
@@ -40,8 +44,9 @@ export function useResourceLinkActions({ parameters, sdk }) {
40
44
  };
41
45
  }, [
42
46
  dialogs,
43
- field.allowedResources,
47
+ allowedResources,
44
48
  field.locale,
49
+ referencingEntryId,
45
50
  multiple,
46
51
  onLinkedExisting
47
52
  ]);
@@ -33,11 +33,11 @@ type QueryEntityResult<E> = Promise<E>;
33
33
  type GetResourceOptions = GetOptions & {
34
34
  allowExternal?: boolean;
35
35
  locale?: string;
36
+ referencingEntryId?: string;
36
37
  };
37
38
  type QueryResourceResult<R extends Resource = Resource> = QueryEntityResult<ResourceInfo<R>>;
38
39
  type UseResourceOptions = GetResourceOptions & {
39
40
  enabled?: boolean;
40
- locale?: string;
41
41
  };
42
42
  type UseEntityResult<E> = {
43
43
  status: 'idle';
@@ -87,7 +87,7 @@ declare const useEntityLoader: () => {
87
87
  getResourceProvider: (organizationId: string, appDefinitionId: string) => QueryEntityResult<ResourceProvider>;
88
88
  };
89
89
  export declare function useEntity<E extends FetchableEntity>(entityType: FetchableEntityType, entityId: string, options?: Omit<UseEntityOptions, 'releaseId'>): UseEntityResult<E>;
90
- export declare function useResource<R extends Resource = Resource>(resourceType: string, urn: string, { locale, ...options }?: UseResourceOptions): {
90
+ export declare function useResource<R extends Resource = Resource>(resourceType: string, urn: string, { locale, referencingEntryId, ...options }?: UseResourceOptions): {
91
91
  status: "error" | "success" | "loading";
92
92
  data: ResourceInfo<R> | undefined;
93
93
  error: unknown;
@@ -5,6 +5,7 @@ type ResourceCardProps = {
5
5
  index?: number;
6
6
  resourceLink?: ResourceLink<string>;
7
7
  locale?: string;
8
+ referencingEntryId?: string;
8
9
  isDisabled: boolean;
9
10
  renderDragHandle?: RenderDragFn;
10
11
  getEntryRouteHref: (entryRoute: EntryRoute) => string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/field-editor-reference",
3
- "version": "6.18.0",
3
+ "version": "6.19.1",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "types": "dist/types/index.d.ts",
@@ -46,7 +46,7 @@
46
46
  "@dnd-kit/utilities": "^3.2.2",
47
47
  "@tanstack/react-query": "^4.3.9",
48
48
  "constate": "^3.3.2",
49
- "contentful-management": "^11.45.1",
49
+ "contentful-management": "^11.66.0",
50
50
  "emotion": "^10.0.17",
51
51
  "lodash": "^4.17.15",
52
52
  "moment": "^2.20.0",
@@ -68,5 +68,5 @@
68
68
  "publishConfig": {
69
69
  "registry": "https://npm.pkg.github.com/"
70
70
  },
71
- "gitHead": "b25d0af70c82c9e29505335ce636f2e32e6cb927"
71
+ "gitHead": "df62d5fb562de590a6de09e86d2e72913c64ac93"
72
72
  }