${mailData.content}
` * @property {string} quoteid - 引用邮件ID * @property {object} draft - 草稿 */ -const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, toEmail, conversationid, quoteid, initial = {}, mailData: _mailData, action = 'reply', draft = {}, customerDetail={}, ...props }) => { +const EmailEditorPopup = () => { const { notification, message } = App.useApp(); const [form] = Form.useForm(); - const [mobile] = useStyleStore((state) => [state.mobile]); const [userId, username, emailList] = useAuthStore((state) => [state.loginUser.userId, state.loginUser.username, state.loginUser.emailList]); const emailListOption = emailList?.map(ele => ({ ...ele, label: ele.email, key: ele.email, value: ele.email })) || []; @@ -72,8 +71,35 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, const emailListMatMapped = emailListOption?.reduce((r, v) => ({ ...r, [v.mat_sn]: v }), {}); // console.log('emailListMapped', emailListOption, emailListAddrMapped); - const mai_sn = quoteid; - const { loading: getLoading, mailData } = useEmailDetail(mai_sn, _mailData) + const emailEdiorProps = useConversationStore((state) => state.emailEdiorProps); + const [open, setOpen, closeEditor1, currentEditKey, setCurrentEditKey] = useConversationStore((state) => [state.editorOpen, state.setEditorOpen, state.closeEditor1, state.currentEditKey, state.setCurrentEditKey]); + + const propsKeysArr = Array.from(emailEdiorProps.keys()); + const propsArr = Array.from(emailEdiorProps.values()); + + const [activeEdit, setActiveEdit] = useState(emailEdiorProps.get(currentEditKey) || {}); + // const { fromEmail, fromUser, fromOrder, oid, toEmail, conversationid, quoteid, initial = {}, mailData: _mailData, action = 'reply', draft = {}, receiverName, ...props } = emailEdiorProps.get(currentEditKey) || {}; + + const onChangeActiveEditor = (key) => { + setCurrentEditKey(key); + const _find = emailEdiorProps.get(key) || {}; + setActiveEdit(_find); + }; + + const onEditTab = (targetKey, action) => { + if (action === 'add') { + // + } else { + if (propsKeysArr.length === 1) { + setOpen(false); + } + closeEditor1(targetKey); + } + }; + + + const mai_sn = activeEdit.quoteid; + const { loading: getLoading, mailData } = useEmailDetail(mai_sn, activeEdit.mailData) const [stickToProps, setStickToProps] = useState({}); @@ -99,24 +125,24 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, // 存储: 会话ID, // 这个窗口没有模态, 即使不是focus, 还是需要保持会话ID // 否则, 会话列表切换之后, 会话ID更新, 导致消息关联错误 - const [stickToCid, setStickToCid] = useState(conversationid); + const [stickToCid, setStickToCid] = useState(activeEdit.conversationid); useEffect(() => { - const propsObj = { open, setOpen, fromEmail, fromUser, fromOrder, oid, toEmail, conversationid, quoteid, mai: _mailData?.info?.MAI_MAT_SN, action, draft } + const propsObj = { ...activeEdit, mai: activeEdit.mailData?.info?.MAI_MAT_SN, } - setContentPrefix(oid ? `Dear Mr./Ms. ${customerDetail.name || ''}
Reference Number: ${oid}
` : ''); + setContentPrefix(activeEdit.oid ? `Dear Mr./Ms. ${activeEdit.receiverName || ''}
Reference Number: ${activeEdit.oid}
` : ''); // 没有引用邮件 - if (isEmpty(quoteid)) { + if (isEmpty(activeEdit.quoteid)) { setStickToProps(propsObj) setPropsSerialize(JSON.stringify(propsObj)) - setStickToCid(conversationid) - setEmailOrder(fromOrder) - setEmailOPI(fromUser) - setNewFromEmail(fromEmail) - setNewToEmail(toEmail) + setStickToCid(activeEdit.conversationid) + setEmailOrder(activeEdit.fromOrder) + setEmailOPI(activeEdit.fromUser) + setNewFromEmail(activeEdit.fromEmail) + setNewToEmail(activeEdit.toEmail) - const _findMat = emailListAddrMapped?.[fromEmail]?.mat_sn + const _findMat = emailListAddrMapped?.[activeEdit.fromEmail]?.mat_sn setEmailMat(_findMat) // if (open !== true) { @@ -129,7 +155,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, const reEmailUser = mailData.info?.MAI_OPI_SN const reEmailUserMat = mailData.info?.MAI_MAT_SN - setEmailOrder((prev) => reEmailO || prev || fromOrder) + setEmailOrder((prev) => reEmailO || prev || activeEdit.fromOrder) setEmailOPI((prev) => reEmailUser || prev) setEmailMat((prev) => reEmailUserMat || prev) @@ -178,6 +204,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, setTextContent(textContent); form.setFieldValue('content', htmlContent); form.setFieldValue('abstract', getAbstract(textContent)); + debouncedSave({htmlContent}); }; const [initialForm, setInitialForm] = useState({}); @@ -189,7 +216,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, useEffect(() => { // console.log('quoteid', quoteid, isEmpty(quoteid), isEmpty(mailData.info)); - if (isEmpty(quoteid) && action !== 'new') { + if (isEmpty(activeEdit.quoteid) && activeEdit.action !== 'new') { return () => {} } const { info } = mailData @@ -201,7 +228,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, // const _initialContent = isEmpty(mailData.info) ? signatureBody : signatureBody+preQuoteBody - if (!isEmpty(mailData.info) && action !== 'edit') { + if (!isEmpty(mailData.info) && activeEdit.action !== 'edit') { setInitialContent(contentPrefix + signatureBody) } @@ -212,14 +239,14 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, subject: `Re: ${info.MAI_Subject || ''}`, } const forwardValues = { from: newFromEmail, subject: `Fw: ${info.MAI_Subject || ''}` } - if (action === 'reply') { + if (activeEdit.action === 'reply') { form.setFieldsValue(_formValues) setInitialForm(_formValues) - } else if (action === 'forward') { + } else if (activeEdit.action === 'forward') { setStickToCid('0') form.setFieldsValue(forwardValues) setInitialForm(forwardValues) - } else if (action === 'edit') { + } else if (activeEdit.action === 'edit') { const thisFormValues = { to: info?.MAI_To || '', cc: info?.MAI_CS || '', @@ -231,11 +258,11 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, // console.log('thisBody', thisBody); setInitialContent(thisBody) - } else if (action === 'new') { - const newEmail = { to: newToEmail, subject: draft?.subject || '' } + } else if (activeEdit.action === 'new') { + const newEmail = { to: newToEmail, subject: activeEdit.draft?.subject || '' } form.setFieldsValue(newEmail) setInitialForm(newEmail) - setInitialContent((draft?.content || contentPrefix || '') + signatureBody) + setInitialContent((activeEdit.draft?.content || contentPrefix || '') + signatureBody) } return () => {} @@ -391,7 +418,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, body.coli_sn = emailOrder || ''; // console.log('body', body, '\n', emailOrder); const values = await form.validateFields(); - const preQuoteBody = quoteid ? (quoteContent ? quoteContent : generateQuoteContent(mailData, isRichText)) : ''; + const preQuoteBody = activeEdit.quoteid ? (quoteContent ? quoteContent : generateQuoteContent(mailData, isRichText)) : ''; body.mailcontent = isRichText ? EmailBuilder({ subject: values.subject, content: htmlContent+preQuoteBody }) : textContent+preQuoteBody body.cc = values.cc || ''; body.bcc = values.bcc || ''; @@ -450,6 +477,32 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, oid, const [openDrawerSnippet] = useSnippetStore((state) => [state.openDrawer]) const [openPaymentDrawer] = useOrderStore((state) => [state.openDrawer]) + const [bakData, setBakData] = useState({}); + const idleCallbackId = useRef(null); + const debouncedSave = useCallback( + debounce((data) => { + idleCallbackId.current = window.requestIdleCallback(() => { + console.log('Saving data (idle, debounced):', data); + if (currentEditKey) writeIndexDB({ ...data, key: currentEditKey }, 'draft', 'EmailEditor') + }); + }, 1500), // 1.5s + [] + ); + const onEditChange = (changedValues, allValues) => { + console.log('onEditChange', changedValues,'\n', allValues) + // const { name, value } = e.target; + // setBakData(prevData => ({ ...prevData, [name]: value })); + // debouncedSave(bakData); + }; + + useEffect(() => { + return () => { + if (idleCallbackId.current && window.cancelIdleCallback) { + window.cancelIdleCallback(idleCallbackId.current); + } + }; + }, [debouncedSave]); + return ( <>setQuoteContent(`+ )} +${e.target.innerHTML}`)} + dangerouslySetInnerHTML={{ __html: generateQuoteContent(mailData) }}>