@ynput/ayon-frontend-shared 0.3.55 → 0.3.56

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 (131) hide show
  1. package/dist/_virtual/index.cjs22.js +1 -1
  2. package/dist/_virtual/index.cjs23.js +1 -1
  3. package/dist/_virtual/index.cjs24.js +1 -1
  4. package/dist/_virtual/index.cjs5.js +1 -1
  5. package/dist/_virtual/index.cjs6.js +1 -1
  6. package/dist/_virtual/index.cjs8.js +1 -1
  7. package/dist/_virtual/index.es15.js +2 -2
  8. package/dist/_virtual/index.es22.js +3 -3
  9. package/dist/_virtual/index.es23.js +5 -5
  10. package/dist/_virtual/index.es24.js +5 -5
  11. package/dist/_virtual/index.es5.js +4 -4
  12. package/dist/_virtual/index.es6.js +5 -2
  13. package/dist/_virtual/index.es6.js.map +1 -1
  14. package/dist/_virtual/index.es8.js +2 -5
  15. package/dist/_virtual/index.es8.js.map +1 -1
  16. package/dist/_virtual/index.es9.js +2 -2
  17. package/dist/api.cjs.js +1 -1
  18. package/dist/api.es.js +193 -192
  19. package/dist/node_modules/match-sorter/dist/match-sorter.esm.cjs.js +1 -1
  20. package/dist/node_modules/match-sorter/dist/match-sorter.esm.es.js +1 -1
  21. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +1 -1
  22. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  23. package/dist/node_modules/rehype/node_modules/vfile/lib/index.cjs.js +1 -1
  24. package/dist/node_modules/rehype/node_modules/vfile/lib/index.es.js +1 -1
  25. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  26. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  27. package/dist/node_modules/remove-accents/index.cjs.js +1 -1
  28. package/dist/node_modules/remove-accents/index.cjs.js.map +1 -1
  29. package/dist/node_modules/remove-accents/index.es.js +1 -1
  30. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.cjs.js +1 -1
  31. package/dist/shared/node_modules/@module-federation/error-codes/dist/index.es.js +1 -1
  32. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.cjs.js +1 -1
  33. package/dist/shared/node_modules/@module-federation/runtime-core/dist/index.es.js +1 -1
  34. package/dist/shared/node_modules/@module-federation/runtime-core/dist/utils/semver/utils.cjs.js +1 -1
  35. package/dist/shared/node_modules/@module-federation/runtime-core/dist/utils/semver/utils.es.js +1 -1
  36. package/dist/shared/node_modules/@module-federation/sdk/dist/utils.cjs.js +1 -1
  37. package/dist/shared/node_modules/@module-federation/sdk/dist/utils.es.js +1 -1
  38. package/dist/shared/node_modules/prop-types/index.cjs.js +1 -1
  39. package/dist/shared/node_modules/prop-types/index.cjs.js.map +1 -1
  40. package/dist/shared/node_modules/prop-types/index.es.js +1 -1
  41. package/dist/shared/node_modules/react-is/index.cjs.js +1 -1
  42. package/dist/shared/node_modules/react-is/index.es.js +1 -1
  43. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.cjs.js +1 -1
  44. package/dist/shared/node_modules/react-transition-group/esm/CSSTransition.es.js +1 -1
  45. package/dist/shared/node_modules/react-transition-group/esm/Transition.cjs.js +1 -1
  46. package/dist/shared/node_modules/react-transition-group/esm/Transition.es.js +1 -1
  47. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.cjs.js +1 -1
  48. package/dist/shared/node_modules/react-transition-group/esm/utils/PropTypes.es.js +1 -1
  49. package/dist/shared/src/api/generated/graphql.cjs.js +4 -0
  50. package/dist/shared/src/api/generated/graphql.cjs.js.map +1 -1
  51. package/dist/shared/src/api/generated/graphql.es.js +4 -0
  52. package/dist/shared/src/api/generated/graphql.es.js.map +1 -1
  53. package/dist/shared/src/api/generated/graphqlLinks.cjs.js.map +1 -1
  54. package/dist/shared/src/api/generated/graphqlLinks.es.js.map +1 -1
  55. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js +1 -1
  56. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js.map +1 -1
  57. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js +17 -16
  58. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js.map +1 -1
  59. package/dist/shared/src/api/queries/entityLists/getLists.cjs.js +1 -1
  60. package/dist/shared/src/api/queries/entityLists/getLists.cjs.js.map +1 -1
  61. package/dist/shared/src/api/queries/entityLists/getLists.es.js +47 -47
  62. package/dist/shared/src/api/queries/entityLists/getLists.es.js.map +1 -1
  63. package/dist/shared/src/api/queries/folders/getFolders.cjs.js +1 -1
  64. package/dist/shared/src/api/queries/folders/getFolders.cjs.js.map +1 -1
  65. package/dist/shared/src/api/queries/folders/getFolders.es.js +20 -22
  66. package/dist/shared/src/api/queries/folders/getFolders.es.js.map +1 -1
  67. package/dist/shared/src/api/queries/overview/getOverview.cjs.js +1 -1
  68. package/dist/shared/src/api/queries/overview/getOverview.cjs.js.map +1 -1
  69. package/dist/shared/src/api/queries/overview/getOverview.es.js +92 -89
  70. package/dist/shared/src/api/queries/overview/getOverview.es.js.map +1 -1
  71. package/dist/shared/src/api/queries/project/getProject.cjs.js +1 -1
  72. package/dist/shared/src/api/queries/project/getProject.cjs.js.map +1 -1
  73. package/dist/shared/src/api/queries/project/getProject.es.js +1 -1
  74. package/dist/shared/src/api/queries/project/getProject.es.js.map +1 -1
  75. package/dist/shared/src/api/queries/users/getUsers.cjs.js +1 -1
  76. package/dist/shared/src/api/queries/users/getUsers.cjs.js.map +1 -1
  77. package/dist/shared/src/api/queries/users/getUsers.es.js +1 -1
  78. package/dist/shared/src/api/queries/users/getUsers.es.js.map +1 -1
  79. package/dist/shared/src/api/queries/versions/getVersionsProducts.cjs.js +1 -1
  80. package/dist/shared/src/api/queries/versions/getVersionsProducts.cjs.js.map +1 -1
  81. package/dist/shared/src/api/queries/versions/getVersionsProducts.es.js +23 -23
  82. package/dist/shared/src/api/queries/versions/getVersionsProducts.es.js.map +1 -1
  83. package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.cjs.js +1 -1
  84. package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.cjs.js.map +1 -1
  85. package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.es.js +13 -13
  86. package/dist/shared/src/api/queries/versions/getVersionsProductsUtils.es.js.map +1 -1
  87. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +3 -3
  88. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
  89. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +51 -50
  90. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
  91. package/dist/shared/src/containers/ListTable/ListTableWidgets.cjs.js +1 -1
  92. package/dist/shared/src/containers/ListTable/ListTableWidgets.cjs.js.map +1 -1
  93. package/dist/shared/src/containers/ListTable/ListTableWidgets.es.js +62 -58
  94. package/dist/shared/src/containers/ListTable/ListTableWidgets.es.js.map +1 -1
  95. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  96. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  97. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +21 -20
  98. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  99. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
  100. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
  101. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +25 -24
  102. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
  103. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js +1 -1
  104. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -1
  105. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js +20 -19
  106. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -1
  107. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js +1 -1
  108. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.cjs.js.map +1 -1
  109. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js +152 -133
  110. package/dist/shared/src/containers/ProjectTreeTable/hooks/useUpdateTableData.es.js.map +1 -1
  111. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js +2 -2
  112. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.cjs.js.map +1 -1
  113. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js +75 -73
  114. package/dist/shared/src/containers/ProjectTreeTable/widgets/CellWidget.es.js.map +1 -1
  115. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js +1 -1
  116. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.cjs.js.map +1 -1
  117. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js +21 -19
  118. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidget.es.js.map +1 -1
  119. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.cjs.js +2 -2
  120. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.cjs.js.map +1 -1
  121. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.es.js +58 -43
  122. package/dist/shared/src/containers/ProjectTreeTable/widgets/DateWidgetInput.es.js.map +1 -1
  123. package/dist/types/api/generated/graphql.d.ts +5 -0
  124. package/dist/types/api/generated/graphqlLinks.d.ts +1 -0
  125. package/dist/types/api/queries/entities/transformDetailsPanelData.d.ts +1 -0
  126. package/dist/types/api/queries/overview/getOverview.d.ts +2 -1
  127. package/dist/types/containers/ProjectTreeTable/types/table.d.ts +3 -1
  128. package/dist/types/containers/ProjectTreeTable/widgets/CellWidget.d.ts +1 -0
  129. package/dist/types/containers/ProjectTreeTable/widgets/DateWidget.d.ts +1 -0
  130. package/dist/types/containers/ProjectTreeTable/widgets/DateWidgetInput.d.ts +1 -0
  131. package/package.json +1 -1
@@ -12,7 +12,7 @@ import "../../generated/bundles.es.js";
12
12
  import "../../generated/configuration.es.js";
13
13
  import "../../generated/dataImport.es.js";
14
14
  import "../../generated/desktop.es.js";
15
- import { api as S } from "../../generated/entityLists.es.js";
15
+ import { api as w } from "../../generated/entityLists.es.js";
16
16
  import "../../generated/events.es.js";
17
17
  import "../../generated/files.es.js";
18
18
  import "../../generated/folders.es.js";
@@ -38,14 +38,14 @@ import "../../generated/workfiles.es.js";
38
38
  import "../../generated/ynputCloud.es.js";
39
39
  import "../../generated/grouping.es.js";
40
40
  import "../../generated/views.es.js";
41
- import { parseAllAttribs as A } from "../overview/getOverview.es.js";
41
+ import { parseJSONField as G } from "../overview/getOverview.es.js";
42
42
  import "../overview/updateOverview.es.js";
43
43
  import "../versions/getVersionsProducts.es.js";
44
44
  import "../links/getEntityLinks.es.js";
45
45
  import "lodash";
46
46
  import "react-toastify";
47
47
  import "uuid";
48
- import { subscribeToThumbnailUpdates as G } from "../../../util/thumbnailWebsocket.es.js";
48
+ import { subscribeToThumbnailUpdates as A } from "../../../util/thumbnailWebsocket.es.js";
49
49
  import "../actions/getActions.es.js";
50
50
  import "../activities/getActivities.es.js";
51
51
  import "../activities/updateReaction.es.js";
@@ -99,8 +99,8 @@ import "../views/updateViews.es.js";
99
99
  import "../watchers/getWatchers.es.js";
100
100
  import "../uris/getUris.es.js";
101
101
  import I from "../../../util/pubsub.es.js";
