diff --git a/frontend/src/components/MailView.tsx b/frontend/src/components/MailView.tsx new file mode 100644 index 00000000..4df2182f --- /dev/null +++ b/frontend/src/components/MailView.tsx @@ -0,0 +1,91 @@ +import DOMPurify from 'dompurify' +import { useMailStore } from '../store/mailStore' +import { mailApi } from '../api/mailApi' + +export default function MailView() { + const { selectedMail, currentFolder, openCompose } = useMailStore() + + if (!selectedMail) return ( +
+
✉️
+
메일을 선택하세요
+
+ ) + + const m = selectedMail + const cleanHtml = m.body_html + ? DOMPurify.sanitize(m.body_html, { FORBID_TAGS: ['script', 'iframe', 'object'] }) + : null + + const reply = () => openCompose(m) + const forward = () => openCompose({ ...m, subject: `Fw: ${m.subject}`, to: '', uid: '' } as any) + + return ( +
+
+

{m.subject}

+
+
+ 보낸사람 + {m.sender} <{m.sender_addr}> +
+
+ 받는사람 + {m.to} +
+ {m.cc && ( +
+ 참조 + {m.cc} +
+ )} +
+ 날짜 + {m.date} +
+
+
+ + +
+
+ + {/* 첨부파일 */} + {m.attachments?.length > 0 && ( +
+
📎 첨부파일 ({m.attachments.length}개)
+
+ {m.attachments.map(a => ( + + {a.filename} + ({fmtSize(a.size)}) + + ))} +
+
+ )} + + {/* 본문 */} +
+ {cleanHtml ? ( +
+ ) : ( +
{m.body_text}
+ )} +
+
+ ) +} + +function fmtSize(b: number) { + if (b < 1024) return `${b}B` + if (b < 1024 * 1024) return `${(b / 1024).toFixed(0)}KB` + return `${(b / 1024 / 1024).toFixed(1)}MB` +}