@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.
- package/CHANGELOG.md +13 -0
- package/README.md +1 -1
- package/dist/features/explorer/adapters/inbound/Explorer.d.ts.map +1 -1
- package/dist/features/explorer/adapters/inbound/Explorer.js +43 -2
- package/dist/features/explorer/adapters/inbound/Explorer.js.map +1 -1
- package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.d.ts +8 -0
- package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.d.ts.map +1 -0
- package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.js +9 -0
- package/dist/features/explorer/application/shouldDispatchExplorerPageRequest.js.map +1 -0
- package/dist/features/explorer/application/shouldRequestExplorerPage.d.ts +4 -0
- package/dist/features/explorer/application/shouldRequestExplorerPage.d.ts.map +1 -0
- package/dist/features/explorer/application/shouldRequestExplorerPage.js +14 -0
- package/dist/features/explorer/application/shouldRequestExplorerPage.js.map +1 -0
- package/dist/features/explorer/meta.d.ts +110 -0
- package/dist/features/explorer/meta.d.ts.map +1 -1
- package/dist/features/explorer/meta.js +25 -0
- package/dist/features/explorer/meta.js.map +1 -1
- package/dist/features/explorer/public.d.ts +1 -1
- package/dist/features/explorer/public.d.ts.map +1 -1
- package/dist/features/explorer/public.js.map +1 -1
- package/dist/types/explorer.d.ts +28 -0
- package/dist/types/explorer.d.ts.map +1 -1
- package/dist/types/explorer.js.map +1 -1
- package/package.json +5 -5
- package/src/capabilities/index.test.ts +10 -6
- package/src/features/explorer/adapters/inbound/Explorer.tsx +82 -13
- package/src/features/explorer/application/shouldDispatchExplorerPageRequest.test.ts +43 -0
- package/src/features/explorer/application/shouldDispatchExplorerPageRequest.ts +18 -0
- package/src/features/explorer/application/shouldRequestExplorerPage.test.ts +93 -0
- package/src/features/explorer/application/shouldRequestExplorerPage.ts +26 -0
- package/src/features/explorer/meta.test.ts +55 -0
- package/src/features/explorer/meta.ts +25 -0
- package/src/features/explorer/public.ts +2 -0
- package/src/types/explorer.ts +30 -0
- package/web-dist/chunks/{Accordion-fmn31fgf.js → Accordion-kkr7xfh2.js} +88 -12
- package/web-dist/components/explorer/Explorer.js +1 -1
- package/web-dist/components/file-explorer/FileExplorer.js +1 -1
- package/web-dist/components/media-explorer/MediaExplorer.js +1 -1
- package/web-dist/components/uploader/Uploader.js +1 -1
- 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__ */
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
37
|
+
} from "../../chunks/Accordion-kkr7xfh2.js";
|
|
38
38
|
import"../../chunks/Accordion-ndf3jqhb.js";
|
|
39
39
|
import"../../chunks/Accordion-45nc4bte.js";
|
|
40
40
|
import {
|
package/web-dist/manifest.json
CHANGED
|
@@ -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",
|