fix
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user