This commit is contained in:
2025-11-22 01:17:25 +01:00
parent ab3faad6af
commit 7bee56b960
5 changed files with 31 additions and 38 deletions
+4 -6
View File
@@ -1,4 +1,4 @@
import { createAssetView, resolveAssetExpiresAt } from '../asset_manager';
import { resolveAssetExpiresAt, resolveAssetUrl } from '../asset_manager';
export const ASSET_PRESIGN_TTL_MS = 240 * 1000; // backend issues 5 min tokens; refresh slightly early
export const DEFAULT_FOLDER_NAME = 'Documents';
@@ -41,15 +41,13 @@ export const hasFiles = (event) =>
const isAssetEquivalent = (lhs, rhs) => {
if (!lhs || !rhs) return false;
const lhsView = createAssetView(lhs);
const rhsView = createAssetView(rhs);
const lhsPrimaryMetadata = lhsView.getPrimaryMetadata() || lhs?.metadata;
const rhsPrimaryMetadata = rhsView.getPrimaryMetadata() || rhs?.metadata;
const lhsPrimaryMetadata = lhs?.metadata;
const rhsPrimaryMetadata = rhs?.metadata;
const lhsExpiresAt = resolveAssetExpiresAt(lhs);
const rhsExpiresAt = resolveAssetExpiresAt(rhs);
return (
lhs.id === rhs.id
&& lhs.url === rhs.url
&& resolveAssetUrl(lhs) === resolveAssetUrl(rhs)
&& lhsExpiresAt === rhsExpiresAt
&& lhsPrimaryMetadata?.width === rhsPrimaryMetadata?.width
&& lhsPrimaryMetadata?.height === rhsPrimaryMetadata?.height
@@ -1,6 +1,4 @@
import { useEffect, useState } from 'react';
import { createAssetView } from '../../asset_manager';
interface DocumentLike {
id?: string | number;
current_version?: unknown;
@@ -47,8 +45,7 @@ const usePreviewMetadata = (
const resolveAsset = (type: string) => getDocumentAsset?.(doc, type) ?? null;
let asset = resolveAsset('preview') || resolveAsset('thumbnail');
let view = createAssetView(asset);
let metadata = view.getPrimaryMetadata();
let metadata = (asset?.metadata as { width?: number; height?: number } | null) || null;
const hasDimensions = (meta: { width?: number | string; height?: number | string } | null) =>
Number.isFinite(Number(meta?.width)) &&
@@ -58,11 +55,10 @@ const usePreviewMetadata = (
if (!hasDimensions(metadata) && ensureAssetUrl && docId && asset?.id) {
try {
const ensured = await ensureAssetUrl(doc.id, asset, { force: true });
const ensured = await ensureAssetUrl(doc.id, asset);
if (ensured) {
asset = ensured;
view = createAssetView(asset);
metadata = view.getPrimaryMetadata();
metadata = (asset?.metadata as { width?: number; height?: number } | null) || null;
}
} catch (error) {
console.warn('[desk] ensureDocumentSize metadata fetch failed', error);
@@ -3,7 +3,7 @@ import type { CSSProperties, JSX, MutableRefObject } from 'react';
import {
getAssetFromVersion,
resolveDocumentAssetUrl,
createAssetView,
resolveAssetUrl,
} from '../asset_manager';
import type {
DocumentLike as AssetManagerDocumentLike,
@@ -101,13 +101,13 @@ const DocumentThumbnailImage = ({
() => getAssetFromVersion(document?.current_version, 'thumbnail'),
[document?.current_version],
);
const thumbnailView = useMemo(() => createAssetView(thumbnailAsset), [thumbnailAsset]);
const primaryMetadata = thumbnailView.getPrimaryMetadata() || {};
const assetWidth = Number(primaryMetadata?.width);
const assetHeight = Number(primaryMetadata?.height);
const thumbnailMetadata = (thumbnailAsset?.metadata as { width?: number; height?: number } | null) || null;
const assetWidth = thumbnailMetadata?.width;
const assetHeight = thumbnailMetadata?.height;
const dimensions = useMemo(() => {
if (!Number.isFinite(assetWidth) || assetWidth <= 0 || !Number.isFinite(assetHeight) || assetHeight <= 0) {
const hasDimensions = typeof assetWidth === 'number' && assetWidth > 0 && typeof assetHeight === 'number' && assetHeight > 0;
if (!hasDimensions) {
return { width: resolvedMaxSize, height: resolvedMaxSize };
}
const scale = Math.min(1, resolvedMaxSize / assetWidth, resolvedMaxSize / assetHeight);
@@ -136,8 +136,8 @@ const DocumentThumbnailImage = ({
if (getDocumentAsset) {
options.getAsset = getDocumentAsset;
}
return resolveDocumentAssetUrl(document, 'thumbnail', options);
}, [document, ensureAssetUrl, getDocumentAsset, isVisible]);
return resolveDocumentAssetUrl(document, 'thumbnail', options) || resolveAssetUrl(thumbnailAsset);
}, [document, ensureAssetUrl, getDocumentAsset, isVisible, thumbnailAsset]);
const pageCount = getPageCount(document);
const showMultiPageBadge = Number.isFinite(pageCount) && pageCount > 1;
@@ -147,11 +147,11 @@ const DocumentThumbnailImage = ({
}
const aspectRatio = useMemo(() => {
if (Number.isFinite(assetWidth) && Number.isFinite(assetHeight) && assetWidth > 0 && assetHeight > 0) {
return assetWidth / assetHeight;
if (dimensions.width > 0 && dimensions.height > 0) {
return dimensions.width / dimensions.height;
}
return null;
}, [assetWidth, assetHeight]);
}, [dimensions.height, dimensions.width]);
useEffect(() => {
const node = visibilityRef.current;
+9 -9
View File
@@ -1,5 +1,5 @@
import { useEffect, useMemo, useState } from 'react';
import { createAssetView } from '../asset_manager';
import { resolveAssetUrl } from '../asset_manager';
type Identifier = string | number;
@@ -33,10 +33,8 @@ type EnsureAssetUrl = (
type GetAsset = (document: DocumentLike, assetType: string) => AssetLike | null;
type AssetViewLike = {
getObject: (ordinal?: number) => AssetObject | null;
getObjects: () => AssetObject[];
getPrimaryUrl: () => string | null;
getPrimaryMetadata: () => Record<string, unknown> | null;
url: string | null;
metadata: Record<string, unknown> | null;
};
interface UseAssetNavigatorOptions {
@@ -72,13 +70,15 @@ export const useAssetNavigator = ({
}, [document, assetType, getAsset]);
const view = useMemo<AssetViewLike>(
() => createAssetView(asset) as unknown as AssetViewLike,
() => ({
url: resolveAssetUrl(asset),
metadata: (asset?.metadata as Record<string, unknown> | null) || null,
}),
[asset],
);
const currentObject = view.getObject(1) || view.getObjects()[0] || null;
const currentUrl = currentObject?.url ?? view.getPrimaryUrl() ?? null;
const currentMetadata = (currentObject?.metadata ?? view.getPrimaryMetadata()) || null;
const currentUrl = view.url || null;
const currentMetadata = view.metadata || null;
const [isLoading, setIsLoading] = useState(false);
+4 -5
View File
@@ -1,4 +1,4 @@
import { createAssetView, resolveDocumentAssetUrl } from '../asset_manager';
import { resolveDocumentAssetUrl, resolveAssetUrl } from '../asset_manager';
import type {
DocumentLike as AssetManagerDocumentLike,
DocumentVersionLike,
@@ -59,8 +59,8 @@ export async function resolveOcrTextUrl({
return null;
}
const baseView = createAssetView(asset);
const hasUrl = Boolean(baseView.getPrimaryUrl());
const baseUrl = resolveAssetUrl(asset);
const hasUrl = Boolean(baseUrl);
let entry: AssetLike = asset;
if (ensureAssetUrl) {
@@ -71,8 +71,7 @@ export async function resolveOcrTextUrl({
}
}
const ensuredView = createAssetView(entry);
const directUrl = ensuredView.getPrimaryUrl();
const directUrl = resolveAssetUrl(entry);
if (directUrl) {
return directUrl;
}