连接ws:// 传参opisn

dev/chat
Lei OT 1 year ago
parent 806ef7f90f
commit 491facce74

@ -1,3 +1,4 @@
import { v4 as uuid } from "uuid";
export const replaceTemplateString = (str, replacements) => { export const replaceTemplateString = (str, replacements) => {
let result = str; let result = str;
@ -23,21 +24,22 @@ export const replaceTemplateString = (str, replacements) => {
export const sentMsgTypeMapped = { export const sentMsgTypeMapped = {
text: { text: {
type: 'text', type: 'text',
contentToSend: (msg) => ({ renderId: msg.id, to: msg.to, msgtype: 'text', msgcontent: { body: msg.text } }), contentToSend: (msg) => ({ action: 'message', actionId: uuid(), renderId: msg.id, to: msg.to, msgtype: 'text', msgcontent: { body: msg.text } }),
contentToRender: (msg) => ({ ...msg }), contentToRender: (msg) => ({ ...msg }),
}, },
whatsappTemplate: { whatsappTemplate: {
contentToSend: (msg) => ({ renderId: msg.id, to: msg.to, msgtype: 'template', msgcontent: msg.template }), contentToSend: (msg) => ({ action: 'message', actionId: uuid(), renderId: msg.id, to: msg.to, msgtype: 'template', msgcontent: msg.template }),
contentToRender: (msg) => { contentToRender: (msg) => {
console.log(msg); console.log(msg);
const templateDataMapped = msg.template?.components ? msg.template.components.reduce((r, v) => ({...r, [v.type]: v}), {}) : null; const templateDataMapped = msg.template?.components ? msg.template.components.reduce((r, v) => ({...r, [v.type]: v}), {}) : null;
const templateParam = (templateDataMapped?.body?.parameters || []).map(e => e.text); const templateParam = (templateDataMapped?.body?.parameters || []).map(e => e.text);
const fillTemplate = templateParam.length ? replaceTemplateString(msg.template_origin.components.body?.[0]?.text || '', templateParam) : (msg.template_origin.components.body?.[0]?.text || ''); const fillTemplate = templateParam.length ? replaceTemplateString(msg.template_origin.components.body?.[0]?.text || '', templateParam) : (msg.template_origin.components.body?.[0]?.text || '');
const footer = msg.template_origin.components?.footer?.[0]?.text || '';
return { return {
...msg, ...msg,
type: 'text', type: 'text',
title: msg.template_origin.components.header?.[0]?.text || '', title: msg.template_origin.components.header?.[0]?.text || '',
text: fillTemplate, // msg.template_origin.components.body?.[0]?.text || '', text: `${fillTemplate}`, // msg.template_origin.components.body?.[0]?.text || '',
}; };
}, },
}, },
@ -60,6 +62,8 @@ export const whatsappMsgMapped = {
return result?.whatsappMessage || null; return result?.whatsappMessage || null;
}, },
contentToRender: (msgcontent) => { contentToRender: (msgcontent) => {
return null; // todo: 仅更新消息状态, 没有输出
let contentObj = msgcontent?.whatsappMessage || msgcontent; // debug: let contentObj = msgcontent?.whatsappMessage || msgcontent; // debug:
if ((contentObj?.status === 'failed' )) { if ((contentObj?.status === 'failed' )) {
contentObj = { contentObj = {
@ -68,7 +72,9 @@ export const whatsappMsgMapped = {
id: contentObj.id, id: contentObj.id,
wamid: contentObj.id, wamid: contentObj.id,
}; };
return contentObj;
} }
return null;
console.log('whatsapp.message.updated to render', contentObj); console.log('whatsapp.message.updated to render', contentObj);
const _r = parseRenderMessageItem(contentObj); const _r = parseRenderMessageItem(contentObj);
console.log('_r', _r); console.log('_r', _r);
@ -144,12 +150,16 @@ export const whatsappMsgTypeMapped = {
// 'contact-card-with-photo': 'contact-card-with-photo', // 'contact-card-with-photo': 'contact-card-with-photo',
// 'contact-card-with-photo-and-label': 'contact-card-with-photo-and-label', // 'contact-card-with-photo-and-label': 'contact-card-with-photo-and-label',
}; };
/**
* render received msg
*/
export const parseRenderMessageItem = (msg) => { export const parseRenderMessageItem = (msg) => {
console.log('parseRenderMessageItem', msg); console.log('parseRenderMessageItem', msg);
return { return {
date: msg?.sendTime || '', date: msg?.sendTime || '',
...(whatsappMsgTypeMapped?.[msg.type]?.data(msg) || {}), ...(whatsappMsgTypeMapped?.[msg.type]?.data(msg) || {}),
...(whatsappMsgTypeMapped?.[msg.type]?.type(msg) || { type: 'text' }), // type: whatsappMsgTypeMapped?.[msg.type]?.type || 'text', ...(typeof whatsappMsgTypeMapped?.[msg.type]?.type === 'function' ? whatsappMsgTypeMapped?.[msg.type]?.type(msg) : { type: whatsappMsgTypeMapped?.[msg.type]?.type || 'text' }),
// type: whatsappMsgTypeMapped?.[msg.type]?.type || 'text',
sender: msg.from, sender: msg.from,
status: msg?.status || 'waiting', status: msg?.status || 'waiting',
// title: msg.customerProfile.name, // title: msg.customerProfile.name,

@ -4,15 +4,16 @@ import { v4 as uuid } from "uuid";
export class RealTimeAPI { export class RealTimeAPI {
constructor(param) { constructor(param) {
this.webSocket = webSocket(param).pipe( this.webSocket = webSocket(param)
retryWhen(errors => // .pipe(
errors.pipe( // retryWhen(errors =>
tap(val => console.error(`WebSocket connection failed with error: ${val}`)), // errors.pipe(
delay(5000), // retry after 5 seconds // tap(val => console.error(`WebSocket connection failed with error: ${val}`)),
take(5) // delay(5000), // retry after 5 seconds
) // take(5)
) // )
); // )
// );
} }
getObservable() { getObservable() {

@ -38,7 +38,7 @@ const router = createBrowserRouter([
{ path: 'order/follow', element: <OrderFollow /> }, { path: 'order/follow', element: <OrderFollow /> },
{ path: 'chat/history', element: <ChatHistory /> }, { path: 'chat/history', element: <ChatHistory /> },
{ path: 'sales/management', element: <SalesManagement /> }, { path: 'sales/management', element: <SalesManagement /> },
{ path: 'order/chat/:order_id', element: <Conversations /> }, { path: 'order/chat/:order_sn', element: <Conversations /> },
{ path: 'order/chat', element: <Conversations /> }, { path: 'order/chat', element: <Conversations /> },
{ path: 'account/profile', element: <AccountProfile /> }, { path: 'account/profile', element: <AccountProfile /> },
], ],

@ -18,14 +18,9 @@ export async function fetchJSON(url, data) {
return await response.json(); return await response.json();
} }
// const API_HOST = 'http://202.103.68.144:8888';
const API_HOST = 'http://202.103.68.144:8888'; const API_HOST = 'http://202.103.68.144:8888';
// const WS_URL = 'ws://202.103.68.144:8888/whatever/';
const WS_URL = 'ws://202.103.68.157:8888/whatever/';
// let realtimeAPI = new RealTimeAPI({ url: URL, protocol: 'aaa' });
let realtimeAPI = new RealTimeAPI({ url: WS_URL, protocol: 'WhatsApp' });
export const useConversations = () => { export const useConversations = ({loginUser, realtimeAPI}) => {
const [errors, setErrors] = useState([]); const [errors, setErrors] = useState([]);
const [messages, setMessages] = useState([]); // active conversation const [messages, setMessages] = useState([]); // active conversation
@ -42,12 +37,11 @@ export const useConversations = () => {
}, [currentConversation]); }, [currentConversation]);
useEffect(() => { useEffect(() => {
console.log(errors, 'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww'); console.log(errors, 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee');
return () => {}; return () => {};
}, [errors]) }, [errors])
useEffect(() => { useEffect(() => {
realtimeAPI.onError(addError.bind(null, 'Error')); realtimeAPI.onError(addError.bind(null, 'Error'));
realtimeAPI.onMessage(handleMessage); realtimeAPI.onMessage(handleMessage);
@ -165,6 +159,7 @@ export const useConversations = () => {
if (ele.id === message.id) { if (ele.id === message.id) {
return {...ele, id: message.id, status: message.status}; // todo: renderId 需要返回 return {...ele, id: message.id, status: message.status}; // todo: renderId 需要返回
} }
// return {...ele, status: 'failed', dateString: '❌'}; // debug: 0
return ele; return ele;
}); });
}); });
@ -180,8 +175,11 @@ export const useConversations = () => {
if (!result) { if (!result) {
return false; return false;
} }
if (errcode !== 0) {
// addError('Error Connecting to Server');
}
if (typeof result.type === 'string' && result.type === 'error') { if (typeof result.type === 'string' && result.type === 'error') {
addError('Error Connecting to Server'); // addError('Error Connecting to Server');
} }
console.log(result.type, 'result.type'); console.log(result.type, 'result.type');
const msgObj = whatsappMsgMapped[result.type].getMsg(result); const msgObj = whatsappMsgMapped[result.type].getMsg(result);

@ -4,11 +4,12 @@ import { Input, Button, Tabs, List, Space, Popover, Flex } from 'antd';
import { useConversationContext } from '@/stores/Conversations/ConversationContext'; import { useConversationContext } from '@/stores/Conversations/ConversationContext';
import { LikeOutlined, MessageOutlined, StarOutlined, SendOutlined, PlusOutlined, PlusCircleOutlined } from '@ant-design/icons'; import { LikeOutlined, MessageOutlined, StarOutlined, SendOutlined, PlusOutlined, PlusCircleOutlined } from '@ant-design/icons';
import { isEmpty } from '@/utils/utils'; import { isEmpty } from '@/utils/utils';
import { v4 as uuid } from "uuid";
const InputBox = (({ onSend }) => { const InputBox = (({ onSend }) => {
const { currentConversation, templates } = useConversationContext(); const { currentConversation, templates } = useConversationContext();
const [textContent, setTextContent] = useState(''); const [textContent, setTextContent] = useState('');
console.log('ttt'); console.log('ttt', uuid());
const handleSendText = () => { const handleSendText = () => {
// console.log(textContent); // console.log(textContent);
@ -19,7 +20,7 @@ const InputBox = (({ onSend }) => {
sender: 'me', sender: 'me',
// from: '', // from: '',
to: currentConversation.channel_id, to: currentConversation.channel_id,
id: Date.now().toString(16), id: uuid(), // Date.now().toString(16),
date: new Date(), date: new Date(),
status: 'waiting', status: 'waiting',
// renderAddCmp: () => ( // renderAddCmp: () => (
@ -43,7 +44,7 @@ const InputBox = (({ onSend }) => {
const msgObj = { const msgObj = {
type: 'whatsappTemplate', type: 'whatsappTemplate',
to: currentConversation.channel_id, to: currentConversation.channel_id,
id: Date.now().toString(16), id: uuid(), // Date.now().toString(16),
date: new Date(), date: new Date(),
status: 'waiting', status: 'waiting',
statusTitle: 'Ready to send', statusTitle: 'Ready to send',

@ -31,15 +31,20 @@ const Messages = (() => {
<div> <div>
{messagesList.map((message, index) => ( {messagesList.map((message, index) => (
<MessageBox <MessageBox
className={message.sender === 'me' ? 'whatsappme-container' : ''} // className={message.sender === 'me' ? 'whatsappme-container' : ''}
key={message.id} key={message.id}
position={message.sender === 'me' ? 'right' : 'left'} position={message.sender === 'me' ? 'right' : 'left'}
{...message} {...message}
onOpen={() => handlePreview(message)} onOpen={() => handlePreview(message)}
letterItem={{ id: 1, letter: 'AS' }} // letterItem={{ id: 1, letter: 'AS' }}
// 'waiting'| 'sent' | 'received' | 'read' // 'waiting'| 'sent' | 'received' | 'read'
styles={{backgroundColor: message.sender === 'me' ? '#ccd5ae' : 'inherit'}} styles={{backgroundColor: message.sender === 'me' ? '#ccd5ae' : ''}}
notchStyle={{fill: '#ccd5ae'}} {...(message.sender === 'me' ? {
style: { backgroundColor: '#ccd5ae' },
notchStyle: {fill: '#ccd5ae'},
className: 'whatsappme-container',
} : {})}
// notchStyle={{fill: '#ccd5ae'}}
// copiableDate={false} // copiableDate={false}
/> />
))} ))}

@ -1,9 +1,28 @@
import { useContext } from 'react';
import { ConversationContext, useConversations, } from '@/stores/Conversations/ConversationContext'; import { ConversationContext, useConversations, } from '@/stores/Conversations/ConversationContext';
import { AuthContext } from '@/stores/AuthContext';
import { RealTimeAPI } from '@/lib/realTimeAPI';
export const ConversationProvider = ({ children }) => { const WS_URL = 'ws://202.103.68.157:8888/whatever/';
const conversations = useConversations(); export const ConversationProvider = ({ children, loginUser, realtimeAPI }) => {
const conversations = useConversations({loginUser, realtimeAPI});
return <ConversationContext.Provider value={conversations}>{children}</ConversationContext.Provider>; return <ConversationContext.Provider value={conversations}>{children}</ConversationContext.Provider>;
}; };
export default ConversationProvider; // export default ConversationProvider;
const AuthAndConversationProvider = ({ children }) => {
const { loginUser } = useContext(AuthContext);
const {userId} = loginUser;
const realtimeAPI = new RealTimeAPI({ url: `${WS_URL}?opisn=${userId || ''}&aa=m&_spam=${Date.now().toString()}`, protocol: 'WhatsApp' });
return (
<ConversationProvider loginUser={loginUser} realtimeAPI={realtimeAPI} >
{children}
</ConversationProvider>
);
};
export default AuthAndConversationProvider;

@ -20,16 +20,9 @@
} }
/** Chat Window */ /** Chat Window */
.chatwindow-wrapper .rce-container-mbox.whatsappme-container .rce-mbox{
background-color: darkseagreen;
/* box-shadow: 0px 1px 1px 1px darkseagreen; */
}
.chatwindow-wrapper .rce-container-mbox .rce-mbox{ .chatwindow-wrapper .rce-container-mbox .rce-mbox{
max-width: 400px; max-width: 400px;
} }
.chatwindow-wrapper .rce-container-mbox.whatsappme-container .rce-mbox-right-notch{
fill: darkseagreen;
}
.chatwindow-wrapper .rce-mbox-time-block{ .chatwindow-wrapper .rce-mbox-time-block{
background: linear-gradient(0deg,#00000014,#0000); background: linear-gradient(0deg,#00000014,#0000);
color: #00000073; color: #00000073;

Loading…
Cancel
Save