import { useState, useEffect, useRef, useMemo } from 'react' import { App, Button, Divider, Avatar, List, Flex, Typography, Tooltip, Empty } from 'antd' import { LoadingOutlined, ApiOutlined, FilePdfOutlined, FileOutlined, FileWordOutlined, FileExcelOutlined, FileJpgOutlined, FileImageOutlined, FileTextOutlined, FileGifOutlined, GlobalOutlined, FileZipOutlined, DeleteOutlined, ExpandOutlined } from '@ant-design/icons' import { EditIcon, MailCheckIcon, ReplyAllIcon, ReplyIcon, ResendIcon, ShareForwardIcon, SendPlaneFillIcon, InboxIcon } from '@/components/Icons' import { isEmpty, TagColorStyle } from '@/utils/commons' import EmailEditorPopup from '../Input/EmailEditorPopup' import DnDModal from '@/components/DnDModal' import useStyleStore from '@/stores/StyleStore' import { openPopup, useEmailDetail, } from '@/hooks/useEmail' import { EMAIL_ATTA_HOST, POPUP_FEATURES } from '@/config' import EmailBindFormModal from './EmailBind' import EmailContent from './EmailContent' const extTypeMapped = { txt: { icon: FileTextOutlined }, zip: { icon: FileZipOutlined, color: '#ffe78f' }, pdf: { icon: FilePdfOutlined, color: '#ad0b00' }, doc: { icon: FileWordOutlined, color: '#103f91' }, docx: { icon: FileWordOutlined, color: '#103f91' }, rtf: { icon: FileWordOutlined, color: '#103f91' }, xls: { icon: FileExcelOutlined, color: '#0c7d0c' }, xlsx: { icon: FileExcelOutlined, color: '#0c7d0c' }, jpg: { icon: FileImageOutlined, color: '#1985ff' }, jpeg: { icon: FileImageOutlined, color: '#1985ff' }, png: { icon: FileImageOutlined, color: '#1985ff' }, gif: { icon: FileGifOutlined, color: '#1985ff' }, html: { icon: GlobalOutlined, color: '#1985ff' }, htm: { icon: GlobalOutlined, color: '#1985ff' }, default: { icon: FileOutlined }, // rtf bmp } /** * @property {*} emailMsg - 邮件数据. { conversationid, actionId, order_opi, coli_sn, msgOrigin: { from, to, id, email: { subject, mai_sn, } } } */ const EmailDetailInline = ({ mailID, emailMsg = {}, disabled = false, variant, size, autoMark = false, ...props }) => { // console.log('emailDetail', emailMsg); const componentRef = useRef(null); const [compactBtn, setCompactBtn] = useState(size==='small'); useEffect(() => { if (componentRef.current) { // console.log(componentRef.current.getBoundingClientRect().width); setCompactBtn(componentRef.current.offsetWidth < 800); } return () => {} }, []) // const NEW_EMAIL_CONFIG = useMemo(() => { // return ['new', 'edit', 'reply', 'replyall', 'forward'].reduce((a, action) => ({...a, [`${action}-${mailID || 0}`]: { // url: `/email/${action}/${mailID || 0}`, // name: `${action}-${mailID || 0}`, // features: POPUP_FEATURES, // }}), {}); // }, [mailID]); const { notification, message } = App.useApp() const { conversationid, actionId, order_opi, coli_sn } = emailMsg const { mai_sn, id } = emailMsg.msgOrigin?.email || emailMsg.msgOrigin || {} // const mailID = mai_sn || id // const [action, setAction] = useState('') // const [openEmailEditor, setOpenEmailEditor] = useState(false) // const [fromEmail, setFromEmail] = useState('') // useEffect(() => { // setOpenEmailEditor(false) // return () => {} // }, [mailID]) const onOpenEditor = (msgOrigin, action='reply') => { openPopup(`/email/${action}/${mailID || 0}`, `${action}-${mailID || 0}`) if (typeof props.onOpenEditor === 'function') { props.onOpenEditor(msgOrigin, action); } else { // const { from, to } = msgOrigin // setOpenEmailEditor(true) // setFromEmail(action === 'edit' ? from : to) // setAction(action) // // setOpen(false) } } const { loading, mailData, orderDetail, postEmailResend } = useEmailDetail(mailID, null, false, autoMark) const [showBindBtn, setShowBindBtn] = useState(false) useEffect(() => { setShowBindBtn(mailID ? isEmpty(mailData.info?.MAI_COLI_SN) : false) return () => {} }, [mailID, mailData.info?.MAI_COLI_SN]) const handleView = async () => { openPopup(`/email/view/${mailID || 0}`, `view-${mailID || 0}`, { fullscreen: true }) }; const handleResend = async () => { if (isEmpty(mai_sn)) { return false } try { await postEmailResend({ mai_sn, conversationid, actionId }) // setOpen(false) } catch (err) { notification.error({ message: '请求失败', description: err.message, placement: 'top', duration: 3, }) } } const handleDel = async () => { if (isEmpty(mai_sn)) { return false } try { // } catch (err) { notification.error({ message: '请求失败', description: err.message, placement: 'top', duration: 3, }) } } const FileTypeIcon = ({fileName}) => { const ext = fileName.split('.').pop() || 'default'; const Com = extTypeMapped[ext]?.icon || FileOutlined; const color = extTypeMapped[ext]?.color || 'inherit'; return ; }; /** * 根据状态, 显示操作 * * 已保存: [] * * 已发送: 回复, 转发 * * 失败: 重发 * todo: disabled 不显示 */ const ActionBtns = ({ className, ...props }) => { const { status } = mailData.info let btns = [] // const showDoneBtn = mailData.info?.MAI_Direction !== 1 ? true : false // if (showDoneBtn) { // btns.push() // } // 没有关联订单的邮件`绑定订单` if (showBindBtn) { btns.push( setShowBindBtn(false)} {...{ conversationid, mai_sn, showBindBtn }} />) btns.push() } switch (status) { case 'accepted': break case 'sent': case '': // 接收的邮件没有发送状态 btns.push( , ) btns.push( , ) btns.push( , ) break case 'failed': btns.push( // // , , ) btns.push( , ) break default: break } const showFullBtn = variant !== 'full' if (showFullBtn) { btns.push(); btns.push( ) } return
{btns}
} const variantCls = (variant) => { switch (variant) { case 'outline': return 'border-y-0 border-x border-solid border-neutral-200' case 'full': return 'h-[calc(100vh-16px)]' default: return '' } } return mailID ? ( <>
0 ? '' : ' font-bold '}> {loading ? : null} {mailData.info?.MAI_Subject || emailMsg?.msgOrigin?.subject}
{(mailData.info?.MAI_From || '').substring(0, 1)}
{/* {mailData.info?.fromName} */} {mailData.info?.MAI_From}
{/* */}
{mailData.info?.MAI_SendDate || emailMsg.localDate}
收件人 {mailData.info?.MAI_To}
{mailData.info?.MAI_CS && (
抄送 {mailData.info.MAI_CS}
)} {mailData.info?.bcc && (
密送 {mailData.info.bcc}
)}
{mailData.info?.mailType === 'text/html' ? ( ) : (
)} {mailData.AttachList.length > 0 && (
{mailData.attachments.length > 0 && ( <>  附件 ({mailData.attachments.length}) ( openPopup(`${EMAIL_ATTA_HOST}${atta.ATI_ServerFile}`, atta.ATI_SN)} size='small' className='text-blue-500 cursor-pointer'> {atta.ATI_Name} )} /> )} {mailData.insideAttachments.length > 0 &&
 文内附件 ({mailData.insideAttachments.length}) 已在正文显示 点击展开 ( openPopup(`${EMAIL_ATTA_HOST}${atta.ATI_ServerFile}`, atta.ATI_SN)} size='small' className='text-blue-500 cursor-pointer'> {atta.ATI_Name} )} />
}
)}
{/* */} ) : ( ) } export default EmailDetailInline