diff --git a/packages/pluggableWidgets/file-uploader-web/src/components/FileEntry.tsx b/packages/pluggableWidgets/file-uploader-web/src/components/FileEntry.tsx index d49a8e2bb4..aa832c4ba4 100644 --- a/packages/pluggableWidgets/file-uploader-web/src/components/FileEntry.tsx +++ b/packages/pluggableWidgets/file-uploader-web/src/components/FileEntry.tsx @@ -34,6 +34,7 @@ export const FileEntryContainer = observer(({ store, actions }: FileEntryContain title={store.title} size={store.size} thumbnail={store.imagePreviewUrl} + onThumbnailError={store.onPreviewError} mimeType={store.mimeType} fileStatus={store.fileStatus} errorMessage={store.errorDescription} @@ -47,6 +48,7 @@ interface FileEntryProps { title: string; size: number; thumbnail?: string; + onThumbnailError?: () => void; mimeType: string; fileStatus: FileStatus; @@ -98,7 +100,12 @@ function FileEntry(props: FileEntryProps): ReactElement { })} > {props.thumbnail ? ( - + ) : ( )} diff --git a/packages/pluggableWidgets/file-uploader-web/src/stores/FileStore.ts b/packages/pluggableWidgets/file-uploader-web/src/stores/FileStore.ts index f6ed24f6de..0022b889ce 100644 --- a/packages/pluggableWidgets/file-uploader-web/src/stores/FileStore.ts +++ b/packages/pluggableWidgets/file-uploader-web/src/stores/FileStore.ts @@ -38,6 +38,7 @@ export class FileStore { private _objectItem?: ObjectItem = undefined; private _mxObject?: MxObject = undefined; private _thumbnailUrl?: string = undefined; + private _previewFellBack = false; private _rootStore: FileUploaderStore; key: number; @@ -136,7 +137,7 @@ export class FileStore { // upload content to object try { - await saveFile(this._objectItem, this._file!); + await saveFile(this._objectItem, this._file!, this._file!.name); await this.fetchMxObject(); runInAction(() => { @@ -218,6 +219,7 @@ export class FileStore { } this._thumbnailUrl = undefined; + this._previewFellBack = false; if (this._mxObject) { const url = await fetchImageThumbnail(this._mxObject); runInAction(() => { @@ -226,6 +228,20 @@ export class FileStore { } } + onPreviewError = (): void => { + // thumbnails are generated server-side and don't exist in OPFS for files + // uploaded while offline — fall back to the document itself + if (this._previewFellBack || !this._mxObject) { + return; + } + this._previewFellBack = true; + fetchDocumentUrl(this._mxObject).then(url => { + runInAction(() => { + this._thumbnailUrl = url; + }); + }); + }; + async getDownloadUrl(): Promise { if (this._mxObject) { return fetchDocumentUrl(this._mxObject); diff --git a/packages/pluggableWidgets/file-uploader-web/src/utils/mx-data.ts b/packages/pluggableWidgets/file-uploader-web/src/utils/mx-data.ts index d07f95ab76..58cc76c9c0 100644 --- a/packages/pluggableWidgets/file-uploader-web/src/utils/mx-data.ts +++ b/packages/pluggableWidgets/file-uploader-web/src/utils/mx-data.ts @@ -8,9 +8,9 @@ export type MxObject = { get2(name: string): string | Big | boolean; }; -export function saveFile(item: ObjectItem, fileToUpload: Blob): Promise { +export function saveFile(item: ObjectItem, fileToUpload: Blob, fileName: string | null = null): Promise { return new Promise((resolve, reject) => { - (window as any).mx.data.saveDocument(item.id, null, {}, fileToUpload, resolve, reject); + (window as any).mx.data.saveDocument(item.id, fileName, {}, fileToUpload, resolve, reject); }); } @@ -40,11 +40,21 @@ export function fetchMxObject(objectItem: ObjectItem): Promise { } export async function fetchDocumentUrl(mxObject: MxObject): Promise { - return (window as any).mx.data.getDocumentUrl(mxObject.getGuid(), mxObject.get("changedDate"), false); + return (window as any).mx.data.getDocumentUrl( + mxObject.getGuid(), + mxObject.get("changedDate"), + false, + mxObject.get2("Name")?.toString() + ); } export async function fetchImageThumbnail(mxObject: MxObject): Promise { - const docUrl = await (window as any).mx.data.getDocumentUrl(mxObject.getGuid(), mxObject.get("changedDate"), true); + const docUrl = await (window as any).mx.data.getDocumentUrl( + mxObject.getGuid(), + mxObject.get("changedDate"), + true, + mxObject.get2("Name")?.toString() + ); return new Promise((resolve, reject) => { (window as any).mx.data.getImageUrl(docUrl, resolve, reject); });