@ankhorage/zora 25.1.0 → 25.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +1 -1
  3. package/dist/features/explorer/adapters/inbound/Explorer.d.ts.map +1 -1
  4. package/dist/features/explorer/adapters/inbound/Explorer.js +43 -2
  5. package/dist/features/explorer/adapters/inbound/Explorer.js.map +1 -1
  6. package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.d.ts +8 -0
  7. package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.d.ts.map +1 -0
  8. package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.js +9 -0
  9. package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.js.map +1 -0
  10. package/dist/features/explorer/application/shouldRequestExplorerPage.d.ts +4 -0
  11. package/dist/features/explorer/application/shouldRequestExplorerPage.d.ts.map +1 -0
  12. package/dist/features/explorer/application/shouldRequestExplorerPage.js +14 -0
  13. package/dist/features/explorer/application/shouldRequestExplorerPage.js.map +1 -0
  14. package/dist/features/explorer/meta.d.ts +110 -0
  15. package/dist/features/explorer/meta.d.ts.map +1 -1
  16. package/dist/features/explorer/meta.js +25 -0
  17. package/dist/features/explorer/meta.js.map +1 -1
  18. package/dist/features/explorer/public.d.ts +1 -1
  19. package/dist/features/explorer/public.d.ts.map +1 -1
  20. package/dist/features/explorer/public.js.map +1 -1
  21. package/dist/types/explorer.d.ts +28 -0
  22. package/dist/types/explorer.d.ts.map +1 -1
  23. package/dist/types/explorer.js.map +1 -1
  24. package/package.json +5 -5
  25. package/src/capabilities/index.test.ts +10 -6
  26. package/src/features/explorer/adapters/inbound/Explorer.tsx +82 -13
  27. package/src/features/explorer/application/shouldDispatchExplorerPageRequest.test.ts +43 -0
  28. package/src/features/explorer/application/shouldDispatchExplorerPageRequest.ts +18 -0
  29. package/src/features/explorer/application/shouldRequestExplorerPage.test.ts +93 -0
  30. package/src/features/explorer/application/shouldRequestExplorerPage.ts +26 -0
  31. package/src/features/explorer/meta.test.ts +55 -0
  32. package/src/features/explorer/meta.ts +25 -0
  33. package/src/features/explorer/public.ts +2 -0
  34. package/src/types/explorer.ts +30 -0
  35. package/web-dist/chunks/{Accordion-fmn31fgf.js → Accordion-kkr7xfh2.js} +88 -12
  36. package/web-dist/components/explorer/Explorer.js +1 -1
  37. package/web-dist/components/file-explorer/FileExplorer.js +1 -1
  38. package/web-dist/components/media-explorer/MediaExplorer.js +1 -1
  39. package/web-dist/components/uploader/Uploader.js +1 -1
  40. package/web-dist/manifest.json +4 -4
@@ -49,6 +49,22 @@ function resolveExplorerSelection(orderedIds, currentIds, targetId, anchorId, in
49
49
  return orderedIds.slice(start, end + 1);
50
50
  }
51
51
 
52
+ // src/features/explorer/application/shouldDispatchExplorerPageRequest.ts
53
+ function shouldDispatchExplorerPageRequest(previous, next) {
54
+ if (previous === null)
55
+ return true;
56
+ return previous.collectionId !== next.collectionId || previous.loadedItemCount !== next.loadedItemCount || previous.retryToken !== next.retryToken;
57
+ }
58
+
59
+ // src/features/explorer/application/shouldRequestExplorerPage.ts
60
+ function shouldRequestExplorerPage(itemIds, visibleIds, hasMore, loadingMore, loading, errorText, permissionStatus, threshold = 12) {
61
+ if (!hasMore || loadingMore || loading || errorText !== undefined || permissionStatus !== "granted" && permissionStatus !== "limited" || visibleIds.length === 0) {
62
+ return false;
63
+ }
64
+ const firstPagingIndex = Math.max(0, itemIds.length - threshold);
65
+ return visibleIds.some((id) => itemIds.indexOf(id) >= firstPagingIndex);
66
+ }
67
+
52
68
  // src/features/explorer/adapters/inbound/ExplorerKeyboardProxy.web.tsx
53
69
  import { jsx } from "react/jsx-runtime";
