Merge branch 'main' of github.com:hainatravel/global-sales

2.0/email-builder
Jimmy Liow 10 months ago
commit 8b6d41e8d0

@ -57,9 +57,9 @@ export const fetchConversationsList = async (params) => {
/**
*
* @param {object} params { opisn, whatsappid, colisn }
* @param {object} params { opisn, whatsappid, colisn, email }
* * opisn, colisn : 用于查询
* * whatsappid: 用于创建会话
* * whatsappid, email: 用于创建会话
*/
export const fetchOrderConversationsList = async (params) => {
const { errcode, result: data } = await fetchJSON(`${API_HOST}/getorderconversation`, params);

@ -43,8 +43,6 @@ export const WABAccounts = [
}
];
export const WABAccountsMapped = WABAccounts.reduce((a, c) => ({ ...a, [removeFirstPlus(c.phoneNumber)]: c, [c.phoneNumber]: c }), {})
console.log(WABAccountsMapped);
export const replaceTemplateString = (str, replacements) => {
let result = str;

@ -170,7 +170,7 @@ export function InsertInlineImageDialog({
data-test-id="image-modal-file-upload-btn"
disabled={isDisabled}
onClick={() => handleOnClick()}>
Confirm
{uploading ? 'Uploading, Pls wait...' : 'Confirm'}
</Button>
</DialogActions>
</>

@ -339,7 +339,7 @@ const messageSlice = (set, get) => ({
// msgUpdate
// console.log('UPDATE_SENT_MESSAGE_ITEM-----------------------------------------------------------------', message);
// 更新会话中的消息
const { activeConversations, conversationsList, currentConversation } = get();
const { activeConversations, conversationsList, currentConversation, setFilter } = get();
const targetId = message.conversationid;
const targetMsgs = (activeConversations[String(targetId)] || []).map((ele) => {
// 更新状态
@ -395,6 +395,7 @@ const messageSlice = (set, get) => ({
}
const mergedList = [...newConversations, ...conversationsList]
const mergedListMapped = groupBy(mergedList, 'top_state');
setFilter({ loadNextPage: true });
return set({
topList: mergedListMapped['1'] || [],
@ -405,7 +406,7 @@ const messageSlice = (set, get) => ({
},
sentOrReceivedNewMessage: (targetId, message) => {
// msgRender:
const { activeConversations, conversationsList, currentConversation, totalNotify } = get();
const { activeConversations, conversationsList, currentConversation, totalNotify, setFilter } = get();
const targetMsgs = activeConversations[String(targetId)] || [];
const targetIndex = conversationsList.findIndex((ele) => Number(ele.sn) === Number(targetId));
const lastReceivedTime = (message.type !== 'system' && message.sender !== 'me') ? dayjs(message.date).add(8, 'hours').format(DATETIME_FORMAT) : null;
@ -444,6 +445,7 @@ const messageSlice = (set, get) => ({
// console.log('find in list, chat updated and Top: \n', JSON.stringify(newConversation, null, 2));
// console.log('list updated : \n', JSON.stringify(conversationsList, null, 2));
const mergedListMapped = groupBy(conversationsList, 'top_state');
setFilter({ loadNextPage: true });
const isCurrent = Number(targetId) === Number(currentConversation.sn);
const updatedCurrent = isCurrent
@ -483,8 +485,11 @@ export const useConversationStore = create(
setInitial: (v) => set({ initialState: v }),
// side effects
fetchInitialData: async ({userId, userIds, whatsAppBusiness, ...loginUser}) => {
const { setTemplates, setInitial, setTags } = get();
fetchInitialData: async ({userId, whatsAppBusiness, ...loginUser}) => {
const { addToConversationList, setTemplates, setInitial, setTags } = get();
const conversationsList = await fetchConversationsList({ opisn: userId });
addToConversationList(conversationsList);
const templates = await fetchTemplates({ waba: whatsAppBusiness });
setTemplates(templates);

@ -1,9 +1,8 @@
import React, { useState, useEffect } from 'react';
import { Button, Tag, Radio, Popover, Form, Divider } from 'antd';
import { FilterOutlined, FilterTwoTone } from '@ant-design/icons';
import { debounce, isEmpty, isNotEmpty, objectMapper, stringToColour } from '@/utils/commons';
import { Button, Tag, Radio, Popover, Form } from 'antd';
import { isEmpty, objectMapper, stringToColour } from '@/utils/commons';
import useConversationStore from '@/stores/ConversationStore';
import { OrderLabelDefaultOptions, OrderStatusDefaultOptions } from '@/stores/OrderStore';
import { OrderLabelDefaultOptions } from '@/stores/OrderStore';
import { FilterIcon } from '@/components/Icons';
const otypes = [

@ -64,7 +64,7 @@ const NewTagForm = ({onSubmit,...props}) => {
);
};
const ChatListItem = (({item, refreshConversationList,setListUpdateFlag,onSwitchConversation,tabSelectedConversation, setNewChatModalVisible,setEditingChat,...props}) => {
const ChatListItem = (({item, refreshConversationList,setListUpdateFlag,onSwitchConversation, setNewChatModalVisible,setEditingChat,...props}) => {
const [mobile] = useStyleStore((state) => [state.mobile]);
const routerReplace = mobile === false ? true : false; // : true;
@ -243,8 +243,6 @@ const ChatListItem = (({item, refreshConversationList,setListUpdateFlag,onSwitch
// item.top_state === 1 ? 'bg-stone-100' : '',
String(item.sn) === String(currentConversation.sn)
? '__active text-primary bg-whatsapp-bg'
: String(item.sn) === String(tabSelectedConversation?.sn)
? ' bg-neutral-200'
: item.top_state === 1
? 'bg-stone-100'
: '',

@ -24,7 +24,7 @@ const EmailDetail = ({ open, setOpen, emailMsg, ...props }) => {
const {notification, message} = App.useApp()
const { conversationid, actionId, order_opi } = emailMsg
const { conversationid, actionId, order_opi, coli_sn } = emailMsg
const { mai_sn, id } = emailMsg.msgOrigin?.email || emailMsg.msgOrigin || {}
const mailID = mai_sn || id
const [initialPosition, setInitialPosition] = useState({})
@ -163,7 +163,7 @@ const EmailDetail = ({ open, setOpen, emailMsg, ...props }) => {
</div>
<div className='flex flex-col justify-start gap-1 items-end'>
<ActionBtns />
<div className='text-xs '>{emailMsg.localDate}</div>
<div className='text-xs '>{mailData.info?.MAI_SendDate || emailMsg.localDate}</div>
</div>
</div>
<div className='text-sm'>
@ -204,6 +204,7 @@ const EmailDetail = ({ open, setOpen, emailMsg, ...props }) => {
setOpen={setOpenEmailEditor}
fromEmail={fromEmail}
fromUser={mailData.info?.MAI_OPI_SN || order_opi}
fromOrder={mailData.info?.MAI_COLI_SN || coli_sn}
conversationid={conversationid}
// emailMsg={ReferEmailMsg}
quoteid={mailID}

@ -1,12 +1,13 @@
import React, { useEffect, useState, useRef, useCallback } from 'react';
import { useParams, useNavigate, useLocation } from 'react-router-dom';
import { Input, Button, Empty, Tooltip, List } from 'antd';
import { App, Input, Button, Empty, Tooltip, List } from 'antd';
import { PlusOutlined, LoadingOutlined, HistoryOutlined, FireOutlined,AudioTwoTone } from '@ant-design/icons';
import { fetchConversationsList, fetchOrderConversationsList, CONVERSATION_PAGE_SIZE } from '@/actions/ConversationActions';
import ConversationsNewItem from './ConversationsNewItem';
import { debounce, flush, isEmpty, isNotEmpty, pick } from '@/utils/commons';
import useConversationStore from '@/stores/ConversationStore';
import useAuthStore from '@/stores/AuthStore';
import { useOrderStore, OrderLabelDefaultOptions, OrderStatusDefaultOptions } from "@/stores/OrderStore";
import { useVisibilityState } from '@/hooks/useVisibilityState';
import ChatListItem from './Components/ChatListItem';
import ChatListFilter from './Components/ChatListFilter';
@ -14,10 +15,12 @@ import useStyleStore from '@/stores/StyleStore';
import dayjs from 'dayjs';
import { DATETIME_FORMAT } from '@/config';
/**
* []
*/
const Conversations = () => {
const { message } = App.useApp();
const [mobile] = useStyleStore((state) => [state.mobile]);
const routerReplace = mobile === false ? true : false; // : true;
const routePrefix = mobile === false ? `/order/chat` : `/m/chat`;
@ -26,8 +29,12 @@ const Conversations = () => {
const { order_sn } = useParams();
const navigate = useNavigate();
const userId = useAuthStore((state) => state.loginUser.userId);
const initialState = useConversationStore((state) => state.initialState);
const [currentConversation, setCurrentConversation] = useConversationStore((state) => [state.currentConversation, state.setCurrentConversation]);
const [customerDetail] = useOrderStore((s) => [s.customerDetail])
const [currentConversation, setCurrentConversation, updateCurrentConversation] = useConversationStore((state) => [state.currentConversation, state.setCurrentConversation, state.updateCurrentConversation]);
const [topList, pageList, conversationsList] = useConversationStore((state) => [state.topList, state.pageList, state.conversationsList]);
const [conversationsListLoading, setConversationsListLoading] = useConversationStore((state) => [state.conversationsListLoading, state.setConversationsListLoading]);
const addToConversationList = useConversationStore((state) => state.addToConversationList);
@ -35,16 +42,22 @@ const Conversations = () => {
const isVisible = useVisibilityState();
const [tabSelectedConversation, setTabSelectedConversation] = useState({});
const [tabCnt, setTabCnt] = useState(-1);
const [{ search: searchContent, loadNextPage, ...filterState }, setSearchContent, setFilter] = useConversationStore((state) => [state.filter, state.setFilterSearch, state.setFilter])
const [activeList, setActiveList] = useState(true);
const [currentLoading, setCurrentLoading] = useState(false);
const [shouldFetchCList, setShouldFetchCList] = useState(true);
/**
*
*/
let refreshing = false;
async function refreshConversationList(current='', append=false) {
// console.log('invoke -- refreshConversationList', current, conversationsListLoading, refreshing);
if (refreshing !== false) {
return false;
}
refreshing = true;
// setConversationsListLoading(mobile !== undefined ? true : false);
setConversationsListLoading(true);
setCurrentLoading(current==='');
@ -67,6 +80,7 @@ const Conversations = () => {
}
const _list = await fetchConversationsList({ ...searchParams, opisn: userId });
// const _list = DebounceFetchList({ ...searchParams, opisn: userId });
// ,
if (current) {
@ -86,18 +100,30 @@ const Conversations = () => {
// } : {}),
});
refreshing = false;
setConversationsListLoading(false);
setCurrentLoading(false);
}
useEffect(() => {
if (mobile !== undefined) {
if (mobile !== false) {
setCurrentConversation({});
}
return () => {};
}, []);
const [activeList, setActiveList] = useState(true);
useEffect(() => {
if (order_sn && shouldFetchCList) {
setCurrentConversation({ coli_sn: Number(order_sn) })
// updateCurrentConversation({ coli_sn: Number(order_sn) });
} else {
// setCurrentConversation({ coli_sn: order_sn })
}
return () => {}
}, [order_sn])
useEffect(() => {
if (isVisible && initialState) {
@ -117,6 +143,9 @@ const Conversations = () => {
const [dataSource, setDataSource] = useState(conversationsList);
const [listUpdateFlag, setListUpdateFlag] = useState();
const [switchToC, setSwitchToC] = useState({});
useEffect(() => {
setDataSource([...topList, ...pageList]);
// setDataSource(activeList ? conversationsList: closedConversationsList);
@ -129,45 +158,51 @@ const Conversations = () => {
}
return () => {}
}, [conversationsList, initialState])
}, [order_sn, initialState, customerDetail.email])
const [switchToC, setSwitchToC] = useState({});
const [shouldFetchCList, setShouldFetchCList] = useState(true);
// useEffect(() => {
// console.log('shouldFetchCList', order_sn , shouldFetchCList , initialState);
const getOrderConversationList = async (colisn) => {
// if (order_sn && shouldFetchCList && initialState) {
// getOrderConversationList(order_sn);
// }
const { whatsapp_phone_number } = switchToC;
const whatsappID = coli_guest_WhatsApp || whatsapp_phone_number || '';
// if (isEmpty(conversationsList)) {
// return false;
// }
// return () => {};
// }, [order_sn, shouldFetchCList, initialState]);
let findCurrentOrderChats;
let findCurrentIndex;
let findCurrent;
const getOrderConversationList = async (colisn, WHATSAPP_ID = null) => {
const { whatsapp_phone_number } = switchToC;
const whatsappID = WHATSAPP_ID || coli_guest_WhatsApp || whatsapp_phone_number || '';
// let findCurrentOrderChats = conversationsList.filter((item) => `${item.coli_sn}` === `${colisn}`);
// 使opisn + whatsappID , whatsappID,
if (isEmpty(conversationsList)) {
return false;
}
let findCurrentOrderChats = conversationsList.filter((item) => `${item.whatsapp_phone_number}` === `${whatsappID}` && `${item.coli_sn}` === `${colisn}`)
let findCurrentIndex = isEmpty(findCurrentOrderChats) ? -1 : 0; // findCurrentOrderChats.length-1;
let findCurrent = findCurrentOrderChats[findCurrentIndex];
if (findCurrentIndex !== -1) {
addToConversationList(findCurrentOrderChats);
} else if (!isEmpty(whatsappID)) {
const data = await fetchOrderConversationsList({ opisn: userId, colisn: colisn, whatsappid: whatsappID });
if (!isEmpty(data)) {
addToConversationList(data);
findCurrentIndex = 0; // data.length-1; // data.lastIndexOf((item) => item.coli_sn === Number(colisn));
findCurrent = data[findCurrentIndex];
} else {
// findCurrentIndex = conversationsList.findIndex((item) => item.coli_sn === Number(colisn)); // data.findIndex((item) => item.sn === currentConversation.sn);
if (!isEmpty(whatsappID) || !isEmpty(customerDetail.email)) {
findCurrentOrderChats = conversationsList.filter(
(item) => `${item.coli_sn}` === `${colisn}` && (`${item.whatsapp_phone_number}` === `${whatsappID}` || `${item.channels?.email}` === `${customerDetail.email}`)
)
findCurrentIndex = isEmpty(findCurrentOrderChats) ? -1 : 0; // findCurrentOrderChats.length-1;
findCurrent = findCurrentOrderChats[findCurrentIndex];
if (findCurrentIndex !== -1) {
addToConversationList(findCurrentOrderChats);
} else // if (!isEmpty(whatsappID))
{
try {
const data = await fetchOrderConversationsList({ opisn: userId, colisn: colisn, whatsappid: whatsappID, email: customerDetail.email });
if (!isEmpty(data)) {
addToConversationList(data);
findCurrentIndex = 0; // data.length-1; // data.lastIndexOf((item) => item.coli_sn === Number(colisn));
findCurrent = data[findCurrentIndex];
} else {
// findCurrentIndex = conversationsList.findIndex((item) => item.coli_sn === Number(colisn)); // data.findIndex((item) => item.sn === currentConversation.sn);
}
} catch (error) {
// message.warning('')
}
}
} else if (isEmpty(whatsappID)) {
}
// else
if (isEmpty(whatsappID)) {
//
findCurrentIndex = conversationsList.findIndex((item) => `${item.coli_sn}` === `${colisn}`);
findCurrent = conversationsList[findCurrentIndex];
@ -306,7 +341,6 @@ const Conversations = () => {
refreshConversationList,
setListUpdateFlag,
onSwitchConversation,
tabSelectedConversation,
setNewChatModalVisible,
setEditingChat,
}}

@ -53,7 +53,7 @@ const generateQuoteContent = (mailData) => `<br><br>
<b>
<strong >Subject: </strong>
</b>
<span >${mailData.info.subject || ''}</span>
<span >${mailData.info?.MAI_Subject || ''}</span>
</p>
<p>
${mailData.content}
@ -65,52 +65,89 @@ const generateMailContent = (mailData) => `
${mailData.content}
</p>`
const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, toEmail, conversationid, quoteid, initial = {}, mailData: _mailData, action = 'reply', ...props }) => {
/**
* @property {string} fromEmail - 发件人邮箱
* @property {string} fromUser - 发件人用户
* @property {string} fromOrder - 发件人订单
* @property {string} toEmail - 收件人邮箱
* @property {string} conversationid - 会话ID
* @property {string} quoteid - 引用邮件ID
*/
const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, fromOrder, toEmail, conversationid, quoteid, initial = {}, mailData: _mailData, action = 'reply', ...props }) => {
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 })) || [];
const emailListMapped = emailListOption?.reduce((r, v) => ({ ...r, [v.opi_sn]: v }), {});
// const emailListMapped = emailListOption?.reduce((r, v) => ({ ...r, [v.opi_sn]: v }), {});
const emailListAddrMapped = emailListOption?.reduce((r, v) => ({ ...r, [v.email]: v }), {});
const emailListMatMapped = emailListOption?.reduce((r, v) => ({ ...r, [v.mat_sn]: v }), {});
// console.log('emailListMapped', emailListOption, emailListAddrMapped);
const mai_sn = quoteid;
const { loading, mailData } = useEmailDetail(mai_sn, _mailData)
const { loading: getLoading, mailData } = useEmailDetail(mai_sn, _mailData)
const [newFromEmail, setNewFromEmail] = useState(fromEmail);
const [newToEmail, setNewToEmail] = useState(toEmail);
const [emailOPI, setEmailOPI] = useState(fromUser);
const [stickToProps, setStickToProps] = useState({});
const [newFromEmail, setNewFromEmail] = useState('');
const [newToEmail, setNewToEmail] = useState('');
const [emailOPI, setEmailOPI] = useState('');
const [emailOrder, setEmailOrder] = useState('');
const [emailMat, setEmailMat] = useState('');
useEffect(() => {
const emailUser = mailData.info?.MAI_OPI_SN || fromUser // quote.order_opi
const emailUserMat = mailData.info?.MAI_MAT_SN
// const _default =
// emailListOption?.find((ele) => ele.opi_sn === emailUser && ele.default === true) ||
// emailListOption?.find((ele) => ele.opi_sn === emailUser && ele.backup === true) ||
// emailListOption?.find((ele) => ele.opi_sn === emailUser) ||
// emailListOption?.find((ele) => ele.default === true) ||
// emailListOption?.find((ele) => ele.backup === true)
// : ID,
// , 使focus, ID
// , , ID,
const [stickToCid, setStickToCid] = useState(conversationid);
useEffect(() => {
// console.log('emailEditorPopup effect', open, '\nto', toEmail)
setStickToProps({ fromEmail, fromUser, fromOrder, toEmail, conversationid, quoteid, action });
setNewFromEmail(fromEmail);
setEmailOPI(emailUser);
setNewToEmail(toEmail);
setStickToCid(conversationid)
setEmailOrder(fromOrder)
setEmailOPI(fromUser)
setNewFromEmail(fromEmail)
setNewToEmail(toEmail)
const _findMat = emailListAddrMapped?.[fromEmail]?.mat_sn
setEmailMat(emailUserMat || _findMat)
setEmailMat(_findMat)
// /, ,
const _findMatOld = emailListMatMapped?.[emailUserMat]
if (isEmpty(_findMat) && _findMatOld) {
if (open !== true) {
form.resetFields()
}
return () => {
setStickToProps({})
setStickToCid('')
setEmailOrder('')
setEmailOPI('')
setNewFromEmail('')
setNewToEmail('')
}
}, [open])
// /, 使
useEffect(() => {
const reEmailO = mailData.info?.MAI_COLI_SN
const reEmailUser = mailData.info?.MAI_OPI_SN
const reEmailUserMat = mailData.info?.MAI_MAT_SN
setEmailOrder(prev => reEmailO || prev);
setEmailOPI(prev => reEmailUser || prev);
setEmailMat(prev => reEmailUserMat || prev)
const _findMatOld = emailListMatMapped?.[reEmailUserMat]
if (_findMatOld) {
setNewFromEmail(_findMatOld.email)
setEmailOPI(_findMatOld.opi_sn)
setEmailMat(_findMatOld.mat_sn)
}
return () => {}
}, [open, fromEmail, fromUser, toEmail, mailData])
}, [mailData])
const handleSwitchEmail = (labelValue) => {
const { value } = labelValue
@ -120,24 +157,6 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, toEmail, convers
setEmailOPI(_findMat?.opi_sn)
};
const { notification, message } = App.useApp();
const [form] = Form.useForm();
// ID,
// , 使focus, ID
// , , ID,
const [stickToCid, setStickToCid] = useState(conversationid);
useEffect(() => {
setStickToCid(conversationid)
if (open !== true) {
form.resetFields();
}
return () => {}
}, [open])
const [isRichText, setIsRichText] = useState(mobile === false);
// const [isRichText, setIsRichText] = useState(false); //
const [htmlContent, setHtmlContent] = useState('');
@ -164,9 +183,6 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, toEmail, convers
const [initialForm, setInitialForm] = useState({});
const [initialContent, setInitialContent] = useState('');
/**
* 加载邮件数据
*/
useEffect(() => {
// console.log('quoteid', quoteid, isEmpty(quoteid), isEmpty(mailData.info));
@ -184,12 +200,12 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, toEmail, convers
}
const _formValues = {
to: info?.MAI_From || fromEmail,
to: info?.MAI_From || newFromEmail,
cc: info?.MAI_CS || '',
// bcc: quote.bcc || '',
subject: `Re: ${info.MAI_Subject || ''}`,
};
const forwardValues = { subject: `Fw: ${info.subject || ''}` };
const forwardValues = { subject: `Fw: ${info.MAI_Subject || ''}` };
if (action === 'reply') {
form.setFieldsValue(_formValues);
setInitialForm(_formValues);
@ -209,13 +225,13 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, toEmail, convers
setInitialContent(thisBody)
} else if (action === 'new') {
const newEmail = { to: toEmail, }
const newEmail = { to: newToEmail, }
form.setFieldsValue(newEmail);
setInitialForm(newEmail);
}
return () => {};
}, [open, action, mailData.info]);
}, [stickToProps, mailData.info, newToEmail, newFromEmail]);
const [openPlainTextConfirm, setOpenPlainTextConfirm] = useState(false);
const handlePlainTextOpenChange = ({ target }) => {
@ -306,15 +322,16 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, toEmail, convers
const [sendLoading, setSendLoading] = useState(false);
const onHandleSend = async () => {
console.log('onSend callback', '\nisRichText', isRichText);
// console.log('onSend callback', '\nisRichText', isRichText);
// console.log(form.getFieldsValue());
const body = structuredClone(form.getFieldsValue());
body.mailcontent = isRichText ? htmlContent : textContent;
body.from = newFromEmail || fromEmail;
body.from = newFromEmail;
body.attaList = fileList;
body.opi_sn = emailOPI;
body.mat_sn = emailMat;
console.log('body', body);
body.coli_sn = emailOrder || '';
// console.log('body', body, '\n', emailOrder);
const values = await form.validateFields();
body.cc = values.cc || '';
body.bcc = values.bcc || '';
@ -338,14 +355,14 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, toEmail, convers
try {
const bubbleMsg = cloneDeep(msgObj);
bubbleMsg.id = `${stickToCid}.${msgObj.id}`;
bubbleMsg.email.mai_sn = '';
// bubbleMsg.email.mai_sn = '';
bubbleMsg.content = undefined;
invokeEmailMessage(bubbleMsg);
// invokeEmailMessage(bubbleMsg);
const result = await postSendEmail(body);
// const mailSavedId = result.id || '';
// bubbleMsg.email.mai_sn = mailSavedId;
// invokeEmailMessage(bubbleMsg);
const mailSavedId = result.id || '';
bubbleMsg.email.mai_sn = mailSavedId;
invokeEmailMessage(bubbleMsg);
// setSendLoading(false);
@ -358,8 +375,9 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, toEmail, convers
duration: 3,
});
} finally {
setSendLoading(false);
}
setSendLoading(false);
};
@ -382,8 +400,8 @@ const EmailEditorPopup = ({ open, setOpen, fromEmail, fromUser, toEmail, convers
}}
title={
<>
{loading ? <LoadingOutlined className='mr-1' /> : null}
{initialForm.subject || `${!isEmpty(quoteid) ? '回复: ' : '写邮件: '} ${fromEmail || ''}`}
{getLoading ? <LoadingOutlined className='mr-1' /> : null}
{initialForm.subject || `${!isEmpty(quoteid) ? '回复: ' : '写邮件: '} ${newFromEmail || ''}`}
</>
}
footer={

@ -46,6 +46,7 @@ const EmailNewBtn = ({ ...props }) => {
setFromEmail(email_addr)
setToEmail(currentConversation?.channels?.email || customerDetail?.email || '')
}
return (
<ConfigProvider theme={{ token: { colorPrimary: '#6366f1' } }}>
<Flex gap={8} className='p-2 bg-gray-200 rounded rounded-b-none border-gray-300 border-solid border border-b-0 border-x-0' align={'center'} justify={'flex-end'}>
@ -80,7 +81,16 @@ const EmailNewBtn = ({ ...props }) => {
<Button icon={<EditIcon />} type='primary' onClick={() => openEditor(pickEmail.key)}>
新邮件
</Button>
<EmailEditorPopup {...{ open, setOpen }} fromEmail={fromEmail} fromUser={fromUser} conversationid={currentConversation.sn} toEmail={toEmail} action='new' key={'email-new-editor-popup'} />
<EmailEditorPopup
{...{ open, setOpen }}
fromEmail={fromEmail}
fromUser={fromUser}
fromOrder={currentConversation.coli_sn}
conversationid={currentConversation.sn}
toEmail={toEmail}
action='new'
key={'email-new-editor-popup'}
/>
</Flex>
</ConfigProvider>
)

@ -211,6 +211,7 @@ const MessagesWrapper = ({ updateRead = true, forceGetMessages }) => {
setOpen={setOpenEmailEditor}
fromEmail={fromEmail}
fromUser={Number(orderDetail?.opi_sn || userId)}
fromOrder={currentConversation.coli_sn}
quoteid={ReferEmailMsg.mai_sn || ReferEmailMsg.id}
conversationid={currentConversation.sn}
key={`email-msg-reply-top-popup_${ReferEmailMsg.id}`}

@ -55,7 +55,7 @@ const CustomerProfile = () => {
fetchOtherEmail(currentOrder)
.then(result => {
console.info(result)
// console.info(result)
})
.finally(() => setLoading(false))
.catch(reason => {

Loading…
Cancel
Save