import { cloneDeep, isEmpty } from "@/utils/utils"; import { v4 as uuid } from "uuid"; export const replaceTemplateString = (str, replacements) => { let result = str; let keys = str.match(/{{(.*?)}}/g).map(key => key.replace(/{{|}}/g, '')); for (let i = 0; i < keys.length; i++) { let replaceValue = replacements[i]; let template = new RegExp(`{{${keys[i]}}}`, 'g'); result = result.replace(template, replaceValue); } return result; } /** * // +8618777396951 lyj { "to": "+8613317835586", // qqs "msgtype": "text", "msgcontent": "{\"body\":\"txtmsgtest\"}" } */ export const sentMsgTypeMapped = { text: { type: 'text', contentToSend: (msg) => ({ action: 'message', actionId: msg.id, renderId: msg.id, to: msg.to, msgtype: 'text', msgcontent: { body: msg.text, ...(msg.context ? { context: msg.context } : {}) }, }), contentToRender: (msg) => ({ ...msg, actionId: msg.id, conversationid: msg.id.split('.')[0], ...(msg.context ? { reply: { message: msg.context.message_origin.text, title: msg.context.message_origin.senderName || 'Reference' } } : {}) }), }, whatsappTemplate: { contentToSend: (msg) => ({ action: 'message', actionId: msg.id, renderId: msg.id, to: msg.to, msgtype: 'template', msgcontent: msg.template }), contentToRender: (msg) => { console.log(msg); 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 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 { ...msg, actionId: msg.id, conversationid: msg.id.split('.')[0], type: 'text', title: msg.template_origin.components.header?.[0]?.text || '', text: templateDataMapped?.body?.text || '', // msg.template_origin.components.body?.[0]?.text || '', }; }, }, }; const whatsappMsgMapped = { 'whatsapp.inbound_message.received': { getMsg: (result) => { console.log('whatsapp.inbound_message.received', result); return isEmpty(result?.whatsappInboundMessage) ? null : { ...result.whatsappInboundMessage, conversationid: result.conversationid }; }, contentToRender: (contentObj) => { console.log('whatsapp.inbound_message.received to render', contentObj); // const contentObj = result?.whatsappInboundMessage || result; // debug: return parseRenderMessageItem(contentObj); }, contentToUpdate: () => null, }, 'whatsapp.message.updated': { getMsg: (result) => { console.log('getMsg', result); return isEmpty(result?.whatsappMessage) ? null : { ...result.whatsappMessage, conversationid: result.conversationid }; }, contentToRender: (contentObj) => { if ((contentObj?.status === 'failed' )) { contentObj = { ...contentObj, type: 'error', text: {body: `❌ Message failed to send.` }, // contentObj.errorMessage id: contentObj.id, wamid: contentObj.id, }; return parseRenderMessageItem(contentObj); } // * 仅更新消息状态, 没有输出 return null; }, contentToUpdate: (msgcontent) => ({ ...msgcontent, ...parseRenderMessageItem(msgcontent), id: msgcontent.wamid, status: msgStatusRenderMapped[(msgcontent?.status || 'failed')], sender: 'me', dateString: msgcontent.status==='failed' ? '发送失败 ❌' : '', }), }, }; export const msgStatusRenderMapped = { 'accepted': 'waiting', // 'sent', // 接口的发送请求 'sent': 'sent', 'delivered': 'received', 'read': 'read', 'failed': 'failed', }; export const receivedMsgTypeMapped = { ...cloneDeep(whatsappMsgMapped), 'message': { // 发送消息的同步记录 status: 'accepted' getMsg: (result) => ({ ...result, conversationid: result.actionId.split('.')[0] }), contentToRender: () => null, contentToUpdate: (msgcontent) => ({ ...msgcontent, actionId: msgcontent.actionId, id: msgcontent.wamid, status: msgStatusRenderMapped[(msgcontent?.status || 'failed')], conversationid: msgcontent.actionId.split('.')[0], // msgcontent.conversation.sn, }), }, 'error': { // 发送消息的同步返回: 发送失败时 getMsg: (result) => result, contentToRender: () => null, contentToUpdate: (msgcontent) => ({ ...msgcontent, id: msgcontent.actionId, status: msgcontent?.status || 'failed', dateString: '发送失败 ❌', conversationid: msgcontent.actionId.split('.')[0], }), }, }; export const whatsappMsgTypeMapped = { error: { type: (_m) => ({ type: 'system' }), data: (msg) => ({ id: msg.wamid, text: msg.errorCode ? msg.errorMessage : msg.text.body }), }, text: { type: 'text', data: (msg) => ({ id: msg.wamid, text: msg.text.body }), }, image: { type: 'photo', data: (msg) => ({ data: { id: msg.wamid, uri: msg.image.link, width: 200, height: 200, alt: '' }, onOpen: () => { console.log('Open image', msg.image.link); }, }), }, sticker: { type: 'photo', data: (msg) => ({ data: { id: msg.wamid, uri: msg.sticker.link, width: 150, height: 120, alt: '' }, }), }, video: { type: 'video', data: (msg) => ({ data: { id: msg.wamid, videoURL: msg.video.link, status: { click: true, loading: 0, download: true, }, }, }), }, audio: { type: 'audio', data: (msg) => ({ id: msg.wamid, data: { audioURL: msg.audio.link, }, }), }, unsupported: { type: 'system', data: (msg) => ({ text: 'Message type is currently not supported.' }) }, reaction: { type: 'text', data: (msg) => ({ id: msg.wamid, text: msg.reaction?.emoji || msg.reaction?.text?.body || 'Reaction', reply: { message: '{content}', title: 'React from' } }), // todo: }, document: { type: 'file', data: (msg) => ({ id: msg.wamid, text: msg.document.filename, data: { uri: msg.document.link, extension: 'PDF', status: { click: false, loading: 0, } } }), }, // location: 'location', // contact: 'contact', // 'contact-card': 'contact-card', // 'contact-card-with-photo': 'contact-card-with-photo', // 'contact-card-with-photo-and-label': 'contact-card-with-photo-and-label', template: { type: 'text', data: (msg) => { const templateDataMapped = msg.template?.components ? msg.template.components.reduce((r, v) => ({...r, [v.type]: v}), {}) : null; return { id: msg.wamid, text: templateDataMapped?.body?.text || templateDataMapped?.body?.parameters?.[0]?.text || '', title: msg.template.name } }, }, }; /** * render received msg */ export const parseRenderMessageItem = (msg) => { console.log('parseRenderMessageItem', msg); return { date: msg?.sendTime || msg?.createTime || '', ...(whatsappMsgTypeMapped?.[msg.type]?.data(msg) || {}), conversationid: msg.conversationid, ...(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, senderName: msg?.customerProfile?.name || msg.from, // status: msg?.status || 'waiting', // title: msg.customerProfile.name, // replyButton: true, customer_name: msg?.customerProfile?.name || '', whatsapp_name: msg?.customerProfile?.name || '', whatsapp_phone_number: msg.from, }; }; /** * 从数据库读取的记录 */ export const parseRenderMessageList = (messages, conversationid = null) => { return messages.map((msg) => { const msgContent = msg.msgtext_AsJOSN; msgContent.template = msg.msgtype === 'template' ? { ...msgContent.template, ...msg.template_AsJOSN } : {}; const msgType = msgContent.type; // const parseMethod = msgContent.bizType === 'whatsapp' ? cloneDeep(whatsappMsgTypeMapped) : {}; return { ...(whatsappMsgTypeMapped?.[msgType]?.data(msgContent) || {}), type: msgContent.type, ...(typeof whatsappMsgTypeMapped[msgType].type === 'function' ? whatsappMsgTypeMapped[msgType].type(msg) : { type: whatsappMsgTypeMapped[msgType].type || 'text' }), date: msgContent?.sendTime || msg.msgtime || '', sender: msgContent.from, senderName: msgContent?.customerProfile?.name || msgContent.from, ...(msg.msg_direction === 'outbound' ? { sender: 'me', senderName: 'me', status: msgStatusRenderMapped[msgContent?.status || 'failed'], dateString: msgStatusRenderMapped[msgContent?.status || 'failed'] === 'failed' ? '发送失败 ❌' : '', } : {}), // conversationid: conversationid, // title: msg.customerProfile.name, }; }); }; /** * WhatsApp Templates params * @deprecated */ export const whatsappTemplatesParamMapped = { /** @deprecated */ 'asia_highlights_has_receive_your_inquiry': [['customer_name']], 'hello_from_asia_highlights': [['agent_name']], // todo: 'hello_from_china_highlights': [['agent_name']], // todo: 'use_new_whatsapp': [['agent_name']], // todo: };