102
- const l = 10;
103
- function M(s, e, t = 5e3) {
102
+ const f = 10;
103
+ function O(s, e, t = 5e3) {
104
104
  let r = [], i = null;
105
105
  const o = (n, a) => {
106
106
  r.push({ topic: n, message: a }), i || (i = setTimeout(() => {
@@ -119,7 +119,7 @@ const R = (s) => {
119
119
  } catch (e) {
120
120
  return console.warn("Failed to parse entity list data field:", e, s), {};
121
121
  }
122
- }, _ = 1e4, v = 100, P = C.enhanceEndpoints({
122
+ }, _ = 1e4, F = 100, b = C.enhanceEndpoints({
123
123
  endpoints: {
124
124
  GetLists: {
125
125
  transformResponse: (s) => ({
@@ -131,7 +131,7 @@ const R = (s) => {
131
131
  })),
132
132
  pageInfo: s.project.entityLists.pageInfo
133
133
  }),
134
- keepUnusedDataFor: l
134
+ keepUnusedDataFor: f
135
135
  },
136
136
  GetListItems: {
137
137
  transformResponse: (s) => {
@@ -143,23 +143,23 @@ const R = (s) => {
143
143
  (t) => t.node.items.edges.map(({ node: r, ...i }) => ({
144
144
  ...r,
145
145
  ...i,
146
- attrib: A(i.allAttrib)
146
+ attrib: G(i.allAttrib)
147
147
  }))
148
148
  ),
149
149
  pageInfo: e.node.items.pageInfo
150
150
  };
151
151
  },
152
- keepUnusedDataFor: l
152
+ keepUnusedDataFor: f
153
153
  },
154
154
  GetListsItemsForReviewSession: {
155
155
  transformResponse: (s) => ({
156
156
  lists: s.project.entityLists.edges.map((e) => e.node),
157
157
  pageInfo: s.project.entityLists.pageInfo
158
158
  }),
159
- keepUnusedDataFor: l
159
+ keepUnusedDataFor: f
160
160
  }
161
161
  }
162
- }), O = P.injectEndpoints({
162
+ }), M = b.injectEndpoints({
163
163
  endpoints: (s) => ({
164
164
  getListsInfinite: s.infiniteQuery({
165
165
  infiniteQueryOptions: {
@@ -179,7 +179,7 @@ const R = (s) => {
179
179
  first: _,
180
180
  after: i || void 0
181
181
  }, n = await r.dispatch(
182
- P.endpoints.GetLists.initiate(o, { forceRefetch: !0 })
182
+ b.endpoints.GetLists.initiate(o, { forceRefetch: !0 })
183
183
  );
184
184
  return n.error ? { error: n.error } : {
185
185
  data: n.data || {
@@ -211,12 +211,12 @@ const R = (s) => {
211
211
  const o = ["entity_list.changed", "entity_list.created", "entity_list.deleted"];
212
212
  let n = null;
213
213
  try {
214
- await t, n = M(
214
+ await t, n = O(
215
215
  i,
216
216
  (a, p) => {
217
- p.forEach(({ topic: u, message: F }) => {
218
- const y = F.summary, f = y.id;
219
- if (!f) return;
217
+ p.forEach(({ topic: u, message: v }) => {
218
+ const y = v.summary, l = y.id;
219
+ if (!l) return;
220
220
  const E = (m) => ({
221
221
  // defaults
222
222
  projectName: e,
@@ -240,7 +240,7 @@ const R = (s) => {
240
240
  count: y.count
241
241
  });
242
242
  if (u === "entity_list.changed") {
243
- const m = a.pages.flatMap((b) => b.lists).find((b) => b.id === f);
243
+ const m = a.pages.flatMap((P) => P.lists).find((P) => P.id === l);
244
244
  if (!m) return;
245
245
  const g = E(m);
246
246
  Object.assign(m, g);
@@ -248,7 +248,7 @@ const R = (s) => {
248
248
  const m = E();
249
249
  a.pages.length !== 0 && a.pages[0].lists.unshift(m);
250
250
  } else u === "entity_list.deleted" && a.pages.forEach((m) => {
251
- m.lists = m.lists.filter((g) => g.id !== f);
251
+ m.lists = m.lists.filter((g) => g.id !== l);
252
252
  });
253
253
  });
254
254
  },
@@ -259,7 +259,7 @@ const R = (s) => {
259
259
  }
260
260
  await r, o.forEach((a) => I.unsubscribe(a)), n && typeof n.clear == "function" && n.clear();
261
261
  },
262
- keepUnusedDataFor: l
262
+ keepUnusedDataFor: f
263
263
  }),
264
264
  getListItemsInfinite: s.infiniteQuery({
265
265
  infiniteQueryOptions: {
@@ -276,12 +276,12 @@ const R = (s) => {
276
276
  try {
277
277
  const { sortBy: i, desc: o, ...n } = e, { cursor: a } = t, p = {
278
278
  ...n,
279
- first: v,
279
+ first: F,
280
280
  after: a || void 0
281
281
  };
282
- p.after = a || void 0, p.first = v, i && (p.sortBy = i, o && (p.before = a || void 0, p.after = void 0, p.last = v, p.first = void 0));
282
+ p.after = a || void 0, p.first = F, i && (p.sortBy = i, o && (p.before = a || void 0, p.after = void 0, p.last = F, p.first = void 0));
283
283
  const u = await r.dispatch(
284
- P.endpoints.GetListItems.initiate(p, {
284
+ b.endpoints.GetListItems.initiate(p, {
285
285
  forceRefetch: !0
286
286
  })
287
287
  );
@@ -318,8 +318,8 @@ const R = (s) => {
318
318
  async onCacheEntryAdded(e, { cacheDataLoaded: t, cacheEntryRemoved: r, dispatch: i, updateCachedData: o }) {
319
319
  let n, a, p;
320
320
  try {
321
- const f = (await t).data.pages.flatMap((c) => c.items)[0]?.entityType;
322
- p = G(
321
+ const l = (await t).data.pages.flatMap((c) => c.items)[0]?.entityType;
322
+ p = A(
323
323
  (c) => {
324
324
  o((L) => {
325
325
  L?.pages && c.forEach((h) => {
@@ -332,23 +332,23 @@ const R = (s) => {
332
332
  });
333
333
  }
334
334
  );
335
- const E = "entity_list.changed", m = `entity.${f}`, g = (c) => {
335
+ const E = "entity_list.changed", m = `entity.${l}`, g = (c) => {
336
336
  i(C.util.invalidateTags([{ type: "entityListItem", id: c }]));
337
- }, b = (c, L) => {
337
+ }, P = (c, L) => {
338
338
  if (c !== E) return;
339
339
  const d = L.summary.id;
340
340
  d && g(d);
341
- }, w = (c, L) => {
341
+ }, S = (c, L) => {
342
342
  if (!c.startsWith(m)) return;
343
343
  const d = L.summary.entityId;
344
344
  d && g(d);
345
345
  };
346
- n = I.subscribe(E, b), f && (a = I.subscribe(m, w));
346
+ n = I.subscribe(E, P), l && (a = I.subscribe(m, S));
347
347
  } catch {
348
348
  }
349
349
  await r, I.unsubscribe(n), I.unsubscribe(a), p && p();
350
350
  },
351
- keepUnusedDataFor: l
351
+ keepUnusedDataFor: f
352
352
  }),
353
353
  getListsItemsForReviewSession: s.infiniteQuery({
354
354
  infiniteQueryOptions: {
@@ -368,7 +368,7 @@ const R = (s) => {
368
368
  first: _,
369
369
  after: i || void 0
370
370
  }, n = await r.dispatch(
371
- P.endpoints.GetListsItemsForReviewSession.initiate(o, {
371
+ b.endpoints.GetListsItemsForReviewSession.initiate(o, {
372
372
  forceRefetch: !0
373
373
  })
374
374
  );
@@ -394,10 +394,10 @@ const R = (s) => {
394
394
  id: t.id
395
395
  }))
396
396
  ],
397
- keepUnusedDataFor: l
397
+ keepUnusedDataFor: f
398
398
  })
399
399
  })
400
- }), N = S.enhanceEndpoints({
400
+ }), N = w.enhanceEndpoints({
401
401
  endpoints: {
402
402
  getEntityList: {
403
403
  providesTags: (s, e, { listId: t, projectName: r }) => [
@@ -411,27 +411,27 @@ const R = (s) => {
411
411
  }
412
412
  ] : []
413
413
  ],
414
- keepUnusedDataFor: l
414
+ keepUnusedDataFor: f
415
415
  }
416
416
  }
417
417
  }), {
418
- useGetListsInfiniteInfiniteQuery: Se,
419
- useGetListItemsInfiniteInfiniteQuery: Ae,
420
- useGetListsItemsForReviewSessionInfiniteQuery: Ge,
421
- useLazyGetListsItemsForReviewSessionQuery: Me,
422
- useLazyGetListItemsQuery: Oe
423
- } = O, { useGetEntityListQuery: Ne } = N;
418
+ useGetListsInfiniteInfiniteQuery: we,
419
+ useGetListItemsInfiniteInfiniteQuery: Ge,
420
+ useGetListsItemsForReviewSessionInfiniteQuery: Ae,
421
+ useLazyGetListsItemsForReviewSessionQuery: Oe,
422
+ useLazyGetListItemsQuery: Me
423
+ } = M, { useGetEntityListQuery: Ne } = N;
424
424
  export {
425
425
  _ as LISTS_PER_PAGE,
426
- v as LIST_ITEMS_PER_PAGE,
427
- M as createBatchedCacheUpdater,
428
- O as default,
426
+ F as LIST_ITEMS_PER_PAGE,
427
+ O as createBatchedCacheUpdater,
428
+ M as default,
429
429
  N as getListsApiEnhanced,
430
430
  Ne as useGetEntityListQuery,
431
- Ae as useGetListItemsInfiniteInfiniteQuery,
432
- Se as useGetListsInfiniteInfiniteQuery,
433
- Ge as useGetListsItemsForReviewSessionInfiniteQuery,
434
- Oe as useLazyGetListItemsQuery,
435
- Me as useLazyGetListsItemsForReviewSessionQuery
431
+ Ge as useGetListItemsInfiniteInfiniteQuery,
432
+ we as useGetListsInfiniteInfiniteQuery,
433
+ Ae as useGetListsItemsForReviewSessionInfiniteQuery,
434
+ Me as useLazyGetListItemsQuery,
435
+ Oe as useLazyGetListsItemsForReviewSessionQuery
436
436
  };
437
437
  //# sourceMappingURL=getLists.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getLists.es.js","sources":["../../../../../../src/api/queries/entityLists/getLists.ts"],"sourcesContent":["import { entityListsApi, gqlApi } from '@shared/api/generated'\nimport {\n FetchBaseQueryError,\n DefinitionsFromApi,\n OverrideResultType,\n TagTypesFromApi,\n} from '@reduxjs/toolkit/query'\nimport type {\n EntityList,\n GetListItemsQuery,\n GetListItemsQueryVariables,\n GetListsItemsForReviewSessionQuery,\n GetListsItemsForReviewSessionResult,\n GetListsQuery,\n GetListsQueryVariables,\n} from '@shared/api'\nimport { parseAllAttribs } from '../overview'\nimport { PubSub, subscribeToThumbnailUpdates, ThumbnailUpdateMessage } from '@shared/util'\nimport {\n GetListItemsResult,\n GetListsResult,\n ListItemMessage,\n ListItemsPageParam,\n ListsPageParam,\n} from './types'\n\nconst CACHE_TIME = 10 // seconds\n\n// Helper function to batch pub/sub messages to avoid constant cache updates\nexport function createBatchedCacheUpdater<TMessage, TDraft>(\n updateCachedData: (updater: (draft: TDraft) => void) => void,\n applyBatch: (draft: TDraft, batch: { topic: string; message: TMessage }[]) => void,\n delay = 5000,\n) {\n let queue: { topic: string; message: TMessage }[] = []\n let timeout: ReturnType<typeof setTimeout> | null = null\n\n const handler = (topic: string, message: TMessage) => {\n queue.push({ topic, message })\n if (!timeout) {\n timeout = setTimeout(() => {\n const batch = [...queue]\n queue = []\n timeout = null\n if (batch.length > 0) {\n updateCachedData((draft) => applyBatch(draft, batch))\n }\n }, delay)\n }\n }\n\n handler.clear = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n queue = []\n }\n\n return handler\n}\n\n// Helper function to safely parse entity list data field from JSON string to object\nconst parseJSON = (data: string | null | undefined): Record<string, any> => {\n if (!data) return {}\n\n try {\n if (typeof data !== 'string') {\n return (data as unknown as Record<string, any>) ?? {}\n }\n return JSON.parse(data)\n } catch (e) {\n console.warn('Failed to parse entity list data field:', e, data)\n return {}\n }\n}\n\n// GRAPHQL API (getLists and getListItems)\n// Define the LISTS_PER_PAGE constant for pagination\nexport const LISTS_PER_PAGE = 10000\nexport const LIST_ITEMS_PER_PAGE = 100\n\ntype Definitions = DefinitionsFromApi<typeof gqlApi>\ntype TagTypes = TagTypesFromApi<typeof gqlApi>\n// update the definitions to include the new types\ntype UpdatedDefinitions = Omit<Definitions, 'GetLists' | 'GetListItems'> & {\n GetLists: OverrideResultType<Definitions['GetLists'], GetListsResult>\n GetListItems: OverrideResultType<Definitions['GetListItems'], GetListItemsResult>\n GetListsItemsForReviewSession: OverrideResultType<\n Definitions['GetListsItemsForReviewSession'],\n GetListsItemsForReviewSessionResult\n >\n}\n\nconst getListsGqlApiEnhanced = gqlApi.enhanceEndpoints<TagTypes, UpdatedDefinitions>({\n endpoints: {\n GetLists: {\n transformResponse: (response: GetListsQuery): GetListsResult => {\n return {\n // @ts-expect-error - entityType is string\n lists: response.project.entityLists.edges.map((edge) => ({\n ...edge.node,\n data: parseJSON(edge.node.data),\n attrib: parseJSON(edge.node.allAttrib),\n })),\n pageInfo: response.project.entityLists.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n GetListItems: {\n transformResponse: (response: GetListItemsQuery): GetListItemsResult => {\n const firstEdge = response.project.entityLists.edges[0]\n if (!firstEdge) {\n throw new Error('List does not exist, was it deleted?')\n }\n return {\n items: response.project.entityLists.edges.flatMap((listEdge) =>\n listEdge.node.items.edges.map(({ node, ...edge }) => {\n return {\n ...node,\n ...edge,\n attrib: parseAllAttribs(edge.allAttrib),\n } as GetListItemsResult['items'][number]\n }),\n ),\n pageInfo: firstEdge.node.items.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n GetListsItemsForReviewSession: {\n transformResponse: (\n response: GetListsItemsForReviewSessionQuery,\n ): GetListsItemsForReviewSessionResult => {\n return {\n lists: response.project.entityLists.edges.map((edge) => edge.node),\n pageInfo: response.project.entityLists.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n },\n})\n\nconst getListsGqlApiInjected = getListsGqlApiEnhanced.injectEndpoints({\n endpoints: (build) => ({\n getListsInfinite: build.infiniteQuery<\n GetListsResult,\n Omit<GetListsQueryVariables, 'first' | 'after' | 'before'>,\n ListsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n if (!pageInfo.hasNextPage || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams = {\n ...queryArg,\n first: LISTS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetLists.initiate(queryParams, { forceRefetch: true }),\n )\n\n if (result.error) {\n // Preserve original error (e.g. 403) so the UI can react accordingly\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n lists: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result) => {\n const lists = result?.pages.flatMap((page) => page.lists) || []\n return [\n { type: 'entityList', id: 'LIST' },\n ...lists.flatMap((list) => [\n { type: 'entityList' as const, id: list.id },\n { type: 'entityList' as const, id: list.entityListType },\n { type: 'entityList' as const, id: list.entityListFolderId || 'NO_FOLDER' },\n ]),\n ]\n },\n async onCacheEntryAdded(\n { projectName },\n { cacheDataLoaded, cacheEntryRemoved, updateCachedData },\n ) {\n const topics = ['entity_list.changed', 'entity_list.created', 'entity_list.deleted']\n let handlePubSub: any = null\n try {\n // wait for the initial query to resolve before proceeding\n await cacheDataLoaded\n\n handlePubSub = createBatchedCacheUpdater<ListItemMessage, any>(\n updateCachedData,\n (draft, batch) => {\n batch.forEach(({ topic, message }) => {\n const summary = message.summary\n const id = summary.id\n if (!id) return\n\n const getListFromSummary = (list?: EntityList): EntityList => {\n return {\n // defaults\n projectName: projectName,\n tags: [],\n data: {},\n allAttrib: '',\n attrib: {},\n createdAt: new Date().toISOString(),\n updatedAt: '',\n active: true,\n access: '',\n accessLevel: 30, // default admin\n // existing data\n ...(list || {}),\n // new data\n id: summary.id as string,\n label: summary.label,\n entityType: summary.entity_type,\n entityListType: summary.entity_list_type,\n count: summary.count,\n }\n }\n\n if (topic === 'entity_list.changed') {\n // update the data of existing list in cache\n const list = draft.pages\n .flatMap((page: any) => page.lists)\n .find((l: any) => l.id === id)\n if (!list) return\n const newList = getListFromSummary(list)\n\n Object.assign(list, newList)\n } else if (topic === 'entity_list.created') {\n // Add new list to the cache using basic summary\n const newList = getListFromSummary()\n // Insert the new list at the beginning of the first page\n if (draft.pages.length !== 0) {\n draft.pages[0].lists.unshift(newList)\n }\n } else if (topic === 'entity_list.deleted') {\n // delete the list from the cache\n draft.pages.forEach((page: any) => {\n page.lists = page.lists.filter((l: any) => l.id !== id)\n })\n }\n })\n },\n 10000, // 10 seconds debounce/batch window\n )\n\n topics.forEach((topic) => PubSub.subscribe(topic, handlePubSub))\n } catch {\n // no-op in case `cacheEntryRemoved` resolves before `cacheDataLoaded`,\n // in which case `cacheDataLoaded` will throw\n }\n // cacheEntryRemoved will resolve when the cache subscription is no longer active\n await cacheEntryRemoved\n // perform cleanup steps once the `cacheEntryRemoved` promise resolves\n topics.forEach((t) => PubSub.unsubscribe(t))\n if (handlePubSub && typeof handlePubSub.clear === 'function') handlePubSub.clear()\n },\n keepUnusedDataFor: CACHE_TIME,\n }),\n getListItemsInfinite: build.infiniteQuery<\n GetListItemsResult,\n Omit<GetListItemsQueryVariables, 'first' | 'after' | 'before' | 'last'> & { desc?: boolean },\n ListItemsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n // ascending paginates via hasNextPage, descending (last/before) via\n // hasPreviousPage — the backend only sets one depending on direction\n const hasMore = pageInfo.hasNextPage || pageInfo.hasPreviousPage\n if (!hasMore || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { sortBy, desc, ...rest } = queryArg\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams: GetListItemsQueryVariables = {\n ...rest,\n first: LIST_ITEMS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Add cursor-based pagination\n queryParams.after = cursor || undefined\n queryParams.first = LIST_ITEMS_PER_PAGE\n\n if (sortBy) {\n queryParams.sortBy = sortBy\n if (desc) {\n queryParams.before = cursor || undefined\n queryParams.after = undefined\n queryParams.last = LIST_ITEMS_PER_PAGE\n queryParams.first = undefined\n }\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetListItems.initiate(queryParams, {\n forceRefetch: true,\n }),\n )\n\n if (result.error) {\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n items: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result, _e, { listId, projectName }) => [\n { type: 'entityListItem', id: 'LIST' },\n { type: 'entityListItem', id: listId },\n { type: 'entityListItem', id: projectName },\n ...(result?.pages.flatMap((page) => page.items) || [])\n .filter((i) => !!i)\n .flatMap((item) => [\n {\n type: 'entityListItem',\n id: item.id,\n },\n {\n type: 'entityListItem',\n id: item.entityId,\n },\n ]),\n ],\n async onCacheEntryAdded(\n _args,\n { cacheDataLoaded, cacheEntryRemoved, dispatch, updateCachedData },\n ) {\n let token, token2\n let unsubscribeThumbnails: (() => void) | undefined\n try {\n // wait for the initial query to resolve before proceeding\n const cache = await cacheDataLoaded\n const pages = cache.data.pages\n const items = pages.flatMap((page) => page.items)\n // get entityType of first item\n const entityType = items[0]?.entityType\n\n unsubscribeThumbnails = subscribeToThumbnailUpdates(\n (messages: ThumbnailUpdateMessage[]) => {\n updateCachedData((draft: any) => {\n if (!draft?.pages) return\n messages.forEach((message) => {\n draft.pages.forEach((page: any) => {\n const pageItems = page.items || []\n pageItems.forEach((item: any) => {\n if (\n item.entityId === message.summary.entityId &&\n item.entityType === message.summary.entityType &&\n message.summary.thumbnailHash\n ) {\n item.thumbnailHash = message.summary.thumbnailHash\n }\n })\n })\n })\n })\n },\n )\n\n const listTopic = `entity_list.changed`\n const entityTypeTopic = `entity.${entityType}`\n\n const invalidateListItems = (id: string) => {\n dispatch(gqlApi.util.invalidateTags([{ type: 'entityListItem', id: id }]))\n }\n\n const handleListMessage = (topic: string, message: ListItemMessage) => {\n if (topic !== listTopic) return\n const summary = message.summary\n const id = summary.id\n if (!id) return\n invalidateListItems(id)\n }\n\n const handleEntityMessage = (topic: string, message: ListItemMessage) => {\n if (!topic.startsWith(entityTypeTopic)) return\n const summary = message.summary\n const id = summary.entityId\n // check for id\n if (!id) return\n invalidateListItems(id)\n }\n\n // sub to websocket topic\n token = PubSub.subscribe(listTopic, handleListMessage)\n if (entityType) token2 = PubSub.subscribe(entityTypeTopic, handleEntityMessage)\n } catch {\n // no-op in case `cacheEntryRemoved` resolves before `cacheDataLoaded`,\n // in which case `cacheDataLoaded` will throw\n }\n // cacheEntryRemoved will resolve when the cache subscription is no longer active\n await cacheEntryRemoved\n // perform cleanup steps once the `cacheEntryRemoved` promise resolves\n PubSub.unsubscribe(token)\n PubSub.unsubscribe(token2)\n if (unsubscribeThumbnails) {\n unsubscribeThumbnails()\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n }),\n getListsItemsForReviewSession: build.infiniteQuery<\n GetListsItemsForReviewSessionResult,\n Omit<GetListsQueryVariables, 'first' | 'after' | 'before' | 'filter'>,\n ListsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n if (!pageInfo.hasNextPage || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams = {\n ...queryArg,\n first: LISTS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetListsItemsForReviewSession.initiate(queryParams, {\n forceRefetch: true,\n }),\n )\n\n if (result.error) {\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n lists: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result) => [\n { type: 'entityList', id: 'LIST' },\n ...(result?.pages.flatMap((page) => page.lists) || []).map((list) => ({\n type: 'entityList' as const,\n id: list.id,\n })),\n ],\n keepUnusedDataFor: CACHE_TIME,\n }),\n }),\n})\n\nexport const getListsApiEnhanced = entityListsApi.enhanceEndpoints({\n endpoints: {\n getEntityList: {\n providesTags: (result, _e, { listId, projectName }) => [\n { type: 'entityList', id: listId },\n { type: 'entityList', id: projectName },\n ...(result\n ? [\n { type: 'entityList', id: result.entityListType },\n {\n type: 'entityList',\n id: result.entityListFolderId || 'NO_FOLDER',\n },\n ]\n : []),\n ],\n keepUnusedDataFor: CACHE_TIME,\n },\n },\n})\n\nexport default getListsGqlApiInjected\n\nexport const {\n useGetListsInfiniteInfiniteQuery,\n useGetListItemsInfiniteInfiniteQuery,\n useGetListsItemsForReviewSessionInfiniteQuery,\n useLazyGetListsItemsForReviewSessionQuery,\n useLazyGetListItemsQuery,\n} = getListsGqlApiInjected\n\nexport const { useGetEntityListQuery } = getListsApiEnhanced\n"],"names":["CACHE_TIME","createBatchedCacheUpdater","updateCachedData","applyBatch","delay","queue","timeout","handler","topic","message","batch","draft","parseJSON","data","LISTS_PER_PAGE","LIST_ITEMS_PER_PAGE","getListsGqlApiEnhanced","gqlApi","response","edge","firstEdge","listEdge","node","parseAllAttribs","getListsGqlApiInjected","build","lastPage","pageInfo","queryArg","pageParam","api","cursor","queryParams","result","e","lists","page","list","projectName","cacheDataLoaded","cacheEntryRemoved","topics","handlePubSub","summary","id","getListFromSummary","l","newList","PubSub","t","sortBy","desc","rest","_e","listId","i","item","_args","dispatch","token","token2","unsubscribeThumbnails","entityType","subscribeToThumbnailUpdates","messages","listTopic","entityTypeTopic","invalidateListItems","handleListMessage","handleEntityMessage","getListsApiEnhanced","entityListsApi","useGetListsInfiniteInfiniteQuery","useGetListItemsInfiniteInfiniteQuery","useGetListsItemsForReviewSessionInfiniteQuery","useLazyGetListsItemsForReviewSessionQuery","useLazyGetListItemsQuery","useGetEntityListQuery"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAMA,IAAa;AAGZ,SAASC,EACdC,GACAC,GACAC,IAAQ,KACR;AACA,MAAIC,IAAgD,CAAA,GAChDC,IAAgD;AAEpD,QAAMC,IAAU,CAACC,GAAeC,MAAsB;AACpD,IAAAJ,EAAM,KAAK,EAAE,OAAAG,GAAO,SAAAC,EAAA,CAAS,GACxBH,MACHA,IAAU,WAAW,MAAM;AACzB,YAAMI,IAAQ,CAAC,GAAGL,CAAK;AACvB,MAAAA,IAAQ,CAAA,GACRC,IAAU,MACNI,EAAM,SAAS,KACjBR,EAAiB,CAACS,MAAUR,EAAWQ,GAAOD,CAAK,CAAC;AAAA,IAExD,GAAGN,CAAK;AAAA,EAEZ;AAEA,SAAAG,EAAQ,QAAQ,MAAM;AACpB,IAAID,MACF,aAAaA,CAAO,GACpBA,IAAU,OAEZD,IAAQ,CAAA;AAAA,EACV,GAEOE;AACT;AAGA,MAAMK,IAAY,CAACC,MAAyD;AAC1E,MAAI,CAACA,EAAM,QAAO,CAAA;AAElB,MAAI;AACF,WAAI,OAAOA,KAAS,WACVA,KAA2C,CAAA,IAE9C,KAAK,MAAMA,CAAI;AAAA,EACxB,SAAS,GAAG;AACV,mBAAQ,KAAK,2CAA2C,GAAGA,CAAI,GACxD,CAAA;AAAA,EACT;AACF,GAIaC,IAAiB,KACjBC,IAAsB,KAc7BC,IAAyBC,EAAO,iBAA+C;AAAA,EACnF,WAAW;AAAA,IACT,UAAU;AAAA,MACR,mBAAmB,CAACC,OACX;AAAA;AAAA,QAEL,OAAOA,EAAS,QAAQ,YAAY,MAAM,IAAI,CAACC,OAAU;AAAA,UACvD,GAAGA,EAAK;AAAA,UACR,MAAMP,EAAUO,EAAK,KAAK,IAAI;AAAA,UAC9B,QAAQP,EAAUO,EAAK,KAAK,SAAS;AAAA,QAAA,EACrC;AAAA,QACF,UAAUD,EAAS,QAAQ,YAAY;AAAA,MAAA;AAAA,MAG3C,mBAAmBlB;AAAA,IAAA;AAAA,IAErB,cAAc;AAAA,MACZ,mBAAmB,CAACkB,MAAoD;AACtE,cAAME,IAAYF,EAAS,QAAQ,YAAY,MAAM,CAAC;AACtD,YAAI,CAACE;AACH,gBAAM,IAAI,MAAM,sCAAsC;AAExD,eAAO;AAAA,UACL,OAAOF,EAAS,QAAQ,YAAY,MAAM;AAAA,YAAQ,CAACG,MACjDA,EAAS,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,MAAAC,GAAM,GAAGH,SACjC;AAAA,cACL,GAAGG;AAAA,cACH,GAAGH;AAAA,cACH,QAAQI,EAAgBJ,EAAK,SAAS;AAAA,YAAA,EAEzC;AAAA,UAAA;AAAA,UAEH,UAAUC,EAAU,KAAK,MAAM;AAAA,QAAA;AAAA,MAEnC;AAAA,MACA,mBAAmBpB;AAAA,IAAA;AAAA,IAErB,+BAA+B;AAAA,MAC7B,mBAAmB,CACjBkB,OAEO;AAAA,QACL,OAAOA,EAAS,QAAQ,YAAY,MAAM,IAAI,CAACC,MAASA,EAAK,IAAI;AAAA,QACjE,UAAUD,EAAS,QAAQ,YAAY;AAAA,MAAA;AAAA,MAG3C,mBAAmBlB;AAAA,IAAA;AAAA,EACrB;AAEJ,CAAC,GAEKwB,IAAyBR,EAAuB,gBAAgB;AAAA,EACpE,WAAW,CAACS,OAAW;AAAA,IACrB,kBAAkBA,EAAM,cAItB;AAAA,MACA,sBAAsB;AAAA,QACpB,kBAAkB,EAAE,QAAQ,GAAA;AAAA,QAC5B,kBAAkB,CAACC,MAAa;AAC9B,gBAAM,EAAE,UAAAC,MAAaD;AACrB,cAAI,GAACC,EAAS,eAAe,CAACA,EAAS;AAEvC,mBAAO;AAAA,cACL,QAAQA,EAAS;AAAA,YAAA;AAAA,QAErB;AAAA,MAAA;AAAA,MAEF,SAAS,OAAO,EAAE,UAAAC,GAAU,WAAAC,EAAA,GAAaC,MAAQ;AAC/C,YAAI;AACF,gBAAM,EAAE,QAAAC,MAAWF,GAGbG,IAAc;AAAA,YAClB,GAAGJ;AAAA,YACH,OAAOd;AAAA,YACP,OAAOiB,KAAU;AAAA,UAAA,GAIbE,IAAS,MAAMH,EAAI;AAAA,YACvBd,EAAuB,UAAU,SAAS,SAASgB,GAAa,EAAE,cAAc,IAAM;AAAA,UAAA;AAGxF,iBAAIC,EAAO,QAEF,EAAE,OAAOA,EAAO,MAAA,IAGlB;AAAA,YACL,MAAMA,EAAO,QAAQ;AAAA,cACnB,OAAO,CAAA;AAAA,cACP,UAAU;AAAA,gBACR,aAAa;AAAA,gBACb,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,iBAAiB;AAAA,cAAA;AAAA,YACnB;AAAA,UACF;AAAA,QAEJ,SAASC,GAAQ;AACf,yBAAQ,MAAM,sCAAsCA,CAAC,GAC9C,EAAE,OAAO,EAAE,QAAQ,eAAe,OAAOA,EAAE,UAAQ;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,cAAc,CAACD,MAAW;AACxB,cAAME,IAAQF,GAAQ,MAAM,QAAQ,CAACG,MAASA,EAAK,KAAK,KAAK,CAAA;AAC7D,eAAO;AAAA,UACL,EAAE,MAAM,cAAc,IAAI,OAAA;AAAA,UAC1B,GAAGD,EAAM,QAAQ,CAACE,MAAS;AAAA,YACzB,EAAE,MAAM,cAAuB,IAAIA,EAAK,GAAA;AAAA,YACxC,EAAE,MAAM,cAAuB,IAAIA,EAAK,eAAA;AAAA,YACxC,EAAE,MAAM,cAAuB,IAAIA,EAAK,sBAAsB,YAAA;AAAA,UAAY,CAC3E;AAAA,QAAA;AAAA,MAEL;AAAA,MACA,MAAM,kBACJ,EAAE,aAAAC,EAAA,GACF,EAAE,iBAAAC,GAAiB,mBAAAC,GAAmB,kBAAAtC,KACtC;AACA,cAAMuC,IAAS,CAAC,uBAAuB,uBAAuB,qBAAqB;AACnF,YAAIC,IAAoB;AACxB,YAAI;AAEF,gBAAMH,GAENG,IAAezC;AAAA,YACbC;AAAA,YACA,CAACS,GAAOD,MAAU;AAChB,cAAAA,EAAM,QAAQ,CAAC,EAAE,OAAAF,GAAO,SAAAC,QAAc;AACpC,sBAAMkC,IAAUlC,EAAQ,SAClBmC,IAAKD,EAAQ;AACnB,oBAAI,CAACC,EAAI;AAET,sBAAMC,IAAqB,CAACR,OACnB;AAAA;AAAA,kBAEL,aAAAC;AAAA,kBACA,MAAM,CAAA;AAAA,kBACN,MAAM,CAAA;AAAA,kBACN,WAAW;AAAA,kBACX,QAAQ,CAAA;AAAA,kBACR,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,kBACtB,WAAW;AAAA,kBACX,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,aAAa;AAAA;AAAA;AAAA,kBAEb,GAAID,KAAQ,CAAA;AAAA;AAAA,kBAEZ,IAAIM,EAAQ;AAAA,kBACZ,OAAOA,EAAQ;AAAA,kBACf,YAAYA,EAAQ;AAAA,kBACpB,gBAAgBA,EAAQ;AAAA,kBACxB,OAAOA,EAAQ;AAAA,gBAAA;AAInB,oBAAInC,MAAU,uBAAuB;AAEnC,wBAAM6B,IAAO1B,EAAM,MAChB,QAAQ,CAACyB,MAAcA,EAAK,KAAK,EACjC,KAAK,CAACU,MAAWA,EAAE,OAAOF,CAAE;AAC/B,sBAAI,CAACP,EAAM;AACX,wBAAMU,IAAUF,EAAmBR,CAAI;AAEvC,yBAAO,OAAOA,GAAMU,CAAO;AAAA,gBAC7B,WAAWvC,MAAU,uBAAuB;AAE1C,wBAAMuC,IAAUF,EAAA;AAEhB,kBAAIlC,EAAM,MAAM,WAAW,KACzBA,EAAM,MAAM,CAAC,EAAE,MAAM,QAAQoC,CAAO;AAAA,gBAExC,MAAA,CAAWvC,MAAU,yBAEnBG,EAAM,MAAM,QAAQ,CAACyB,MAAc;AACjC,kBAAAA,EAAK,QAAQA,EAAK,MAAM,OAAO,CAACU,MAAWA,EAAE,OAAOF,CAAE;AAAA,gBACxD,CAAC;AAAA,cAEL,CAAC;AAAA,YACH;AAAA,YACA;AAAA;AAAA,UAAA,GAGFH,EAAO,QAAQ,CAACjC,MAAUwC,EAAO,UAAUxC,GAAOkC,CAAY,CAAC;AAAA,QACjE,QAAQ;AAAA,QAGR;AAEA,cAAMF,GAENC,EAAO,QAAQ,CAACQ,MAAMD,EAAO,YAAYC,CAAC,CAAC,GACvCP,KAAgB,OAAOA,EAAa,SAAU,gBAAyB,MAAA;AAAA,MAC7E;AAAA,MACA,mBAAmB1C;AAAA,IAAA,CACpB;AAAA,IACD,sBAAsByB,EAAM,cAI1B;AAAA,MACA,sBAAsB;AAAA,QACpB,kBAAkB,EAAE,QAAQ,GAAA;AAAA,QAC5B,kBAAkB,CAACC,MAAa;AAC9B,gBAAM,EAAE,UAAAC,MAAaD;AAIrB,cAAI,IADYC,EAAS,eAAeA,EAAS,oBACjC,CAACA,EAAS;AAE1B,mBAAO;AAAA,cACL,QAAQA,EAAS;AAAA,YAAA;AAAA,QAErB;AAAA,MAAA;AAAA,MAEF,SAAS,OAAO,EAAE,UAAAC,GAAU,WAAAC,EAAA,GAAaC,MAAQ;AAC/C,YAAI;AACF,gBAAM,EAAE,QAAAoB,GAAQ,MAAAC,GAAM,GAAGC,MAASxB,GAC5B,EAAE,QAAAG,MAAWF,GAGbG,IAA0C;AAAA,YAC9C,GAAGoB;AAAA,YACH,OAAOrC;AAAA,YACP,OAAOgB,KAAU;AAAA,UAAA;AAInB,UAAAC,EAAY,QAAQD,KAAU,QAC9BC,EAAY,QAAQjB,GAEhBmC,MACFlB,EAAY,SAASkB,GACjBC,MACFnB,EAAY,SAASD,KAAU,QAC/BC,EAAY,QAAQ,QACpBA,EAAY,OAAOjB,GACnBiB,EAAY,QAAQ;AAKxB,gBAAMC,IAAS,MAAMH,EAAI;AAAA,YACvBd,EAAuB,UAAU,aAAa,SAASgB,GAAa;AAAA,cAClE,cAAc;AAAA,YAAA,CACf;AAAA,UAAA;AAGH,iBAAIC,EAAO,QACF,EAAE,OAAOA,EAAO,MAAA,IAGlB;AAAA,YACL,MAAMA,EAAO,QAAQ;AAAA,cACnB,OAAO,CAAA;AAAA,cACP,UAAU;AAAA,gBACR,aAAa;AAAA,gBACb,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,iBAAiB;AAAA,cAAA;AAAA,YACnB;AAAA,UACF;AAAA,QAEJ,SAASC,GAAQ;AACf,yBAAQ,MAAM,sCAAsCA,CAAC,GAC9C,EAAE,OAAO,EAAE,QAAQ,eAAe,OAAOA,EAAE,UAAQ;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,cAAc,CAACD,GAAQoB,GAAI,EAAE,QAAAC,GAAQ,aAAAhB,QAAkB;AAAA,QACrD,EAAE,MAAM,kBAAkB,IAAI,OAAA;AAAA,QAC9B,EAAE,MAAM,kBAAkB,IAAIgB,EAAA;AAAA,QAC9B,EAAE,MAAM,kBAAkB,IAAIhB,EAAA;AAAA,QAC9B,IAAIL,GAAQ,MAAM,QAAQ,CAACG,MAASA,EAAK,KAAK,KAAK,CAAA,GAChD,OAAO,CAACmB,MAAM,CAAC,CAACA,CAAC,EACjB,QAAQ,CAACC,MAAS;AAAA,UACjB;AAAA,YACE,MAAM;AAAA,YACN,IAAIA,EAAK;AAAA,UAAA;AAAA,UAEX;AAAA,YACE,MAAM;AAAA,YACN,IAAIA,EAAK;AAAA,UAAA;AAAA,QACX,CACD;AAAA,MAAA;AAAA,MAEL,MAAM,kBACJC,GACA,EAAE,iBAAAlB,GAAiB,mBAAAC,GAAmB,UAAAkB,GAAU,kBAAAxD,KAChD;AACA,YAAIyD,GAAOC,GACPC;AACJ,YAAI;AAMF,gBAAMC,KAJQ,MAAMvB,GACA,KAAK,MACL,QAAQ,CAACH,MAASA,EAAK,KAAK,EAEvB,CAAC,GAAG;AAE7B,UAAAyB,IAAwBE;AAAA,YACtB,CAACC,MAAuC;AACtC,cAAA9D,EAAiB,CAACS,MAAe;AAC/B,gBAAKA,GAAO,SACZqD,EAAS,QAAQ,CAACvD,MAAY;AAC5B,kBAAAE,EAAM,MAAM,QAAQ,CAACyB,MAAc;AAEjC,qBADkBA,EAAK,SAAS,CAAA,GACtB,QAAQ,CAACoB,MAAc;AAC/B,sBACEA,EAAK,aAAa/C,EAAQ,QAAQ,YAClC+C,EAAK,eAAe/C,EAAQ,QAAQ,cACpCA,EAAQ,QAAQ,kBAEhB+C,EAAK,gBAAgB/C,EAAQ,QAAQ;AAAA,oBAEzC,CAAC;AAAA,kBACH,CAAC;AAAA,gBACH,CAAC;AAAA,cACH,CAAC;AAAA,YACH;AAAA,UAAA;AAGF,gBAAMwD,IAAY,uBACZC,IAAkB,UAAUJ,CAAU,IAEtCK,IAAsB,CAACvB,MAAe;AAC1C,YAAAc,EAASzC,EAAO,KAAK,eAAe,CAAC,EAAE,MAAM,kBAAkB,IAAA2B,EAAA,CAAQ,CAAC,CAAC;AAAA,UAC3E,GAEMwB,IAAoB,CAAC5D,GAAeC,MAA6B;AACrE,gBAAID,MAAUyD,EAAW;AAEzB,kBAAMrB,IADUnC,EAAQ,QACL;AACnB,YAAKmC,KACLuB,EAAoBvB,CAAE;AAAA,UACxB,GAEMyB,IAAsB,CAAC7D,GAAeC,MAA6B;AACvE,gBAAI,CAACD,EAAM,WAAW0D,CAAe,EAAG;AAExC,kBAAMtB,IADUnC,EAAQ,QACL;AAEnB,YAAKmC,KACLuB,EAAoBvB,CAAE;AAAA,UACxB;AAGA,UAAAe,IAAQX,EAAO,UAAUiB,GAAWG,CAAiB,GACjDN,MAAYF,IAASZ,EAAO,UAAUkB,GAAiBG,CAAmB;AAAA,QAChF,QAAQ;AAAA,QAGR;AAEA,cAAM7B,GAENQ,EAAO,YAAYW,CAAK,GACxBX,EAAO,YAAYY,CAAM,GACrBC,KACFA,EAAA;AAAA,MAEJ;AAAA,MACA,mBAAmB7D;AAAA,IAAA,CACpB;AAAA,IACD,+BAA+ByB,EAAM,cAInC;AAAA,MACA,sBAAsB;AAAA,QACpB,kBAAkB,EAAE,QAAQ,GAAA;AAAA,QAC5B,kBAAkB,CAACC,MAAa;AAC9B,gBAAM,EAAE,UAAAC,MAAaD;AACrB,cAAI,GAACC,EAAS,eAAe,CAACA,EAAS;AAEvC,mBAAO;AAAA,cACL,QAAQA,EAAS;AAAA,YAAA;AAAA,QAErB;AAAA,MAAA;AAAA,MAEF,SAAS,OAAO,EAAE,UAAAC,GAAU,WAAAC,EAAA,GAAaC,MAAQ;AAC/C,YAAI;AACF,gBAAM,EAAE,QAAAC,MAAWF,GAGbG,IAAc;AAAA,YAClB,GAAGJ;AAAA,YACH,OAAOd;AAAA,YACP,OAAOiB,KAAU;AAAA,UAAA,GAIbE,IAAS,MAAMH,EAAI;AAAA,YACvBd,EAAuB,UAAU,8BAA8B,SAASgB,GAAa;AAAA,cACnF,cAAc;AAAA,YAAA,CACf;AAAA,UAAA;AAGH,iBAAIC,EAAO,QACF,EAAE,OAAOA,EAAO,MAAA,IAGlB;AAAA,YACL,MAAMA,EAAO,QAAQ;AAAA,cACnB,OAAO,CAAA;AAAA,cACP,UAAU;AAAA,gBACR,aAAa;AAAA,gBACb,WAAW;AAAA,gBACX,aAAa;AAAA,gBACb,iBAAiB;AAAA,cAAA;AAAA,YACnB;AAAA,UACF;AAAA,QAEJ,SAASC,GAAQ;AACf,yBAAQ,MAAM,sCAAsCA,CAAC,GAC9C,EAAE,OAAO,EAAE,QAAQ,eAAe,OAAOA,EAAE,UAAQ;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,cAAc,CAACD,MAAW;AAAA,QACxB,EAAE,MAAM,cAAc,IAAI,OAAA;AAAA,QAC1B,IAAIA,GAAQ,MAAM,QAAQ,CAACG,MAASA,EAAK,KAAK,KAAK,CAAA,GAAI,IAAI,CAACC,OAAU;AAAA,UACpE,MAAM;AAAA,UACN,IAAIA,EAAK;AAAA,QAAA,EACT;AAAA,MAAA;AAAA,MAEJ,mBAAmBrC;AAAA,IAAA,CACpB;AAAA,EAAA;AAEL,CAAC,GAEYsE,IAAsBC,EAAe,iBAAiB;AAAA,EACjE,WAAW;AAAA,IACT,eAAe;AAAA,MACb,cAAc,CAACtC,GAAQoB,GAAI,EAAE,QAAAC,GAAQ,aAAAhB,QAAkB;AAAA,QACrD,EAAE,MAAM,cAAc,IAAIgB,EAAA;AAAA,QAC1B,EAAE,MAAM,cAAc,IAAIhB,EAAA;AAAA,QAC1B,GAAIL,IACA;AAAA,UACE,EAAE,MAAM,cAAc,IAAIA,EAAO,eAAA;AAAA,UACjC;AAAA,YACE,MAAM;AAAA,YACN,IAAIA,EAAO,sBAAsB;AAAA,UAAA;AAAA,QACnC,IAEF,CAAA;AAAA,MAAC;AAAA,MAEP,mBAAmBjC;AAAA,IAAA;AAAA,EACrB;AAEJ,CAAC,GAIY;AAAA,EACX,kCAAAwE;AAAA,EACA,sCAAAC;AAAA,EACA,+CAAAC;AAAA,EACA,2CAAAC;AAAA,EACA,0BAAAC;AACF,IAAIpD,GAES,EAAE,uBAAAqD,OAA0BP;"}
1
+ {"version":3,"file":"getLists.es.js","sources":["../../../../../../src/api/queries/entityLists/getLists.ts"],"sourcesContent":["import { entityListsApi, gqlApi } from '@shared/api/generated'\nimport {\n FetchBaseQueryError,\n DefinitionsFromApi,\n OverrideResultType,\n TagTypesFromApi,\n} from '@reduxjs/toolkit/query'\nimport type {\n EntityList,\n GetListItemsQuery,\n GetListItemsQueryVariables,\n GetListsItemsForReviewSessionQuery,\n GetListsItemsForReviewSessionResult,\n GetListsQuery,\n GetListsQueryVariables,\n} from '@shared/api'\nimport { parseJSONField } from '../overview'\nimport { PubSub, subscribeToThumbnailUpdates, ThumbnailUpdateMessage } from '@shared/util'\nimport {\n GetListItemsResult,\n GetListsResult,\n ListItemMessage,\n ListItemsPageParam,\n ListsPageParam,\n} from './types'\n\nconst CACHE_TIME = 10 // seconds\n\n// Helper function to batch pub/sub messages to avoid constant cache updates\nexport function createBatchedCacheUpdater<TMessage, TDraft>(\n updateCachedData: (updater: (draft: TDraft) => void) => void,\n applyBatch: (draft: TDraft, batch: { topic: string; message: TMessage }[]) => void,\n delay = 5000,\n) {\n let queue: { topic: string; message: TMessage }[] = []\n let timeout: ReturnType<typeof setTimeout> | null = null\n\n const handler = (topic: string, message: TMessage) => {\n queue.push({ topic, message })\n if (!timeout) {\n timeout = setTimeout(() => {\n const batch = [...queue]\n queue = []\n timeout = null\n if (batch.length > 0) {\n updateCachedData((draft) => applyBatch(draft, batch))\n }\n }, delay)\n }\n }\n\n handler.clear = () => {\n if (timeout) {\n clearTimeout(timeout)\n timeout = null\n }\n queue = []\n }\n\n return handler\n}\n\n// Helper function to safely parse entity list data field from JSON string to object\nconst parseJSON = (data: string | null | undefined): Record<string, any> => {\n if (!data) return {}\n\n try {\n if (typeof data !== 'string') {\n return (data as unknown as Record<string, any>) ?? {}\n }\n return JSON.parse(data)\n } catch (e) {\n console.warn('Failed to parse entity list data field:', e, data)\n return {}\n }\n}\n\n// GRAPHQL API (getLists and getListItems)\n// Define the LISTS_PER_PAGE constant for pagination\nexport const LISTS_PER_PAGE = 10000\nexport const LIST_ITEMS_PER_PAGE = 100\n\ntype Definitions = DefinitionsFromApi<typeof gqlApi>\ntype TagTypes = TagTypesFromApi<typeof gqlApi>\n// update the definitions to include the new types\ntype UpdatedDefinitions = Omit<Definitions, 'GetLists' | 'GetListItems'> & {\n GetLists: OverrideResultType<Definitions['GetLists'], GetListsResult>\n GetListItems: OverrideResultType<Definitions['GetListItems'], GetListItemsResult>\n GetListsItemsForReviewSession: OverrideResultType<\n Definitions['GetListsItemsForReviewSession'],\n GetListsItemsForReviewSessionResult\n >\n}\n\nconst getListsGqlApiEnhanced = gqlApi.enhanceEndpoints<TagTypes, UpdatedDefinitions>({\n endpoints: {\n GetLists: {\n transformResponse: (response: GetListsQuery): GetListsResult => {\n return {\n // @ts-expect-error - entityType is string\n lists: response.project.entityLists.edges.map((edge) => ({\n ...edge.node,\n data: parseJSON(edge.node.data),\n attrib: parseJSON(edge.node.allAttrib),\n })),\n pageInfo: response.project.entityLists.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n GetListItems: {\n transformResponse: (response: GetListItemsQuery): GetListItemsResult => {\n const firstEdge = response.project.entityLists.edges[0]\n if (!firstEdge) {\n throw new Error('List does not exist, was it deleted?')\n }\n return {\n items: response.project.entityLists.edges.flatMap((listEdge) =>\n listEdge.node.items.edges.map(({ node, ...edge }) => {\n return {\n ...node,\n ...edge,\n attrib: parseJSONField(edge.allAttrib),\n } as GetListItemsResult['items'][number]\n }),\n ),\n pageInfo: firstEdge.node.items.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n GetListsItemsForReviewSession: {\n transformResponse: (\n response: GetListsItemsForReviewSessionQuery,\n ): GetListsItemsForReviewSessionResult => {\n return {\n lists: response.project.entityLists.edges.map((edge) => edge.node),\n pageInfo: response.project.entityLists.pageInfo,\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n },\n },\n})\n\nconst getListsGqlApiInjected = getListsGqlApiEnhanced.injectEndpoints({\n endpoints: (build) => ({\n getListsInfinite: build.infiniteQuery<\n GetListsResult,\n Omit<GetListsQueryVariables, 'first' | 'after' | 'before'>,\n ListsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n if (!pageInfo.hasNextPage || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams = {\n ...queryArg,\n first: LISTS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetLists.initiate(queryParams, { forceRefetch: true }),\n )\n\n if (result.error) {\n // Preserve original error (e.g. 403) so the UI can react accordingly\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n lists: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result) => {\n const lists = result?.pages.flatMap((page) => page.lists) || []\n return [\n { type: 'entityList', id: 'LIST' },\n ...lists.flatMap((list) => [\n { type: 'entityList' as const, id: list.id },\n { type: 'entityList' as const, id: list.entityListType },\n { type: 'entityList' as const, id: list.entityListFolderId || 'NO_FOLDER' },\n ]),\n ]\n },\n async onCacheEntryAdded(\n { projectName },\n { cacheDataLoaded, cacheEntryRemoved, updateCachedData },\n ) {\n const topics = ['entity_list.changed', 'entity_list.created', 'entity_list.deleted']\n let handlePubSub: any = null\n try {\n // wait for the initial query to resolve before proceeding\n await cacheDataLoaded\n\n handlePubSub = createBatchedCacheUpdater<ListItemMessage, any>(\n updateCachedData,\n (draft, batch) => {\n batch.forEach(({ topic, message }) => {\n const summary = message.summary\n const id = summary.id\n if (!id) return\n\n const getListFromSummary = (list?: EntityList): EntityList => {\n return {\n // defaults\n projectName: projectName,\n tags: [],\n data: {},\n allAttrib: '',\n attrib: {},\n createdAt: new Date().toISOString(),\n updatedAt: '',\n active: true,\n access: '',\n accessLevel: 30, // default admin\n // existing data\n ...(list || {}),\n // new data\n id: summary.id as string,\n label: summary.label,\n entityType: summary.entity_type,\n entityListType: summary.entity_list_type,\n count: summary.count,\n }\n }\n\n if (topic === 'entity_list.changed') {\n // update the data of existing list in cache\n const list = draft.pages\n .flatMap((page: any) => page.lists)\n .find((l: any) => l.id === id)\n if (!list) return\n const newList = getListFromSummary(list)\n\n Object.assign(list, newList)\n } else if (topic === 'entity_list.created') {\n // Add new list to the cache using basic summary\n const newList = getListFromSummary()\n // Insert the new list at the beginning of the first page\n if (draft.pages.length !== 0) {\n draft.pages[0].lists.unshift(newList)\n }\n } else if (topic === 'entity_list.deleted') {\n // delete the list from the cache\n draft.pages.forEach((page: any) => {\n page.lists = page.lists.filter((l: any) => l.id !== id)\n })\n }\n })\n },\n 10000, // 10 seconds debounce/batch window\n )\n\n topics.forEach((topic) => PubSub.subscribe(topic, handlePubSub))\n } catch {\n // no-op in case `cacheEntryRemoved` resolves before `cacheDataLoaded`,\n // in which case `cacheDataLoaded` will throw\n }\n // cacheEntryRemoved will resolve when the cache subscription is no longer active\n await cacheEntryRemoved\n // perform cleanup steps once the `cacheEntryRemoved` promise resolves\n topics.forEach((t) => PubSub.unsubscribe(t))\n if (handlePubSub && typeof handlePubSub.clear === 'function') handlePubSub.clear()\n },\n keepUnusedDataFor: CACHE_TIME,\n }),\n getListItemsInfinite: build.infiniteQuery<\n GetListItemsResult,\n Omit<GetListItemsQueryVariables, 'first' | 'after' | 'before' | 'last'> & { desc?: boolean },\n ListItemsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n // ascending paginates via hasNextPage, descending (last/before) via\n // hasPreviousPage — the backend only sets one depending on direction\n const hasMore = pageInfo.hasNextPage || pageInfo.hasPreviousPage\n if (!hasMore || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { sortBy, desc, ...rest } = queryArg\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams: GetListItemsQueryVariables = {\n ...rest,\n first: LIST_ITEMS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Add cursor-based pagination\n queryParams.after = cursor || undefined\n queryParams.first = LIST_ITEMS_PER_PAGE\n\n if (sortBy) {\n queryParams.sortBy = sortBy\n if (desc) {\n queryParams.before = cursor || undefined\n queryParams.after = undefined\n queryParams.last = LIST_ITEMS_PER_PAGE\n queryParams.first = undefined\n }\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetListItems.initiate(queryParams, {\n forceRefetch: true,\n }),\n )\n\n if (result.error) {\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n items: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result, _e, { listId, projectName }) => [\n { type: 'entityListItem', id: 'LIST' },\n { type: 'entityListItem', id: listId },\n { type: 'entityListItem', id: projectName },\n ...(result?.pages.flatMap((page) => page.items) || [])\n .filter((i) => !!i)\n .flatMap((item) => [\n {\n type: 'entityListItem',\n id: item.id,\n },\n {\n type: 'entityListItem',\n id: item.entityId,\n },\n ]),\n ],\n async onCacheEntryAdded(\n _args,\n { cacheDataLoaded, cacheEntryRemoved, dispatch, updateCachedData },\n ) {\n let token, token2\n let unsubscribeThumbnails: (() => void) | undefined\n try {\n // wait for the initial query to resolve before proceeding\n const cache = await cacheDataLoaded\n const pages = cache.data.pages\n const items = pages.flatMap((page) => page.items)\n // get entityType of first item\n const entityType = items[0]?.entityType\n\n unsubscribeThumbnails = subscribeToThumbnailUpdates(\n (messages: ThumbnailUpdateMessage[]) => {\n updateCachedData((draft: any) => {\n if (!draft?.pages) return\n messages.forEach((message) => {\n draft.pages.forEach((page: any) => {\n const pageItems = page.items || []\n pageItems.forEach((item: any) => {\n if (\n item.entityId === message.summary.entityId &&\n item.entityType === message.summary.entityType &&\n message.summary.thumbnailHash\n ) {\n item.thumbnailHash = message.summary.thumbnailHash\n }\n })\n })\n })\n })\n },\n )\n\n const listTopic = `entity_list.changed`\n const entityTypeTopic = `entity.${entityType}`\n\n const invalidateListItems = (id: string) => {\n dispatch(gqlApi.util.invalidateTags([{ type: 'entityListItem', id: id }]))\n }\n\n const handleListMessage = (topic: string, message: ListItemMessage) => {\n if (topic !== listTopic) return\n const summary = message.summary\n const id = summary.id\n if (!id) return\n invalidateListItems(id)\n }\n\n const handleEntityMessage = (topic: string, message: ListItemMessage) => {\n if (!topic.startsWith(entityTypeTopic)) return\n const summary = message.summary\n const id = summary.entityId\n // check for id\n if (!id) return\n invalidateListItems(id)\n }\n\n // sub to websocket topic\n token = PubSub.subscribe(listTopic, handleListMessage)\n if (entityType) token2 = PubSub.subscribe(entityTypeTopic, handleEntityMessage)\n } catch {\n // no-op in case `cacheEntryRemoved` resolves before `cacheDataLoaded`,\n // in which case `cacheDataLoaded` will throw\n }\n // cacheEntryRemoved will resolve when the cache subscription is no longer active\n await cacheEntryRemoved\n // perform cleanup steps once the `cacheEntryRemoved` promise resolves\n PubSub.unsubscribe(token)\n PubSub.unsubscribe(token2)\n if (unsubscribeThumbnails) {\n unsubscribeThumbnails()\n }\n },\n keepUnusedDataFor: CACHE_TIME,\n }),\n getListsItemsForReviewSession: build.infiniteQuery<\n GetListsItemsForReviewSessionResult,\n Omit<GetListsQueryVariables, 'first' | 'after' | 'before' | 'filter'>,\n ListsPageParam\n >({\n infiniteQueryOptions: {\n initialPageParam: { cursor: '' },\n getNextPageParam: (lastPage) => {\n const { pageInfo } = lastPage\n if (!pageInfo.hasNextPage || !pageInfo.endCursor) return undefined\n\n return {\n cursor: pageInfo.endCursor,\n }\n },\n },\n queryFn: async ({ queryArg, pageParam }, api) => {\n try {\n const { cursor } = pageParam\n\n // Build the query parameters for GetLists\n const queryParams = {\n ...queryArg,\n first: LISTS_PER_PAGE,\n after: cursor || undefined,\n }\n\n // Call the existing GetLists endpoint\n const result = await api.dispatch(\n getListsGqlApiEnhanced.endpoints.GetListsItemsForReviewSession.initiate(queryParams, {\n forceRefetch: true,\n }),\n )\n\n if (result.error) {\n return { error: result.error as FetchBaseQueryError }\n }\n\n return {\n data: result.data || {\n lists: [],\n pageInfo: {\n hasNextPage: false,\n endCursor: null,\n startCursor: null,\n hasPreviousPage: false,\n },\n },\n }\n } catch (e: any) {\n console.error('Error in getListsInfinite queryFn:', e)\n return { error: { status: 'FETCH_ERROR', error: e.message } as FetchBaseQueryError }\n }\n },\n providesTags: (result) => [\n { type: 'entityList', id: 'LIST' },\n ...(result?.pages.flatMap((page) => page.lists) || []).map((list) => ({\n type: 'entityList' as const,\n id: list.id,\n })),\n ],\n keepUnusedDataFor: CACHE_TIME,\n }),\n }),\n})\n\nexport const getListsApiEnhanced = entityListsApi.enhanceEndpoints({\n endpoints: {\n getEntityList: {\n providesTags: (result, _e, { listId, projectName }) => [\n { type: 'entityList', id: listId },\n { type: 'entityList', id: projectName },\n ...(result\n ? [\n { type: 'entityList', id: result.entityListType },\n {\n type: 'entityList',\n id: result.entityListFolderId || 'NO_FOLDER',\n },\n ]\n : []),\n ],\n keepUnusedDataFor: CACHE_TIME,\n },\n },\n})\n\nexport default getListsGqlApiInjected\n\nexport const {\n useGetListsInfiniteInfiniteQuery,\n useGetListItemsInfiniteInfiniteQuery,\n useGetListsItemsForReviewSessionInfiniteQuery,\n useLazyGetListsItemsForReviewSessionQuery,\n useLazyGetListItemsQuery,\n} = getListsGqlApiInjected\n\nexport const { useGetEntityListQuery } = getListsApiEnhanced\n"],"names":["CACHE_TIME","createBatchedCacheUpdater","updateCachedData","applyBatch","delay","queue","timeout","handler","topic","message","batch","draft","parseJSON","data","LISTS_PER_PAGE","LIST_ITEMS_PER_PAGE","getListsGqlApiEnhanced","gqlApi","response","edge","firstEdge","listEdge","node","parseJSONField","getListsGqlApiInjected","build","lastPage","pageInfo","queryArg","pageParam","api","cursor","queryParams","result","e","lists","page","list","projectName","cacheDataLoaded","cacheEntryRemoved","topics","handlePubSub","summary","id","getListFromSummary","l","newList","PubSub","t","sortBy","desc","rest","_e","listId","i","item","_args","dispatch","token","token2","unsubscribeThumbnails","entityType","subscribeToThumbnailUpdates","messages","listTopic","entityTypeTopic","invalidateListItems","handleListMessage","handleEntityMessage","getListsApiEnhanced","entityListsApi","useGetListsInfiniteInfiniteQuery","useGetListItemsInfiniteInfiniteQuery","useGetListsItemsForReviewSessionInfiniteQuery","useLazyGetListsItemsForReviewSessionQuery","useLazyGetListItemsQuery","useGetEntityListQuery"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../base/client.cjs.js");const G=require("../../generated/graphql.cjs.js");require("../../generated/graphqlLinks.cjs.js");require("../../generated/access.cjs.js");require("../../generated/actions.cjs.js");require("../../generated/activityFeed.cjs.js");require("../../generated/addons.cjs.js");require("../../generated/anatomy.cjs.js");require("../../generated/attributes.cjs.js");require("../../generated/authentication.cjs.js");require("../../generated/bundles.cjs.js");require("../../generated/configuration.cjs.js");require("../../generated/dataImport.cjs.js");require("../../generated/desktop.cjs.js");require("../../generated/entityLists.cjs.js");require("../../generated/events.cjs.js");require("../../generated/files.cjs.js");const H=require("../../generated/folders.cjs.js");require("../../generated/inbox.cjs.js");require("../../generated/links.cjs.js");require("../../generated/market.cjs.js");require("../../generated/onboarding.cjs.js");require("../../generated/operations.cjs.js");require("../../generated/products.cjs.js");require("../../generated/projectDashboard.cjs.js");require("../../generated/projects.cjs.js");require("../../generated/projectFolders.cjs.js");require("../../generated/reviewables.cjs.js");require("../../generated/services.cjs.js");require("../../generated/system.cjs.js");require("../../generated/tasks.cjs.js");require("../../generated/teams.cjs.js");require("../../generated/thumbnails.cjs.js");require("../../generated/uRIs.cjs.js");require("../../generated/users.cjs.js");require("../../generated/versions.cjs.js");require("../../generated/workfiles.cjs.js");require("../../generated/ynputCloud.cjs.js");require("../../generated/grouping.cjs.js");require("../../generated/views.cjs.js");require("lodash");require("react-toastify");require("uuid");const Q=require("../../../util/thumbnailWebsocket.cjs.js");require("../actions/getActions.cjs.js");require("../activities/getActivities.cjs.js");require("../activities/updateReaction.cjs.js");require("../activities/getMentions.cjs.js");require("../activities/getCategories.cjs.js");require("../addons/getAddons.cjs.js");require("../addons/updateAddons.cjs.js");require("../attributes/getAttributes.cjs.js");require("../attributes/updateAttributes.cjs.js");require("../authentication/getAuthentication.cjs.js");require("../bundles/getBundles.cjs.js");require("../bundles/updateBundles.cjs.js");require("../cloud/cloud.cjs.js");require("../columnStats/metricTargets.cjs.js");require("../columnStats/groupCounts.cjs.js");require("../config/getConfig.cjs.js");require("../config/updateConfig.cjs.js");require("../entities/getEntity.cjs.js");require("../entities/getEntityPanel.cjs.js");const k=require("../overview/getOverview.cjs.js");require("../overview/updateOverview.cjs.js");require("../versions/getVersionsProducts.cjs.js");require("../links/getEntityLinks.cjs.js");require("../entities/updateEntity.cjs.js");require("../entityLists/getLists.cjs.js");require("../entityLists/updateLists.cjs.js");require("../entityLists/getListsAttributes.cjs.js");require("../entityLists/listItemsColumnStats.cjs.js");require("../entityLists/updateListsAttributes.cjs.js");require("../entityLists/listFolders.cjs.js");require("./getFolderDeleteInfo.cjs.js");require("../grouping/getGrouping.cjs.js");require("../links/updateLinks.cjs.js");require("../links/getLinks.cjs.js");require("../permissions/getPermissions.cjs.js");require("../products/createProduct.cjs.js");require("../products/getFolderProducts.cjs.js");require("../project/getProject.cjs.js");require("../project/updateProject.cjs.js");require("../projectFolders/projectFolders.cjs.js");require("../review/getReview.cjs.js");require("../review/updateReview.cjs.js");require("../share/share.cjs.js");require("../system/getSystem.cjs.js");require("../tasks/getTasks.cjs.js");require("../tasks/updateTasks.cjs.js");require("../teams/getTeams.cjs.js");require("../userDashboard/getUserDashboard.cjs.js");require("../users/getUsers.cjs.js");require("../users/updateUsers.cjs.js");require("../users/guests.cjs.js");require("../versions/updateVersions.cjs.js");require("../views/getViews.cjs.js");require("../views/updateViews.cjs.js");require("../watchers/getWatchers.cjs.js");require("../uris/getUris.cjs.js");const p=require("../../../util/realtimeUpdatesUtils.cjs.js"),_=require("../../../util/pubsub.cjs.js"),N=G.api.enhanceEndpoints({endpoints:{GetUpdatedAndNewFolders:{transformResponse:f=>f.project.folders.edges.map(({node:u})=>({...u,attrib:k.parseAllAttribs(u.allAttrib),path:u.path??"",parentId:u.parentId??void 0,label:u.label??void 0,taskNames:[],createdAt:String(u.createdAt),updatedAt:String(u.updatedAt)}))}}}),w=p.REALTIME_REST_CALL_LIMIT,L=H.api.enhanceEndpoints({endpoints:{getFolderHierarchy:{providesTags:["hierarchy"]},getFolderList:{providesTags:(f,u,{projectName:b})=>["hierarchy",{type:"folder",id:"LIST"},...f?.folders.map(({id:q})=>({type:"folder",id:q}))||[],{type:"folder",id:b}],async onCacheEntryAdded(f,{cacheDataLoaded:u,cacheEntryRemoved:b,updateCachedData:q,getCacheEntry:M,dispatch:R}){const{projectName:g}=f||{},v=["status","tags","folderType"],I={"entity.folder.label_changed":"label","entity.folder.renamed":"name","entity.folder.type_changed":"folderType","entity.folder.status_changed":"status","entity.folder.tags_changed":"tags","entity.folder.attrib_changed":"attrib"},P=["entity.folder"],T=[],U=async a=>{if(!g)return;const o=new Set,t=M().data;t&&Array.isArray(t.folders)&&t.folders.forEach(e=>o.add(e.id));const n=[],c=[],l=new Map,E=[];a.forEach(e=>{const i=e.summary?.entityId;if(!i)return;if(e.topic==="entity.folder.deleted"){n.push(i);return}if(e.topic==="entity.folder.created"){c.push(i);return}if(!o.has(i))return;const s=p.getSupportedEntityPatch(I[e.topic],e.summary,v);if(s)E.push({folderId:i,...s});else{const d=I[e.topic];if(!d)return;const r=l.get(i)||new Set;r.add(d),l.set(i,r)}}),n.length&&q(e=>{!e||!Array.isArray(e.folders)||(e.folders=e.folders.filter(i=>!n.includes(i.id)))}),E.length&&q(e=>{!e||!Array.isArray(e.folders)||E.forEach(({folderId:i,field:s,value:d})=>{const r=e.folders.find(h=>h.id===i);r&&(r[s]=d)})});const y=[...new Set([...c,...l.keys()])];if(!(y.length>w)&&y.length){await p.waitForRealtimeJitter();const e=await R(N.endpoints.GetUpdatedAndNewFolders.initiate({projectName:g,folderIds:y,first:y.length})).unwrap().catch(()=>[]),i=new Set(c);q(s=>{if(!s||!Array.isArray(s.folders))return;const d=new Map(e.filter(Boolean).map(r=>[r.id,r]));s.folders.forEach((r,h)=>{const F=d.get(r.id);F&&(i.has(r.id)?s.folders[h]={...r,...F}:(l.get(r.id)||new Set).forEach(S=>{r[S]=F[S]}),d.delete(r.id))}),d.forEach((r,h)=>{i.has(h)&&s.folders.push(r)})})}},A=p.createRealtimeBatcher(U,a=>a.summary.entityId);let m;try{await u,m=Q.subscribeToThumbnailUpdates(o=>{q(t=>{!t||!Array.isArray(t.folders)||o.forEach(n=>{if(n.summary.entityType==="folder"&&n.summary.thumbnailHash){const c=t.folders.findIndex(l=>l.id===n.summary.entityId);c!==-1&&(t.folders[c].thumbnailHash=n.summary.thumbnailHash)}})})},["folder"]);const a=(o,t)=>{t?.summary?.entityId&&A.add({...t,topic:o})};P.forEach(o=>T.push(_.subscribe(o,a)))}catch{}await b,A.clear(),T.forEach(a=>_.unsubscribe(a)),m&&m(),A.clear()}}}}),{useGetFolderHierarchyQuery:O,useGetFolderListQuery:j}=L;exports.MAX_FOLDER_UPDATE_REST_CALLS=w;exports.foldersQueries=L;exports.useGetFolderHierarchyQuery=O;exports.useGetFolderListQuery=j;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("../../base/client.cjs.js");const G=require("../../generated/graphql.cjs.js");require("../../generated/graphqlLinks.cjs.js");require("../../generated/access.cjs.js");require("../../generated/actions.cjs.js");require("../../generated/activityFeed.cjs.js");require("../../generated/addons.cjs.js");require("../../generated/anatomy.cjs.js");require("../../generated/attributes.cjs.js");require("../../generated/authentication.cjs.js");require("../../generated/bundles.cjs.js");require("../../generated/configuration.cjs.js");require("../../generated/dataImport.cjs.js");require("../../generated/desktop.cjs.js");require("../../generated/entityLists.cjs.js");require("../../generated/events.cjs.js");require("../../generated/files.cjs.js");const H=require("../../generated/folders.cjs.js");require("../../generated/inbox.cjs.js");require("../../generated/links.cjs.js");require("../../generated/market.cjs.js");require("../../generated/onboarding.cjs.js");require("../../generated/operations.cjs.js");require("../../generated/products.cjs.js");require("../../generated/projectDashboard.cjs.js");require("../../generated/projects.cjs.js");require("../../generated/projectFolders.cjs.js");require("../../generated/reviewables.cjs.js");require("../../generated/services.cjs.js");require("../../generated/system.cjs.js");require("../../generated/tasks.cjs.js");require("../../generated/teams.cjs.js");require("../../generated/thumbnails.cjs.js");require("../../generated/uRIs.cjs.js");require("../../generated/users.cjs.js");require("../../generated/versions.cjs.js");require("../../generated/workfiles.cjs.js");require("../../generated/ynputCloud.cjs.js");require("../../generated/grouping.cjs.js");require("../../generated/views.cjs.js");require("lodash");require("react-toastify");require("uuid");const N=require("../../../util/thumbnailWebsocket.cjs.js");require("../actions/getActions.cjs.js");require("../activities/getActivities.cjs.js");require("../activities/updateReaction.cjs.js");require("../activities/getMentions.cjs.js");require("../activities/getCategories.cjs.js");require("../addons/getAddons.cjs.js");require("../addons/updateAddons.cjs.js");require("../attributes/getAttributes.cjs.js");require("../attributes/updateAttributes.cjs.js");require("../authentication/getAuthentication.cjs.js");require("../bundles/getBundles.cjs.js");require("../bundles/updateBundles.cjs.js");require("../cloud/cloud.cjs.js");require("../columnStats/metricTargets.cjs.js");require("../columnStats/groupCounts.cjs.js");require("../config/getConfig.cjs.js");require("../config/updateConfig.cjs.js");require("../entities/getEntity.cjs.js");require("../entities/getEntityPanel.cjs.js");const O=require("../overview/getOverview.cjs.js");require("../overview/updateOverview.cjs.js");require("../versions/getVersionsProducts.cjs.js");require("../links/getEntityLinks.cjs.js");require("../entities/updateEntity.cjs.js");require("../entityLists/getLists.cjs.js");require("../entityLists/updateLists.cjs.js");require("../entityLists/getListsAttributes.cjs.js");require("../entityLists/listItemsColumnStats.cjs.js");require("../entityLists/updateListsAttributes.cjs.js");require("../entityLists/listFolders.cjs.js");require("./getFolderDeleteInfo.cjs.js");require("../grouping/getGrouping.cjs.js");require("../links/updateLinks.cjs.js");require("../links/getLinks.cjs.js");require("../permissions/getPermissions.cjs.js");require("../products/createProduct.cjs.js");require("../products/getFolderProducts.cjs.js");require("../project/getProject.cjs.js");require("../project/updateProject.cjs.js");require("../projectFolders/projectFolders.cjs.js");require("../review/getReview.cjs.js");require("../review/updateReview.cjs.js");require("../share/share.cjs.js");require("../system/getSystem.cjs.js");require("../tasks/getTasks.cjs.js");require("../tasks/updateTasks.cjs.js");require("../teams/getTeams.cjs.js");require("../userDashboard/getUserDashboard.cjs.js");require("../users/getUsers.cjs.js");require("../users/updateUsers.cjs.js");require("../users/guests.cjs.js");require("../versions/updateVersions.cjs.js");require("../views/getViews.cjs.js");require("../views/updateViews.cjs.js");require("../watchers/getWatchers.cjs.js");require("../uris/getUris.cjs.js");const p=require("../../../util/realtimeUpdatesUtils.cjs.js"),_=require("../../../util/pubsub.cjs.js"),Q=G.api.enhanceEndpoints({endpoints:{GetUpdatedAndNewFolders:{transformResponse:f=>f.project.folders.edges.map(({node:u})=>({...u,attrib:O.parseJSONField(u.allAttrib),path:u.path??"",parentId:u.parentId??void 0,label:u.label??void 0,taskNames:[],createdAt:String(u.createdAt),updatedAt:String(u.updatedAt)}))}}}),w=p.REALTIME_REST_CALL_LIMIT,L=H.api.enhanceEndpoints({endpoints:{getFolderHierarchy:{providesTags:["hierarchy"]},getFolderList:{providesTags:(f,u,{projectName:b})=>["hierarchy",{type:"folder",id:"LIST"},...f?.folders.map(({id:q})=>({type:"folder",id:q}))||[],{type:"folder",id:b}],async onCacheEntryAdded(f,{cacheDataLoaded:u,cacheEntryRemoved:b,updateCachedData:q,getCacheEntry:M,dispatch:R}){const{projectName:g}=f||{},v=["status","tags","folderType"],I={"entity.folder.label_changed":"label","entity.folder.renamed":"name","entity.folder.type_changed":"folderType","entity.folder.status_changed":"status","entity.folder.tags_changed":"tags","entity.folder.attrib_changed":"attrib"},P=["entity.folder"],S=[],U=async a=>{if(!g)return;const o=new Set,t=M().data;t&&Array.isArray(t.folders)&&t.folders.forEach(e=>o.add(e.id));const n=[],c=[],l=new Map,F=[];a.forEach(e=>{const i=e.summary?.entityId;if(!i)return;if(e.topic==="entity.folder.deleted"){n.push(i);return}if(e.topic==="entity.folder.created"){c.push(i);return}if(!o.has(i))return;const s=p.getSupportedEntityPatch(I[e.topic],e.summary,v);if(s)F.push({folderId:i,...s});else{const d=I[e.topic];if(!d)return;const r=l.get(i)||new Set;r.add(d),l.set(i,r)}}),n.length&&q(e=>{!e||!Array.isArray(e.folders)||(e.folders=e.folders.filter(i=>!n.includes(i.id)))}),F.length&&q(e=>{!e||!Array.isArray(e.folders)||F.forEach(({folderId:i,field:s,value:d})=>{const r=e.folders.find(h=>h.id===i);r&&(r[s]=d)})});const y=[...new Set([...c,...l.keys()])];if(!(y.length>w)&&y.length){await p.waitForRealtimeJitter();const e=await R(Q.endpoints.GetUpdatedAndNewFolders.initiate({projectName:g,folderIds:y,first:y.length})).unwrap().catch(()=>[]),i=new Set(c);q(s=>{if(!s||!Array.isArray(s.folders))return;const d=new Map(e.filter(Boolean).map(r=>[r.id,r]));s.folders.forEach((r,h)=>{const E=d.get(r.id);E&&(i.has(r.id)?s.folders[h]={...r,...E}:(l.get(r.id)||new Set).forEach(T=>{r[T]=E[T]}),d.delete(r.id))}),d.forEach((r,h)=>{i.has(h)&&s.folders.push(r)})})}},m=p.createRealtimeBatcher(U,a=>a.summary.entityId);let A;try{await u,A=N.subscribeToThumbnailUpdates(o=>{q(t=>{!t||!Array.isArray(t.folders)||o.forEach(n=>{if(n.summary.entityType==="folder"&&n.summary.thumbnailHash){const c=t.folders.findIndex(l=>l.id===n.summary.entityId);c!==-1&&(t.folders[c].thumbnailHash=n.summary.thumbnailHash)}})})},["folder"]);const a=(o,t)=>{t?.summary?.entityId&&m.add({...t,topic:o})};P.forEach(o=>S.push(_.subscribe(o,a)))}catch{}await b,m.clear(),S.forEach(a=>_.unsubscribe(a)),A&&A(),m.clear()}}}}),{useGetFolderHierarchyQuery:k,useGetFolderListQuery:j}=L;exports.MAX_FOLDER_UPDATE_REST_CALLS=w;exports.foldersQueries=L;exports.useGetFolderHierarchyQuery=k;exports.useGetFolderListQuery=j;
2
2
  //# sourceMappingURL=getFolders.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getFolders.cjs.js","sources":["../../../../../../src/api/queries/folders/getFolders.ts"],"sourcesContent":["import {\n FolderListItem,\n foldersApi,\n GetUpdatedAndNewFoldersQuery,\n gqlApi,\n} from '@shared/api/generated'\nimport {\n getSupportedEntityPatch,\n createRealtimeBatcher,\n REALTIME_REST_CALL_LIMIT,\n waitForRealtimeJitter,\n PubSub,\n subscribeToThumbnailUpdates,\n ThumbnailUpdateMessage,\n SupportedEntityPatchField,\n} from '@shared/util'\n\nimport { DefinitionsFromApi, OverrideResultType, TagTypesFromApi } from '@reduxjs/toolkit/query'\nimport { parseAllAttribs } from '../overview'\n\ntype GetUpdatedAndNewFoldersResult = FolderListItem[]\n\n// HELPER QUERIES FOR REALTIME UPDATES\ntype Definitions = DefinitionsFromApi<typeof gqlApi>\ntype TagTypes = TagTypesFromApi<typeof gqlApi>\n// update the definitions to include the new types\ntype UpdatedDefinitions = Omit<Definitions, 'GetUpdatedAndNewFolders'> & {\n GetUpdatedAndNewFolders: OverrideResultType<\n Definitions['GetUpdatedAndNewFolders'],\n GetUpdatedAndNewFoldersResult\n >\n}\n\nconst graphqlFolders = gqlApi.enhanceEndpoints<TagTypes, UpdatedDefinitions>({\n endpoints: {\n GetUpdatedAndNewFolders: {\n transformResponse: (response: GetUpdatedAndNewFoldersQuery): GetUpdatedAndNewFoldersResult =>\n response.project.folders.edges.map(({ node }) => ({\n ...node,\n attrib: parseAllAttribs(node.allAttrib),\n path: node.path ?? '',\n parentId: node.parentId ?? undefined,\n label: node.label ?? undefined,\n taskNames: [],\n createdAt: String(node.createdAt),\n updatedAt: String(node.updatedAt),\n })),\n },\n },\n})\n\n// the max number of folder to process in a single batch\n// TODO: Use this limit to trigger the reload button\nexport const MAX_FOLDER_UPDATE_REST_CALLS = REALTIME_REST_CALL_LIMIT\n\nconst enhancedApi = foldersApi.enhanceEndpoints({\n endpoints: {\n getFolderHierarchy: {\n providesTags: ['hierarchy'],\n },\n getFolderList: {\n providesTags: (result, _e, { projectName }) => [\n 'hierarchy',\n { type: 'folder', id: 'LIST' },\n ...(result?.folders.map(({ id }) => ({ type: 'folder', id })) || []),\n { type: 'folder', id: projectName },\n ],\n async onCacheEntryAdded(\n args,\n { cacheDataLoaded, cacheEntryRemoved, updateCachedData, getCacheEntry, dispatch },\n ) {\n const { projectName } = args || {}\n const supportedFolderFields = ['status', 'tags', 'folderType']\n const topicFieldMap: Record<string, string> = {\n 'entity.folder.label_changed': 'label',\n 'entity.folder.renamed': 'name',\n 'entity.folder.type_changed': 'folderType',\n 'entity.folder.status_changed': 'status',\n 'entity.folder.tags_changed': 'tags',\n 'entity.folder.attrib_changed': 'attrib',\n }\n\n const topics = ['entity.folder']\n const tokens: (string | undefined)[] = []\n\n // handle a batch of messages, updating the cache and fetching missing data as needed\n const batchProcessMessages = async (messages: any[]) => {\n if (!projectName) return\n\n const cachedFolderIds = new Set<string>()\n const cachedFolders = getCacheEntry().data\n if (cachedFolders && Array.isArray(cachedFolders.folders)) {\n cachedFolders.folders.forEach((folder: any) => cachedFolderIds.add(folder.id))\n }\n\n const deletedIds: string[] = []\n const createdIds: string[] = []\n const unsupportedFields = new Map<string, Set<string>>()\n const summaryPatches: {\n folderId: string\n field: SupportedEntityPatchField\n value: string | string[]\n }[] = []\n\n // for each message, check it's type and then add it to the appropriate list for processing\n messages.forEach((message) => {\n const folderId = message.summary?.entityId\n if (!folderId) return\n\n // delete: remove from cache - no additional API calls\n if (message.topic === 'entity.folder.deleted') {\n deletedIds.push(folderId)\n return\n }\n\n // create: add to cache - will fetch the full folder data later\n if (message.topic === 'entity.folder.created') {\n createdIds.push(folderId)\n return\n }\n\n // for updates, check if the folder is in the cache\n // no point updating a folder that does not exist for the user\n if (!cachedFolderIds.has(folderId)) return\n\n // check if the updated field data is in the summary (status, tags etc)\n // if it is, we can update the cache directly, otherwise we will need to fetch the full folder data later\n const patch = getSupportedEntityPatch(\n topicFieldMap[message.topic],\n message.summary,\n supportedFolderFields,\n )\n if (patch) summaryPatches.push({ folderId, ...patch })\n else {\n const field = topicFieldMap[message.topic]\n if (!field) return\n\n const fields = unsupportedFields.get(folderId) || new Set<string>()\n fields.add(field)\n unsupportedFields.set(folderId, fields)\n }\n })\n\n // DELETED: remove deleted folders from cache\n if (deletedIds.length) {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n draft.folders = draft.folders.filter((folder: any) => !deletedIds.includes(folder.id))\n })\n }\n\n // UPDATED: update cached folders with summary data from the message, if available\n if (summaryPatches.length) {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n summaryPatches.forEach(({ folderId, field, value }) => {\n const folder = draft.folders.find((item: any) => item.id === folderId)\n if (folder) folder[field] = value\n })\n })\n }\n\n // Fetch created and unsupported folders in one request.\n // This is to avoid overwhelming the API with too many requests at once, and to prevent potential performance issues in the frontend.\n const foldersToFetch = [\n ...new Set([...createdIds, ...unsupportedFields.keys()]),\n ]\n if (foldersToFetch.length > MAX_FOLDER_UPDATE_REST_CALLS) return\n\n if (foldersToFetch.length) {\n await waitForRealtimeJitter()\n const fetchedFolders = await dispatch(\n graphqlFolders.endpoints.GetUpdatedAndNewFolders.initiate({\n projectName,\n folderIds: foldersToFetch,\n first: foldersToFetch.length,\n }),\n )\n .unwrap()\n .catch(() => [])\n\n const createdFolderIds = new Set(createdIds)\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n const fetchedById = new Map(\n fetchedFolders.filter(Boolean).map((folder: any) => [folder.id, folder] as const),\n )\n\n draft.folders.forEach((folder: any, index: number) => {\n const fetchedFolder = fetchedById.get(folder.id)\n if (!fetchedFolder) return\n\n if (createdFolderIds.has(folder.id)) {\n draft.folders[index] = { ...folder, ...fetchedFolder }\n } else {\n const fields = unsupportedFields.get(folder.id) || new Set<string>()\n fields.forEach((field) => {\n folder[field] = fetchedFolder[field]\n })\n }\n fetchedById.delete(folder.id)\n })\n\n fetchedById.forEach((folder, folderId) => {\n if (createdFolderIds.has(folderId)) draft.folders.push(folder)\n })\n })\n }\n }\n\n // create a batcher to process messages in batches\n const batcher = createRealtimeBatcher(\n batchProcessMessages,\n (message: any) => message.summary.entityId,\n )\n\n let unsubscribeThumbnails: (() => void) | undefined\n\n try {\n await cacheDataLoaded\n\n unsubscribeThumbnails = subscribeToThumbnailUpdates(\n (messages: ThumbnailUpdateMessage[]) => {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n messages.forEach((message) => {\n if (message.summary.entityType === 'folder' && message.summary.thumbnailHash) {\n const idx = draft.folders.findIndex(\n (f: any) => f.id === message.summary.entityId,\n )\n if (idx !== -1) {\n draft.folders[idx].thumbnailHash = message.summary.thumbnailHash\n }\n }\n })\n })\n },\n ['folder'],\n )\n\n const handlePubSub = (topic: string, message: any) => {\n const entityId = message?.summary?.entityId\n if (!entityId) return\n\n // add update to the batcher\n batcher.add({ ...message, topic })\n }\n\n topics.forEach((t) => tokens.push(PubSub.subscribe(t, handlePubSub)))\n } catch {\n // silent\n }\n\n await cacheEntryRemoved\n batcher.clear()\n tokens.forEach((t) => PubSub.unsubscribe(t))\n if (unsubscribeThumbnails) unsubscribeThumbnails()\n batcher.clear()\n },\n },\n },\n})\n\nexport const { useGetFolderHierarchyQuery, useGetFolderListQuery } = enhancedApi\nexport { enhancedApi as foldersQueries }\n"],"names":["graphqlFolders","gqlApi","response","node","parseAllAttribs","MAX_FOLDER_UPDATE_REST_CALLS","REALTIME_REST_CALL_LIMIT","enhancedApi","foldersApi","result","_e","projectName","id","args","cacheDataLoaded","cacheEntryRemoved","updateCachedData","getCacheEntry","dispatch","supportedFolderFields","topicFieldMap","topics","tokens","batchProcessMessages","messages","cachedFolderIds","cachedFolders","folder","deletedIds","createdIds","unsupportedFields","summaryPatches","message","folderId","patch","getSupportedEntityPatch","field","fields","draft","value","item","foldersToFetch","waitForRealtimeJitter","fetchedFolders","createdFolderIds","fetchedById","index","fetchedFolder","batcher","createRealtimeBatcher","unsubscribeThumbnails","subscribeToThumbnailUpdates","idx","f","handlePubSub","topic","t","PubSub","useGetFolderHierarchyQuery","useGetFolderListQuery"],"mappings":"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"}
1
+ {"version":3,"file":"getFolders.cjs.js","sources":["../../../../../../src/api/queries/folders/getFolders.ts"],"sourcesContent":["import {\n FolderListItem,\n foldersApi,\n GetUpdatedAndNewFoldersQuery,\n gqlApi,\n} from '@shared/api/generated'\nimport {\n getSupportedEntityPatch,\n createRealtimeBatcher,\n REALTIME_REST_CALL_LIMIT,\n waitForRealtimeJitter,\n PubSub,\n subscribeToThumbnailUpdates,\n ThumbnailUpdateMessage,\n SupportedEntityPatchField,\n} from '@shared/util'\n\nimport { DefinitionsFromApi, OverrideResultType, TagTypesFromApi } from '@reduxjs/toolkit/query'\nimport { parseJSONField } from '../overview'\n\ntype GetUpdatedAndNewFoldersResult = FolderListItem[]\n\n// HELPER QUERIES FOR REALTIME UPDATES\ntype Definitions = DefinitionsFromApi<typeof gqlApi>\ntype TagTypes = TagTypesFromApi<typeof gqlApi>\n// update the definitions to include the new types\ntype UpdatedDefinitions = Omit<Definitions, 'GetUpdatedAndNewFolders'> & {\n GetUpdatedAndNewFolders: OverrideResultType<\n Definitions['GetUpdatedAndNewFolders'],\n GetUpdatedAndNewFoldersResult\n >\n}\n\nconst graphqlFolders = gqlApi.enhanceEndpoints<TagTypes, UpdatedDefinitions>({\n endpoints: {\n GetUpdatedAndNewFolders: {\n transformResponse: (response: GetUpdatedAndNewFoldersQuery): GetUpdatedAndNewFoldersResult =>\n response.project.folders.edges.map(({ node }) => ({\n ...node,\n attrib: parseJSONField(node.allAttrib),\n path: node.path ?? '',\n parentId: node.parentId ?? undefined,\n label: node.label ?? undefined,\n taskNames: [],\n createdAt: String(node.createdAt),\n updatedAt: String(node.updatedAt),\n })),\n },\n },\n})\n\n// the max number of folder to process in a single batch\n// TODO: Use this limit to trigger the reload button\nexport const MAX_FOLDER_UPDATE_REST_CALLS = REALTIME_REST_CALL_LIMIT\n\nconst enhancedApi = foldersApi.enhanceEndpoints({\n endpoints: {\n getFolderHierarchy: {\n providesTags: ['hierarchy'],\n },\n getFolderList: {\n providesTags: (result, _e, { projectName }) => [\n 'hierarchy',\n { type: 'folder', id: 'LIST' },\n ...(result?.folders.map(({ id }) => ({ type: 'folder', id })) || []),\n { type: 'folder', id: projectName },\n ],\n async onCacheEntryAdded(\n args,\n { cacheDataLoaded, cacheEntryRemoved, updateCachedData, getCacheEntry, dispatch },\n ) {\n const { projectName } = args || {}\n const supportedFolderFields = ['status', 'tags', 'folderType']\n const topicFieldMap: Record<string, string> = {\n 'entity.folder.label_changed': 'label',\n 'entity.folder.renamed': 'name',\n 'entity.folder.type_changed': 'folderType',\n 'entity.folder.status_changed': 'status',\n 'entity.folder.tags_changed': 'tags',\n 'entity.folder.attrib_changed': 'attrib',\n }\n\n const topics = ['entity.folder']\n const tokens: (string | undefined)[] = []\n\n // handle a batch of messages, updating the cache and fetching missing data as needed\n const batchProcessMessages = async (messages: any[]) => {\n if (!projectName) return\n\n const cachedFolderIds = new Set<string>()\n const cachedFolders = getCacheEntry().data\n if (cachedFolders && Array.isArray(cachedFolders.folders)) {\n cachedFolders.folders.forEach((folder: any) => cachedFolderIds.add(folder.id))\n }\n\n const deletedIds: string[] = []\n const createdIds: string[] = []\n const unsupportedFields = new Map<string, Set<string>>()\n const summaryPatches: {\n folderId: string\n field: SupportedEntityPatchField\n value: string | string[]\n }[] = []\n\n // for each message, check it's type and then add it to the appropriate list for processing\n messages.forEach((message) => {\n const folderId = message.summary?.entityId\n if (!folderId) return\n\n // delete: remove from cache - no additional API calls\n if (message.topic === 'entity.folder.deleted') {\n deletedIds.push(folderId)\n return\n }\n\n // create: add to cache - will fetch the full folder data later\n if (message.topic === 'entity.folder.created') {\n createdIds.push(folderId)\n return\n }\n\n // for updates, check if the folder is in the cache\n // no point updating a folder that does not exist for the user\n if (!cachedFolderIds.has(folderId)) return\n\n // check if the updated field data is in the summary (status, tags etc)\n // if it is, we can update the cache directly, otherwise we will need to fetch the full folder data later\n const patch = getSupportedEntityPatch(\n topicFieldMap[message.topic],\n message.summary,\n supportedFolderFields,\n )\n if (patch) summaryPatches.push({ folderId, ...patch })\n else {\n const field = topicFieldMap[message.topic]\n if (!field) return\n\n const fields = unsupportedFields.get(folderId) || new Set<string>()\n fields.add(field)\n unsupportedFields.set(folderId, fields)\n }\n })\n\n // DELETED: remove deleted folders from cache\n if (deletedIds.length) {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n draft.folders = draft.folders.filter((folder: any) => !deletedIds.includes(folder.id))\n })\n }\n\n // UPDATED: update cached folders with summary data from the message, if available\n if (summaryPatches.length) {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n summaryPatches.forEach(({ folderId, field, value }) => {\n const folder = draft.folders.find((item: any) => item.id === folderId)\n if (folder) folder[field] = value\n })\n })\n }\n\n // Fetch created and unsupported folders in one request.\n // This is to avoid overwhelming the API with too many requests at once, and to prevent potential performance issues in the frontend.\n const foldersToFetch = [...new Set([...createdIds, ...unsupportedFields.keys()])]\n if (foldersToFetch.length > MAX_FOLDER_UPDATE_REST_CALLS) return\n\n if (foldersToFetch.length) {\n await waitForRealtimeJitter()\n const fetchedFolders = await dispatch(\n graphqlFolders.endpoints.GetUpdatedAndNewFolders.initiate({\n projectName,\n folderIds: foldersToFetch,\n first: foldersToFetch.length,\n }),\n )\n .unwrap()\n .catch(() => [])\n\n const createdFolderIds = new Set(createdIds)\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n const fetchedById = new Map(\n fetchedFolders.filter(Boolean).map((folder: any) => [folder.id, folder] as const),\n )\n\n draft.folders.forEach((folder: any, index: number) => {\n const fetchedFolder = fetchedById.get(folder.id)\n if (!fetchedFolder) return\n\n if (createdFolderIds.has(folder.id)) {\n draft.folders[index] = { ...folder, ...fetchedFolder }\n } else {\n const fields = unsupportedFields.get(folder.id) || new Set<string>()\n fields.forEach((field) => {\n folder[field] = fetchedFolder[field]\n })\n }\n fetchedById.delete(folder.id)\n })\n\n fetchedById.forEach((folder, folderId) => {\n if (createdFolderIds.has(folderId)) draft.folders.push(folder)\n })\n })\n }\n }\n\n // create a batcher to process messages in batches\n const batcher = createRealtimeBatcher(\n batchProcessMessages,\n (message: any) => message.summary.entityId,\n )\n\n let unsubscribeThumbnails: (() => void) | undefined\n\n try {\n await cacheDataLoaded\n\n unsubscribeThumbnails = subscribeToThumbnailUpdates(\n (messages: ThumbnailUpdateMessage[]) => {\n updateCachedData((draft: any) => {\n if (!draft || !Array.isArray(draft.folders)) return\n messages.forEach((message) => {\n if (message.summary.entityType === 'folder' && message.summary.thumbnailHash) {\n const idx = draft.folders.findIndex(\n (f: any) => f.id === message.summary.entityId,\n )\n if (idx !== -1) {\n draft.folders[idx].thumbnailHash = message.summary.thumbnailHash\n }\n }\n })\n })\n },\n ['folder'],\n )\n\n const handlePubSub = (topic: string, message: any) => {\n const entityId = message?.summary?.entityId\n if (!entityId) return\n\n // add update to the batcher\n batcher.add({ ...message, topic })\n }\n\n topics.forEach((t) => tokens.push(PubSub.subscribe(t, handlePubSub)))\n } catch {\n // silent\n }\n\n await cacheEntryRemoved\n batcher.clear()\n tokens.forEach((t) => PubSub.unsubscribe(t))\n if (unsubscribeThumbnails) unsubscribeThumbnails()\n batcher.clear()\n },\n },\n },\n})\n\nexport const { useGetFolderHierarchyQuery, useGetFolderListQuery } = enhancedApi\nexport { enhancedApi as foldersQueries }\n"],"names":["graphqlFolders","gqlApi","response","node","parseJSONField","MAX_FOLDER_UPDATE_REST_CALLS","REALTIME_REST_CALL_LIMIT","enhancedApi","foldersApi","result","_e","projectName","id","args","cacheDataLoaded","cacheEntryRemoved","updateCachedData","getCacheEntry","dispatch","supportedFolderFields","topicFieldMap","topics","tokens","batchProcessMessages","messages","cachedFolderIds","cachedFolders","folder","deletedIds","createdIds","unsupportedFields","summaryPatches","message","folderId","patch","getSupportedEntityPatch","field","fields","draft","value","item","foldersToFetch","waitForRealtimeJitter","fetchedFolders","createdFolderIds","fetchedById","index","fetchedFolder","batcher","createRealtimeBatcher","unsubscribeThumbnails","subscribeToThumbnailUpdates","idx","f","handlePubSub","topic","t","PubSub","useGetFolderHierarchyQuery","useGetFolderListQuery"],"mappings":"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"}