diff --git a/frontend/src/app/appLayoutUtils.ts b/frontend/src/app/appLayoutUtils.ts index 784b107..eebdea1 100644 --- a/frontend/src/app/appLayoutUtils.ts +++ b/frontend/src/app/appLayoutUtils.ts @@ -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 diff --git a/frontend/src/desktop/hooks/usePreviewMetadata.ts b/frontend/src/desktop/hooks/usePreviewMetadata.ts index 3133fff..cbb9023 100644 --- a/frontend/src/desktop/hooks/usePreviewMetadata.ts +++ b/frontend/src/desktop/hooks/usePreviewMetadata.ts @@ -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); diff --git a/frontend/src/documents/DocumentThumbnailImage.tsx b/frontend/src/documents/DocumentThumbnailImage.tsx index 1e0679b..70548c9 100644 --- a/frontend/src/documents/DocumentThumbnailImage.tsx +++ b/frontend/src/documents/DocumentThumbnailImage.tsx @@ -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; diff --git a/frontend/src/hooks/useAssetNavigator.ts b/frontend/src/hooks/useAssetNavigator.ts index 02ad293..decf5de 100644 --- a/frontend/src/hooks/useAssetNavigator.ts +++ b/frontend/src/hooks/useAssetNavigator.ts @@ -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 | null; + url: string | null; + metadata: Record | null; }; interface UseAssetNavigatorOptions { @@ -72,13 +70,15 @@ export const useAssetNavigator = ({ }, [document, assetType, getAsset]); const view = useMemo( - () => createAssetView(asset) as unknown as AssetViewLike, + () => ({ + url: resolveAssetUrl(asset), + metadata: (asset?.metadata as Record | 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); diff --git a/frontend/src/utils/ocr.ts b/frontend/src/utils/ocr.ts index 0c6e4d6..c66b327 100644 --- a/frontend/src/utils/ocr.ts +++ b/frontend/src/utils/ocr.ts @@ -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; }