refactor
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { createAssetView } from '../../asset_manager';
|
||||
|
||||
const usePreviewMetadata = (documents, getDocumentAsset, ensureAssetUrl) => {
|
||||
const [metadataMap, setMetadataMap] = useState(() => new Map());
|
||||
|
||||
useEffect(() => {
|
||||
let cancelled = false;
|
||||
const docs = Array.isArray(documents) ? documents : [];
|
||||
if (!docs.length) {
|
||||
setMetadataMap(new Map());
|
||||
return () => {
|
||||
cancelled = true;
|
||||
};
|
||||
}
|
||||
|
||||
const fetchMetadataForDoc = async (doc) => {
|
||||
if (!doc?.id) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const docId = String(doc.id);
|
||||
const resolveAsset = (type) =>
|
||||
(typeof getDocumentAsset === 'function' ? getDocumentAsset(doc, type) : null);
|
||||
|
||||
let asset = resolveAsset('preview') || resolveAsset('thumbnail');
|
||||
let view = createAssetView(asset);
|
||||
let metadata = view.getPrimaryMetadata();
|
||||
|
||||
const hasDimensions = (meta) =>
|
||||
Number.isFinite(Number(meta?.width)) &&
|
||||
Number.isFinite(Number(meta?.height)) &&
|
||||
Number(meta.width) > 0 &&
|
||||
Number(meta.height) > 0;
|
||||
|
||||
if (!hasDimensions(metadata) && ensureAssetUrl && docId && asset?.id) {
|
||||
try {
|
||||
const ensured = await ensureAssetUrl(doc.id, asset, { start: 1, limit: 1 });
|
||||
if (ensured) {
|
||||
asset = ensured;
|
||||
view = createAssetView(asset);
|
||||
metadata = view.getPrimaryMetadata();
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('[desk] ensureDocumentSize metadata fetch failed', error);
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasDimensions(metadata)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
docId,
|
||||
width: Number(metadata.width),
|
||||
height: Number(metadata.height),
|
||||
};
|
||||
};
|
||||
|
||||
let mounted = true;
|
||||
(async () => {
|
||||
const entries = await Promise.all(docs.map(fetchMetadataForDoc));
|
||||
if (!mounted || cancelled) {
|
||||
return;
|
||||
}
|
||||
const next = new Map();
|
||||
entries.forEach((entry) => {
|
||||
if (entry && entry.docId) {
|
||||
next.set(entry.docId, entry);
|
||||
}
|
||||
});
|
||||
if (!cancelled) {
|
||||
setMetadataMap(next);
|
||||
}
|
||||
})();
|
||||
|
||||
return () => {
|
||||
cancelled = true;
|
||||
mounted = false;
|
||||
};
|
||||
}, [documents, getDocumentAsset, ensureAssetUrl]);
|
||||
|
||||
return metadataMap;
|
||||
};
|
||||
|
||||
export default usePreviewMetadata;
|
||||
Reference in New Issue
Block a user