54
70
  function ExplorerKeyboardProxy({ children, onKeyDown }) {
@@ -169,6 +185,14 @@ function ExplorerInner({
169
185
  tileSize = 120,
170
186
  zoom = 1,
171
187
  loading = false,
188
+ hasMore = false,
189
+ loadingMore = false,
190
+ pagingCollectionId,
191
+ pagingRetryToken,
192
+ onLoadMore,
193
+ permissionStatus = "granted",
194
+ permissionText,
195
+ onRequestPermission,
172
196
  errorText,
173
197
  emptyText = "No items",
174
198
  disabled = false,
@@ -181,11 +205,36 @@ function ExplorerInner({
181
205
  const anchorId = React2.useRef(null);
182
206
  const [columns, setColumns] = React2.useState(1);
183
207
  const [visibleIds, setVisibleIds] = React2.useState([]);
208
+ const lastPageRequestRef = React2.useRef(null);
184
209
  const effectiveSelectedIds = selectedIds ?? internalSelectedIds;
185
210
  const itemLookup = React2.useMemo(() => new Map(items.map((item) => [item.id, item])), [items]);
186
211
  const ids = React2.useMemo(() => items.filter((item) => !item.disabled).map((item) => item.id), [items]);
187
212
  const selected = new Set(effectiveSelectedIds);
188
213
  const passive = interactionPolicy === "passive" || disabled || readOnly;
214
+ React2.useEffect(() => {
215
+ const request = {
216
+ collectionId: pagingCollectionId,
217
+ loadedItemCount: items.length,
218
+ retryToken: pagingRetryToken
219
+ };
220
+ if (!onLoadMore || !shouldDispatchExplorerPageRequest(lastPageRequestRef.current, request) || !shouldRequestExplorerPage(ids, visibleIds, hasMore, loadingMore, loading, errorText, permissionStatus)) {
221
+ return;
222
+ }
223
+ lastPageRequestRef.current = request;
224
+ onLoadMore({ loadedItemCount: items.length });
225
+ }, [
226
+ errorText,
227
+ hasMore,
228
+ ids,
229
+ items.length,
230
+ loading,
231
+ loadingMore,
232
+ onLoadMore,
233
+ pagingCollectionId,
234
+ pagingRetryToken,
235
+ permissionStatus,
236
+ visibleIds
237
+ ]);
189
238
  const select = (item, intent) => {
190
239
  if (passive || item.disabled)
191
240
  return;
@@ -261,6 +310,23 @@ function ExplorerInner({
261
310
  })
262
311
  });
263
312
  };
313
+ if (permissionStatus === "denied" || permissionStatus === "unavailable") {
314
+ return /* @__PURE__ */ jsxs(import_react_native.View, {
315
+ testID,
316
+ children: [
317
+ /* @__PURE__ */ jsx2(Text3, {
318
+ children: permissionText ?? "This collection is unavailable without permission."
319
+ }),
320
+ permissionStatus === "denied" && onRequestPermission ? /* @__PURE__ */ jsx2(import_react_native.Pressable, {
321
+ accessibilityRole: "button",
322
+ onPress: onRequestPermission,
323
+ children: /* @__PURE__ */ jsx2(Text3, {
324
+ children: "Grant access"
325
+ })
326
+ }) : null
327
+ ]
328
+ });
329
+ }
264
330
  if (errorText)
265
331
  return /* @__PURE__ */ jsx2(Text3, {
266
332
  testID,
@@ -276,18 +342,28 @@ function ExplorerInner({
276
342
  testID,
277
343
  children: emptyText
278
344
  });
279
- return /* @__PURE__ */ jsx2(TileGrid2, {
280
- focusedItemId: keyboard.focusedId ?? undefined,
281
- height,
282
- interactionPolicy,
283
- onColumnsChange: setColumns,
284
- onVisibleItemIdsChange: setVisibleIds,
285
- items,
286
- renderItem: renderTile,
287
- testID,
288
- tileSize,
289
- width,
290
- zoom
345
+ return /* @__PURE__ */ jsxs(import_react_native.View, {
346
+ children: [
347
+ permissionStatus === "limited" ? /* @__PURE__ */ jsx2(Text3, {
348
+ children: permissionText ?? "Showing the media you have allowed."
349
+ }) : null,
350
+ /* @__PURE__ */ jsx2(TileGrid2, {
351
+ focusedItemId: keyboard.focusedId ?? undefined,
352
+ height,
353
+ interactionPolicy,
354
+ onColumnsChange: setColumns,
355
+ onVisibleItemIdsChange: setVisibleIds,
356
+ items,
357
+ renderItem: renderTile,
358
+ testID,
359
+ tileSize,
360
+ width,
361
+ zoom
362
+ }),
363
+ loadingMore ? /* @__PURE__ */ jsx2(Text3, {
364
+ children: "Loading more…"
365
+ }) : null
366
+ ]
291
367
  });
292
368
  }
293
369
  function resolveExplorerPressIntent(event) {
@@ -14,7 +14,7 @@ import {
14
14
  Explorer2,
15
15
  FileExplorer2,
16
16
  MediaExplorer2
17
- } from "../../chunks/Accordion-fmn31fgf.js";
17
+ } from "../../chunks/Accordion-kkr7xfh2.js";
18
18
  import"../../chunks/Accordion-bff0p3x4.js";
19
19
  import"../../chunks/Accordion-srjya6dz.js";
20
20
  import"../../chunks/Accordion-184r2r82.js";
@@ -14,7 +14,7 @@ import {
14
14
  Explorer2,
15
15
  FileExplorer2,
16
16
  MediaExplorer2
17
- } from "../../chunks/Accordion-fmn31fgf.js";
17
+ } from "../../chunks/Accordion-kkr7xfh2.js";
18
18
  import"../../chunks/Accordion-bff0p3x4.js";
19
19
  import"../../chunks/Accordion-srjya6dz.js";
20
20
  import"../../chunks/Accordion-184r2r82.js";
@@ -14,7 +14,7 @@ import {
14
14
  Explorer2,
15
15
  FileExplorer2,
16
16
  MediaExplorer2
17
- } from "../../chunks/Accordion-fmn31fgf.js";
17
+ } from "../../chunks/Accordion-kkr7xfh2.js";
18
18
  import"../../chunks/Accordion-bff0p3x4.js";
19
19
  import"../../chunks/Accordion-srjya6dz.js";
20
20
  import"../../chunks/Accordion-184r2r82.js";
@@ -34,7 +34,7 @@ import {
34
34
  } from "../../chunks/Accordion-mej71qnw.js";
35
35
  import {
36
36
  Explorer2
37
- } from "../../chunks/Accordion-fmn31fgf.js";
37
+ } from "../../chunks/Accordion-kkr7xfh2.js";
38
38
  import"../../chunks/Accordion-ndf3jqhb.js";
39
39
  import"../../chunks/Accordion-45nc4bte.js";
40
40
  import {
@@ -1235,8 +1235,8 @@
1235
1235
  "chunks/Accordion-bff0p3x4.js",
1236
1236
  "chunks/Accordion-bfzeab9x.js",
1237
1237
  "chunks/Accordion-f0jsd9f9.js",
1238
- "chunks/Accordion-fmn31fgf.js",
1239
1238
  "chunks/Accordion-fre84yaq.js",
1239
+ "chunks/Accordion-kkr7xfh2.js",
1240
1240
  "chunks/Accordion-mej71qnw.js",
1241
1241
  "chunks/Accordion-n4et7etk.js",
1242
1242
  "chunks/Accordion-nh0cs9hq.js",
@@ -1300,8 +1300,8 @@
1300
1300
  "chunks/Accordion-bff0p3x4.js",
1301
1301
  "chunks/Accordion-bfzeab9x.js",
1302
1302
  "chunks/Accordion-f0jsd9f9.js",
1303
- "chunks/Accordion-fmn31fgf.js",
1304
1303
  "chunks/Accordion-fre84yaq.js",
1304
+ "chunks/Accordion-kkr7xfh2.js",
1305
1305
  "chunks/Accordion-mej71qnw.js",
1306
1306
  "chunks/Accordion-n4et7etk.js",
1307
1307
  "chunks/Accordion-nh0cs9hq.js",
@@ -2067,8 +2067,8 @@
2067
2067
  "chunks/Accordion-bff0p3x4.js",
2068
2068
  "chunks/Accordion-bfzeab9x.js",
2069
2069
  "chunks/Accordion-f0jsd9f9.js",
2070
- "chunks/Accordion-fmn31fgf.js",
2071
2070
  "chunks/Accordion-fre84yaq.js",
2071
+ "chunks/Accordion-kkr7xfh2.js",
2072
2072
  "chunks/Accordion-mej71qnw.js",
2073
2073
  "chunks/Accordion-n4et7etk.js",
2074
2074
  "chunks/Accordion-nh0cs9hq.js",
@@ -3867,8 +3867,8 @@
3867
3867
  "chunks/Accordion-eqvdv7tt.js",
3868
3868
  "chunks/Accordion-f0jsd9f9.js",
3869
3869
  "chunks/Accordion-fkc50r9z.js",
3870
- "chunks/Accordion-fmn31fgf.js",
3871
3870
  "chunks/Accordion-fre84yaq.js",
3871
+ "chunks/Accordion-kkr7xfh2.js",
3872
3872
  "chunks/Accordion-mej71qnw.js",
3873
3873
  "chunks/Accordion-mh67wb34.js",
3874
3874
  "chunks/Accordion-n4et7etk.js",