Skip to content

Commit 652f34e

Browse files
gjulivanyordan-st
authored andcommitted
chore: allow passing on message on document status
1 parent be16c03 commit 652f34e

File tree

7 files changed

+55
-23
lines changed

7 files changed

+55
-23
lines changed

packages/pluggableWidgets/document-viewer-web/components/DocxViewer.tsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { parseAsync, renderDocument, WordDocument, Options } from "docx-preview";
1+
import { Options, parseAsync, renderDocument, WordDocument } from "docx-preview";
22
import { createElement, useCallback, useEffect, useRef } from "react";
33
import { BaseControlViewer } from "./BaseViewer";
44
import { DocRendererElement, DocumentRendererProps, DocumentStatus } from "./documentRenderer";
@@ -24,16 +24,25 @@ const DocxViewer: DocRendererElement = (props: DocumentRendererProps) => {
2424
const styleContainer = document.createElement("div");
2525
renderDocument(wordDocument, localRef.current, styleContainer, DOC_CONFIG).catch(
2626
(_error: any) => {
27-
setDocumentStatus(DocumentStatus.error);
27+
setDocumentStatus({
28+
status: DocumentStatus.error,
29+
message: "Failed to load DOCX document"
30+
});
2831
}
2932
);
3033
}
3134
})
3235
.catch((_error: any) => {
33-
setDocumentStatus(DocumentStatus.error);
36+
setDocumentStatus({
37+
status: DocumentStatus.error,
38+
message: "Failed to load DOCX document"
39+
});
3440
});
3541
} catch (_error: any) {
36-
setDocumentStatus(DocumentStatus.error);
42+
setDocumentStatus({
43+
status: DocumentStatus.error,
44+
message: "Failed to load DOCX document"
45+
});
3746
}
3847
},
3948
[setDocumentStatus]

packages/pluggableWidgets/document-viewer-web/components/ErrorViewer.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import BaseViewer from "./BaseViewer";
44
import { downloadFile } from "../utils/helpers";
55

66
const ErrorViewer: DocRendererElement = (props: DocumentRendererProps) => {
7-
const { file } = props;
7+
const { file, documentStatus } = props;
88
const onDownloadClick = useCallback(() => {
99
downloadFile(file.value?.uri);
1010
}, [file]);
@@ -22,7 +22,7 @@ const ErrorViewer: DocRendererElement = (props: DocumentRendererProps) => {
2222
}
2323
>
2424
{file.status === "available" ? (
25-
<div>{"Unsupported document type"}</div>
25+
<div>{documentStatus.message}</div>
2626
) : (
2727
<div className="widget-document-viewer-loading"></div>
2828
)}

packages/pluggableWidgets/document-viewer-web/components/ExcelViewer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const ExcelViewer: DocRendererElement = (props: DocumentRendererProps) => {
1515
const html = utils.sheet_to_html(sheet);
1616
setXlsxHtml(html);
1717
} catch (_error) {
18-
setDocumentStatus(DocumentStatus.error);
18+
setDocumentStatus({ status: DocumentStatus.error, message: "Failed to load XLSX document" });
1919
}
2020
},
2121
[setDocumentStatus]

