feat: 邮件详情页: 回复, 转发

dev/email
Lei OT 10 months ago
parent eea8457c36
commit ce07651e6a

@ -47,6 +47,7 @@ const ChatboxEmail = ({ onOpenEditor, onOpenEmail, ...message }) => {
onOpen={() => handlePreview(message)} onOpen={() => handlePreview(message)}
onTitleClick={() => handlePreview(message)} onTitleClick={() => handlePreview(message)}
text={<RenderText str={message?.text || ''} className={message.status === 'failed' ? 'line-through text-neutral-400' : ''} email={message.emailOrigin} sender={message.sender} />} text={<RenderText str={message?.text || ''} className={message.status === 'failed' ? 'line-through text-neutral-400' : ''} email={message.emailOrigin} sender={message.sender} />}
// forwarded={true}
// replyButton={message.sender !== 'me'} // replyButton={message.sender !== 'me'}
// replyButton={['text', 'document', 'image'].includes(message.whatsapp_msg_type)} // replyButton={['text', 'document', 'image'].includes(message.whatsapp_msg_type)}
{...(message.sender === 'me' {...(message.sender === 'me'

@ -5,6 +5,7 @@ import Modal from '@dckj/react-better-modal';
import { Avatar as Avatar1 } from 'react-chat-elements'; import { Avatar as Avatar1 } from 'react-chat-elements';
import { ReplyIcon, ShareForwardIcon } from '@/components/Icons'; import { ReplyIcon, ShareForwardIcon } from '@/components/Icons';
import { isEmpty, olog, stringToColour } from '@/utils/commons'; import { isEmpty, olog, stringToColour } from '@/utils/commons';
import EmailEditorPopup from '../Input/EmailEditorPopup';
const TagColorStyle = (tag) => { const TagColorStyle = (tag) => {
const color = stringToColour(tag); const color = stringToColour(tag);
@ -14,11 +15,23 @@ const EmailDetail = ({ open, setOpen, emailDetail, ...props }) => {
let { emailOrigin } = emailDetail; let { emailOrigin } = emailDetail;
emailOrigin = emailOrigin || {}; emailOrigin = emailOrigin || {};
// const [open, setOpen] = useState(false); // const [open, setOpen] = useState(false);
const [initialPosition, setInitialPosition] = useState({});
const [initialSize, setInitialSize] = useState({});
const [initialMailTo, setInitialMailTo] = useState({});
function onHandleMove(e) { function onHandleMove(e) {
console.log(e, '--->>> onHandleMove'); // console.log(e, '--->>> onHandleMove');
const { top, left, width, height } = e;
setInitialPosition({ top, left });
console.log('top, left, width, height', '--->>> onHandleMove');
console.log(top, left, width, height, '--->>> onHandleMove');
} }
function onHandleResize(e) { function onHandleResize(e) {
console.log(e, '--->>> onHandleResize'); // console.log(e, '--->>> onHandleResize');
const { top, left, width, height } = e;
setInitialPosition({ top, left });
setInitialSize({ width, height });
console.log('top, left, width, height', '--->>> onHandleResize');
console.log(top, left, width, height, '--->>> onHandleResize');
} }
function onHandleOk() { function onHandleOk() {
@ -32,6 +45,21 @@ const EmailDetail = ({ open, setOpen, emailDetail, ...props }) => {
function onStageChange({ state }) { function onStageChange({ state }) {
console.log(state); console.log(state);
} }
const [action, setAction] = useState('');
const [openEmailEditor, setOpenEmailEditor] = useState(false);
const [fromEmail, setFromEmail] = useState('');
const [ReferEmailMsg, setReferEmailMsg] = useState('');
const onOpenEditor = (emailOrigin, action) => {
const { replyToEmail: email_addr, content } = emailOrigin;
setOpenEmailEditor(true);
setFromEmail(email_addr);
setReferEmailMsg(emailOrigin);
setAction(action);
setOpen(false);
};
return ( return (
<> <>
<Modal <Modal
@ -52,6 +80,10 @@ const EmailDetail = ({ open, setOpen, emailDetail, ...props }) => {
initialHeight={600} initialHeight={600}
initialTop={74} initialTop={74}
initialLeft={window.innerWidth - 700} initialLeft={window.innerWidth - 700}
// left={initialPosition.left}
// top={initialPosition.top}
// width={initialSize.width}
// height={initialSize.height}
// title={`${reference ? ': ' : ': '} ${fromEmail || ''}`} // title={`${reference ? ': ' : ': '} ${fromEmail || ''}`}
title={emailOrigin.subject} title={emailOrigin.subject}
minimizeButton={<></>} minimizeButton={<></>}
@ -80,10 +112,10 @@ const EmailDetail = ({ open, setOpen, emailDetail, ...props }) => {
</div> </div>
<div className='flex flex-col justify-start gap-1 items-end'> <div className='flex flex-col justify-start gap-1 items-end'>
<div className='flex items-center '> <div className='flex items-center '>
<Button size='small' type='text' icon={<ReplyIcon className='text-indigo-500' />}> <Button onClick={() => onOpenEditor(emailOrigin, 'reply')} size='small' type='text' icon={<ReplyIcon className='text-indigo-500' />}>
回复 回复
</Button> </Button>
<Button size='small' type='text' icon={<ShareForwardIcon className='text-primary' />}> <Button onClick={() => onOpenEditor(emailOrigin, 'forward')} size='small' type='text' icon={<ShareForwardIcon className='text-primary' />}>
转发 转发
</Button> </Button>
</div> </div>
@ -119,6 +151,7 @@ const EmailDetail = ({ open, setOpen, emailDetail, ...props }) => {
</div> </div>
</div> </div>
</Modal> </Modal>
<EmailEditorPopup open={openEmailEditor} setOpen={setOpenEmailEditor} fromEmail={fromEmail} quote={ReferEmailMsg} initial={{...initialPosition, ...initialSize}} action={action} key={`email-editor-inner-${action}-popup_${ReferEmailMsg.id}`}/>
</> </>
); );
}; };

@ -27,7 +27,7 @@ import { isEmpty } from '@/utils/commons';
// function onError(error) { // function onError(error) {
// console.error(error); // console.error(error);
// } // }
const EmailEditorPopup = ({ open, setOpen, fromEmail, reference, quote={}, ...props }) => { const EmailEditorPopup = ({ open, setOpen, fromEmail, reference, quote = {}, initial = {}, action='reply', ...props }) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
// const [open, setOpen] = useState(false); // const [open, setOpen] = useState(false);
@ -81,11 +81,14 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, reference, quote={}, ...pr
// console.log('body', body); // console.log('body', body);
form form
.validateFields() .validateFields()
.then((values) => {}) .then((values) => {
.catch((err) => {});
form.resetFields(); form.resetFields();
})
// .catch((err) => {})
;
// setOpen(false); // setOpen(false);
}; };
@ -134,12 +137,17 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, reference, quote={}, ...pr
cc: quote.cc, cc: quote.cc,
subject: `Re: ${subject}`, subject: `Re: ${subject}`,
}; };
const forwardValues = {subject: `Fw: ${subject}`,};
if (action === 'reply') {
form.setFieldsValue(_formValues); form.setFieldsValue(_formValues);
setInitialForm(_formValues); setInitialForm(_formValues);
} else if (action === 'forward') {
form.setFieldsValue(forwardValues);
setInitialForm(forwardValues);
}
return () => {}; return () => {};
}, [quote]) }, [quote, open]);
return ( return (
<> <>
@ -157,10 +165,10 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, reference, quote={}, ...pr
contentClassName='p-2' contentClassName='p-2'
footerClassName='p-2' footerClassName='p-2'
zIndex={2} zIndex={2}
initialWidth={680} initialWidth={initial.width || 680}
initialHeight={600} initialHeight={initial.height || 600}
initialTop={74} initialTop={initial.top || (isEmpty(reference) ? 20 : 74)}
initialLeft={window.innerWidth - 700} initialLeft={initial.left || window.innerWidth - 700}
title={initialForm.subject || `${reference ? '回复: ' : '写邮件: '} ${fromEmail || ''}`} title={initialForm.subject || `${reference ? '回复: ' : '写邮件: '} ${fromEmail || ''}`}
minimizeButton={<></>} minimizeButton={<></>}
onMove={onHandleMove} onMove={onHandleMove}
@ -170,19 +178,20 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, reference, quote={}, ...pr
onStageChange={onStageChange} onStageChange={onStageChange}
footer={ footer={
<div className='w-full flex gap-8 justify-start items-center text-indigo-600'> <div className='w-full flex gap-8 justify-start items-center text-indigo-600'>
<Button type='primary' className='bg-indigo-500 shadow shadow-indigo-300 hover:!bg-indigo-400 active:bg-indigo-400 focus:bg-indigo-400' <Button type='primary' className='bg-indigo-500 shadow shadow-indigo-300 hover:!bg-indigo-400 active:bg-indigo-400 focus:bg-indigo-400' onClick={onHandleSend}>
onClick={onHandleSend}
>
发送 发送
</Button> </Button>
<Popover> <Popover>
{/* <Switch checkedChildren='纯文本' unCheckedChildren='HTML' /> */} {/* <Switch checkedChildren='纯文本' unCheckedChildren='HTML' /> */}
<Checkbox checked={!isRichText} onChange={e => setIsRichText(!(e.target.checked))}>纯文本</Checkbox> <Checkbox checked={!isRichText} onChange={(e) => setIsRichText(!e.target.checked)}>
纯文本
</Checkbox>
</Popover> </Popover>
</div> </div>
}> }>
<Form <Form
form={form} preserve={false} form={form}
preserve={false}
name='conversation_filter_form' name='conversation_filter_form'
size='small' size='small'
variant={'borderless'} variant={'borderless'}
@ -191,7 +200,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, reference, quote={}, ...pr
className='*:mb-2 *:border-b *:border-t-0 *:border-x-0 *:border-indigo-100 *:border-solid ' className='*:mb-2 *:border-b *:border-t-0 *:border-x-0 *:border-indigo-100 *:border-solid '
requiredMark={false} requiredMark={false}
labelCol={{ span: 3 }}> labelCol={{ span: 3 }}>
<Form.Item label='To' name={'to'} rules={[{required: true}]}> <Form.Item label='To' name={'to'} rules={[{ required: true }]}>
{/* <Mentions {/* <Mentions
split='; ' split='; '
options={[ options={[
@ -223,7 +232,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, reference, quote={}, ...pr
<Form.Item label='Bcc' name={'bcc'} hidden={!showBcc}> <Form.Item label='Bcc' name={'bcc'} hidden={!showBcc}>
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item label='Subject' name={'subject'} rules={[{required: true}]}> <Form.Item label='Subject' name={'subject'} rules={[{ required: true }]}>
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item name='content' hidden> <Form.Item name='content' hidden>
@ -233,7 +242,7 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, reference, quote={}, ...pr
<Input /> <Input />
</Form.Item> </Form.Item>
</Form> </Form>
<LexicalEditor {...{isRichText}} onChange={handleEditorChange} initialValue={initialContent} /> <LexicalEditor {...{ isRichText }} onChange={handleEditorChange} initialValue={initialContent} />
</Modal> </Modal>
</> </>
); );

@ -9,9 +9,9 @@ import { useVisibilityState } from '@/hooks/useVisibilityState';
import ConversationNewItem from './ConversationsNewItem'; import ConversationNewItem from './ConversationsNewItem';
import emailItem from './Components/emailSent.json'; import emailItem from './Components/emailSent.json';
import emailReItem from './Components/emailRe.json'; import emailReItem from './Components/emailRe.json';
import EmailEditor from './Input/EmailEditor'; // import EmailEditor from './Input/bak/EmailEditor';
import EmailEditorPopup from './Input/EmailEditorPopup'; import EmailEditorPopup from './Input/EmailEditorPopup';
import EmailDetail from './Input/EmailDetail'; import EmailDetail from './Components/EmailDetail';
const MessagesWrapper = ({ updateRead = true, forceGetMessages }) => { const MessagesWrapper = ({ updateRead = true, forceGetMessages }) => {
const userId = useAuthStore((state) => state.loginUser.userId); const userId = useAuthStore((state) => state.loginUser.userId);
@ -193,8 +193,8 @@ const MessagesWrapper = ({ updateRead = true, forceGetMessages }) => {
onCancel={() => setNewChatModalVisible(false)} onCancel={() => setNewChatModalVisible(false)}
/> />
{/* <EmailEditor open={openEmailEditor} setOpen={setOpenEmailEditor} reference={ReferEmailMsg} setRefernce={setReferEmailMsg} {...{ fromEmail, }} key={'email-editor-reply'} /> */} {/* <EmailEditor open={openEmailEditor} setOpen={setOpenEmailEditor} reference={ReferEmailMsg} setRefernce={setReferEmailMsg} {...{ fromEmail, }} key={'email-editor-reply'} /> */}
<EmailEditorPopup open={openEmailEditor} setOpen={setOpenEmailEditor} fromEmail={fromEmail} quote={ReferEmailMsg} key={`email-editor-reply-popup_${ReferEmailMsg.id}`}/> <EmailEditorPopup open={openEmailEditor} setOpen={setOpenEmailEditor} fromEmail={fromEmail} quote={ReferEmailMsg} key={`email-editor-reply-top-popup_${ReferEmailMsg.id}`}/>
<EmailDetail open={openEmailDetail} setOpen={setOpenEmailDetail} emailDetail={emailDetail} /> <EmailDetail open={openEmailDetail} setOpen={setOpenEmailDetail} emailDetail={emailDetail} key={`email-detail-${emailDetail.id}`} />
</> </>
); );
}; };

Loading…
Cancel
Save