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