packages/pluggableWidgets/document-viewer-web/components/PDFViewer.tsx

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { downloadFile } from "../utils/helpers";
66
import { useZoomScale } from "../utils/useZoomScale";
77
import BaseViewer from "./BaseViewer";
88
import { DocRendererElement, DocumentRendererProps, DocumentStatus } from "./documentRenderer";
9-
9+
import { If } from "@mendix/widget-plugin-component-kit/If";
1010
const options = {
1111
cMapUrl: "/widgets/com/mendix/shared/pdfjs/cmaps/",
1212
standardFontDataUrl: "/widgets/com/mendix/shared/pdfjs/standard_fonts"
@@ -21,10 +21,16 @@ const PDFViewer: DocRendererElement = (props: DocumentRendererProps) => {
2121
} else {
2222
return `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;
2323
}
24+
} else if (pdfjsWorkerUrl?.status === "unavailable") {
25+
setDocumentStatus({
26+
status: DocumentStatus.error,
27+
message: "Failed to load PDF document : pdfjsWorker unavailable"
28+
});
29+
return ""; // no worker;
2430
} else {
2531
return ""; // no worker;
2632
}
27-
}, [pdfjsWorkerUrl]);
33+
}, [pdfjsWorkerUrl, setDocumentStatus]);
2834

2935
const [numberOfPages, setNumberOfPages] = useState<number>(1);
3036
const { zoomLevel, zoomIn, zoomOut, reset } = useZoomScale();
@@ -105,20 +111,21 @@ const PDFViewer: DocRendererElement = (props: DocumentRendererProps) => {
105111
</Fragment>
106112
}
107113
>
108-
{!!pdfUrl && pdfjsWorkerUrl?.status === "available" ? (
114+
<If condition={!!pdfUrl && pdfjsWorkerUrl?.status === "available"}>
109115
<Document
110116
file={pdfUrl}
111117
options={options}
112118
onLoadSuccess={onDocumentLoadSuccess}
113-
onLoadError={() => setDocumentStatus(DocumentStatus.error)}
119+
onLoadError={() =>
120+
setDocumentStatus({
121+
status: DocumentStatus.error,
122+
message: "Failed to load PDF document"
123+
})
124+
}
114125
>
115126
<Page pageNumber={currentPage} scale={zoomLevel} />
116127
</Document>
117-
) : pdfjsWorkerUrl?.status === "unavailable" ? (
118-
<div>{"PDF worker unavailable"}</div>
119-
) : (
120-
<div className="widget-document-viewer-loading"></div>
121-
)}
128+
</If>
122129
</BaseViewer>
123130
);
124131
};

packages/pluggableWidgets/document-viewer-web/components/TextViewer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const TextViewer: DocRendererElement = (props: DocumentRendererProps) => {
1616
setText(response);
1717
})
1818
.catch(() => {
19-
setDocumentStatus(DocumentStatus.error);
19+
setDocumentStatus({ status: DocumentStatus.error, message: "Failed to load text document" });
2020
});
2121
}
2222

packages/pluggableWidgets/document-viewer-web/components/documentRenderer.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,14 @@ export declare const enum DocumentStatus {
77
loading = "loading"
88
}
99

10+
export interface DocumentStatusEvent {
11+
status: DocumentStatus;
12+
message?: string;
13+
}
14+
1015
export interface DocumentRendererProps extends DocumentViewerContainerProps {
11-
setDocumentStatus: (status: DocumentStatus) => void;
16+
setDocumentStatus: (status: DocumentStatusEvent) => void;
17+
documentStatus: DocumentStatusEvent;
1218
}
1319

1420
export interface DocRendererElement extends FC<DocumentRendererProps> {

packages/pluggableWidgets/document-viewer-web/utils/useRendererSelector.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import { useEffect, useState } from "react";
22

33
import { DocumentRenderers } from "../components";
4-
import { DocRendererElement, DocumentRendererProps, DocumentStatus } from "../components/documentRenderer";
4+
import {
5+
DocRendererElement,
6+
DocumentRendererProps,
7+
DocumentStatus,
8+
DocumentStatusEvent
9+
} from "../components/documentRenderer";
510
import ErrorViewer from "../components/ErrorViewer";
611
import { DocumentViewerContainerProps } from "../typings/DocumentViewerProps";
712
interface DocumentRenderer {
@@ -11,7 +16,9 @@ interface DocumentRenderer {
1116

1217
export function useRendererSelector(props: DocumentViewerContainerProps): DocumentRenderer {
1318
const { file } = props;
14-
const [documentStatus, setDocumentStatus] = useState<DocumentStatus>(DocumentStatus.loading);
19+
const [documentStatus, setDocumentStatus] = useState<DocumentStatusEvent>({
20+
status: DocumentStatus.loading
21+
});
1522
const [component, setComponent] = useState<DocRendererElement>(() => ErrorViewer);
1623
useEffect(() => {
1724
const controller = new AbortController();
@@ -44,7 +51,10 @@ export function useRendererSelector(props: DocumentViewerContainerProps): Docume
4451
if (selectedRenderer.length > 0) {
4552
setComponent(() => selectedRenderer[0]);
4653
} else {
47-
setDocumentStatus(DocumentStatus.error);
54+
setDocumentStatus({
55+
status: DocumentStatus.error,
56+
message: "Unsupported document type"
57+
});
4858
}
4959
}
5060
});
@@ -56,10 +66,10 @@ export function useRendererSelector(props: DocumentViewerContainerProps): Docume
5666
}, [file, file?.status, file?.value?.uri]);
5767

5868
useEffect(() => {
59-
if (documentStatus === DocumentStatus.error) {
69+
if (documentStatus.status === DocumentStatus.error) {
6070
setComponent(() => ErrorViewer);
6171
}
6272
}, [documentStatus]);
6373

64-
return { CurrentRenderer: component, props: { ...props, setDocumentStatus } };
74+
return { CurrentRenderer: component, props: { ...props, setDocumentStatus, documentStatus } };
6575
}

0 commit comments

Comments
 (0)