import React, { FC, useEffect, useState } from "react"; import styled from "styled-components"; import { MSGErrorResult, MSGFileData, MSGReader } from "wl-msg-reader"; import { DocRenderer, IStyledProps } from "../../types"; import { arrayBufferFileLoader } from "../../utils/fileLoaders"; const MSGRenderer: DocRenderer = ({ mainState: { currentDocument } }) => { const [fileData, setFileData] = useState<MSGFileData | MSGErrorResult>(); useEffect(() => { if (!currentDocument || !currentDocument.fileData) return; const _fd = new MSGReader( currentDocument.fileData as ArrayBuffer ).getFileData(); setFileData(_fd); }, [currentDocument?.fileData]); 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")) { return <span>{(fileData as MSGErrorResult)?.error}</span>; } let { recipients, subject, senderEmail, senderName, } = fileData as MSGFileData; return ( <Container id="msg-renderer"> <h2 id="msg-subject-title" style={{ marginBottom: 0 }}> {subject} </h2> <Sender name={senderName} email={senderEmail} /> <RecipientContainer id="msg-recipient"> <h3 id="msg-recipient-title">Recipients</h3> <ul id="msg-recipient-ul"> {recipients.map((r, i) => ( <li key={i} id="msg-recipient-li"> <span id="msg-recipient-name">{r.name}</span> {r.hasOwnProperty("email") && ( <span id="msg-recipient-email"> - {r.email}</span> )} </li> ))} </ul> </RecipientContainer> <BodyIFrame id="msg-body" sandbox="allow-same-origin" /> </Container> ); }; const Sender: FC<{ name: string; email: string }> = ({ name, email }) => { if (!name && !email) return null; return ( <SenderContainer id="msg-sender"> <h3 id="msg-sender-title">Sender</h3> {name !== undefined && <div id="msg-sender-name">{name}</div>} {email !== undefined && <div id="msg-sender-email">{email}</div>} </SenderContainer> ); }; export default MSGRenderer; MSGRenderer.fileTypes = ["msg", "application/vnd.ms-outlook"]; MSGRenderer.weight = 0; MSGRenderer.fileLoader = arrayBufferFileLoader; const Container = styled.div` display: flex; flex-direction: column; width: 100%; padding: 0 30px; `; const SenderContainer = styled.div` padding: 0 15px 15px 15px; margin-top: 20px; border: 1px solid ${(props: IStyledProps) => props.theme.secondary}; `; const RecipientContainer = styled.div` padding: 0 15px; margin-top: 20px; border: 1px solid ${(props: IStyledProps) => props.theme.secondary}; `; const BodyIFrame = styled.iframe` height: 100%; padding: 15px; margin: 20px 0 20px 0; border: 1px solid ${(props: IStyledProps) => props.theme.secondary}; `;