* docs: README - styled component example is missing a closing bracket after DocViewer
Fixes #31

* feat: Internal ImageProxyRenderer created, that can be used by all other Image renderers, and styled by them

* feat: BMP Image renderer added

* Create TIFF renderer
Fixes #33

* MSGRenderer - Use safe iframe for msg content display (#39)

* docs: README - styled component example is missing a closing bracket after DocViewer
Fixes #31

* feat: Internal ImageProxyRenderer created, that can be used by all other Image renderers, and styled by them

* feat: BMP Image renderer added

* Create TIFF renderer
Fixes #33

* updated CHANGELOG.md

* 0.0.40

* MSGRenderer - Use safe iframe for msg content display
Fixes #38

* Create HTMLRenderer
Fixes #40
This commit is contained in:
Matthew Mogford 2020-09-25 16:35:43 +01:00 committed by GitHub
parent eabc5dce4b
commit fd3e79dc83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 86 additions and 6 deletions

View File

@ -28,14 +28,18 @@
| Extension | MIME Type | Available | | Extension | MIME Type | Available |
| --------- | ---------------------------------------------------------------------------------- | --------- | | --------- | ---------------------------------------------------------------------------------- | --------- |
| bmp | image/bmp | `✓` |
| doc | application/msword | `✓` | | doc | application/msword | `✓` |
| docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document | `✓` | | docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document | `✓` |
| htm | text/htm | `✓` |
| html | text/html | `✓` |
| jpg | image/jpg | `✓` | | jpg | image/jpg | `✓` |
| jpeg | image/jpeg | `✓` | | jpeg | image/jpeg | `✓` |
| pdf | application/pdf | `✓` | | pdf | application/pdf | `✓` |
| png | image/png | `✓` | | png | image/png | `✓` |
| ppt | application/vnd.ms-powerpoint | `✓` | | ppt | application/vnd.ms-powerpoint | `✓` |
| pptx | applicatiapplication/vnd.openxmlformats-officedocument.presentationml.presentation | `✓` | | pptx | applicatiapplication/vnd.openxmlformats-officedocument.presentationml.presentation | `✓` |
| tiff | image/tiff | `✓` |
| xls | application/vnd.ms-excel | `✓` | | xls | application/vnd.ms-excel | `✓` |
| xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | `✓` | | xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | `✓` |

View File

@ -3,6 +3,7 @@ import styled, { ThemeProvider } from "styled-components";
import { HeaderBar } from "./components/HeaderBar"; import { HeaderBar } from "./components/HeaderBar";
import { ProxyRenderer } from "./components/ProxyRenderer"; import { ProxyRenderer } from "./components/ProxyRenderer";
import BMPRenderer from "./plugins/bmp"; import BMPRenderer from "./plugins/bmp";
import HTMLRenderer from "./plugins/html";
import ImageProxyRenderer from "./plugins/image"; import ImageProxyRenderer from "./plugins/image";
import JPGRenderer from "./plugins/jpg"; import JPGRenderer from "./plugins/jpg";
import MSDocRenderer from "./plugins/msdoc"; import MSDocRenderer from "./plugins/msdoc";
@ -68,6 +69,7 @@ export { DocViewerRenderers } from "./plugins";
export * from "./types"; export * from "./types";
export { export {
BMPRenderer, BMPRenderer,
HTMLRenderer,
ImageProxyRenderer, ImageProxyRenderer,
JPGRenderer, JPGRenderer,
MSDocRenderer, MSDocRenderer,

View File

@ -0,0 +1,49 @@
import React, { useEffect } from "react";
import styled from "styled-components";
import { DocRenderer, IStyledProps } from "../../types";
import { base64FileLoader } from "../../utils/fileLoaders";
const HTMLRenderer: DocRenderer = ({ mainState: { currentDocument } }) => {
useEffect(() => {
const bodyBase64 =
currentDocument?.base64Data?.replace("data:text/html;base64,", "") || "";
const body: string = window.atob(bodyBase64);
let iframeCont = document.getElementById(
"html-body"
) as HTMLIFrameElement | null;
let iframe = iframeCont?.contentWindow && iframeCont.contentWindow;
if (!iframe) return;
const iframeDoc = iframe.document;
iframeDoc.open();
iframeDoc.write(`${body}`);
iframeDoc.close();
}, []);
return (
<Container id="html-renderer">
<BodyIFrame id="html-body" sandbox="allow-same-origin" />
</Container>
);
};
export default HTMLRenderer;
HTMLRenderer.fileTypes = ["htm", "html", "text/htm", "text/html"];
HTMLRenderer.weight = 0;
HTMLRenderer.fileLoader = base64FileLoader;
const Container = styled.div`
display: flex;
flex-direction: column;
width: 100%;
padding: 0 30px;
`;
const BodyIFrame = styled.iframe`
height: 100%;
padding: 15px;
margin: 20px 0 20px 0;
border: 1px solid ${(props: IStyledProps) => props.theme.secondary};
`;

View File

@ -1,4 +1,5 @@
import BMPRenderer from "./bmp"; import BMPRenderer from "./bmp";
import HTMLRenderer from "./html";
import JPGRenderer from "./jpg"; import JPGRenderer from "./jpg";
import MSDocRenderer from "./msdoc"; import MSDocRenderer from "./msdoc";
import MSGRenderer from "./msg"; import MSGRenderer from "./msg";
@ -8,6 +9,7 @@ import TIFFRenderer from "./tiff";
export const DocViewerRenderers = [ export const DocViewerRenderers = [
BMPRenderer, BMPRenderer,
HTMLRenderer,
JPGRenderer, JPGRenderer,
MSDocRenderer, MSDocRenderer,
MSGRenderer, MSGRenderer,

View File

@ -14,6 +14,27 @@ const MSGRenderer: DocRenderer = ({ mainState: { currentDocument } }) => {
setFileData(_fd); setFileData(_fd);
}, [currentDocument?.arrayBuffer]); }, [currentDocument?.arrayBuffer]);
useEffect(() => {
if (!fileData || fileData.hasOwnProperty("error")) return;
let iframeCont = document.getElementById(
"msg-body"
) as HTMLIFrameElement | null;
let iframe = iframeCont?.contentWindow && iframeCont.contentWindow;
if (!iframe) return;
const iframeDoc = iframe.document;
let body = (fileData as MSGFileData).body.replace(
/(\r\n|\n|\r)/gm,
"<br />"
);
iframeDoc.open();
iframeDoc.write(`${body}`);
iframeDoc.close();
}, [fileData]);
if (!fileData || fileData.hasOwnProperty("error")) { if (!fileData || fileData.hasOwnProperty("error")) {
return <span>{(fileData as MSGErrorResult)?.error}</span>; return <span>{(fileData as MSGErrorResult)?.error}</span>;
} }
@ -21,16 +42,15 @@ const MSGRenderer: DocRenderer = ({ mainState: { currentDocument } }) => {
let { let {
recipients, recipients,
subject, subject,
body,
senderEmail, senderEmail,
senderName, senderName,
} = fileData as MSGFileData; } = fileData as MSGFileData;
body = body.replace(/(\r\n|\n|\r)/gm, "<br />");
return ( return (
<Container id="msg-renderer"> <Container id="msg-renderer">
<h2 id="msg-subject-title">{subject}</h2> <h2 id="msg-subject-title" style={{ marginBottom: 0 }}>
{subject}
</h2>
<Sender name={senderName} email={senderEmail} /> <Sender name={senderName} email={senderEmail} />
@ -48,7 +68,7 @@ const MSGRenderer: DocRenderer = ({ mainState: { currentDocument } }) => {
</ul> </ul>
</RecipientContainer> </RecipientContainer>
<BodyContainer id="msg-body" dangerouslySetInnerHTML={{ __html: body }} /> <BodyIFrame id="msg-body" sandbox="allow-same-origin" />
</Container> </Container>
); );
}; };
@ -72,6 +92,8 @@ MSGRenderer.weight = 0;
MSGRenderer.fileLoader = arrayBufferFileLoader; MSGRenderer.fileLoader = arrayBufferFileLoader;
const Container = styled.div` const Container = styled.div`
display: flex;
flex-direction: column;
width: 100%; width: 100%;
padding: 0 30px; padding: 0 30px;
`; `;
@ -88,7 +110,8 @@ const RecipientContainer = styled.div`
border: 1px solid ${(props: IStyledProps) => props.theme.secondary}; border: 1px solid ${(props: IStyledProps) => props.theme.secondary};
`; `;
const BodyContainer = styled.div` const BodyIFrame = styled.iframe`
height: 100%;
padding: 15px; padding: 15px;
margin: 20px 0 20px 0; margin: 20px 0 20px 0;
border: 1px solid ${(props: IStyledProps) => props.theme.secondary}; border: 1px solid ${(props: IStyledProps) => props.theme.secondary};