Skip to content

Commit 7743063

Browse files
Merge pull request #2220 from victoreduardo/evo/feature-pix
feature: handle with interactive button message for pix
2 parents f5e43a3 + 8707520 commit 7743063

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

src/api/integrations/chatbot/chatwoot/services/chatwoot.service.ts

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1654,6 +1654,10 @@ export class ChatwootService {
16541654
return result;
16551655
}
16561656

1657+
private isInteractiveButtonMessage(messageType: string, message: any) {
1658+
return messageType === 'interactiveMessage' && message.interactiveMessage?.nativeFlowMessage?.buttons?.length > 0;
1659+
}
1660+
16571661
private getAdsMessage(msg: any) {
16581662
interface AdsMessage {
16591663
title: string;
@@ -1972,8 +1976,9 @@ export class ChatwootService {
19721976
const adsMessage = this.getAdsMessage(body);
19731977

19741978
const reactionMessage = this.getReactionMessage(body.message);
1979+
const isInteractiveButtonMessage = this.isInteractiveButtonMessage(body.messageType, body.message);
19751980

1976-
if (!bodyMessage && !isMedia && !reactionMessage) {
1981+
if (!bodyMessage && !isMedia && !reactionMessage && !isInteractiveButtonMessage) {
19771982
this.logger.warn('no body message found');
19781983
return;
19791984
}
@@ -2098,6 +2103,50 @@ export class ChatwootService {
20982103
return;
20992104
}
21002105

2106+
if (isInteractiveButtonMessage) {
2107+
const buttons = body.message.interactiveMessage.nativeFlowMessage.buttons;
2108+
this.logger.info('is Interactive Button Message: ' + JSON.stringify(buttons));
2109+
2110+
for (const button of buttons) {
2111+
const buttonParams = JSON.parse(button.buttonParamsJson);
2112+
const paymentSettings = buttonParams.payment_settings;
2113+
2114+
if (button.name === 'payment_info' && paymentSettings[0].type === 'pix_static_code') {
2115+
const pixSettings = paymentSettings[0].pix_static_code;
2116+
const pixKeyType = (() => {
2117+
switch (pixSettings.key_type) {
2118+
case 'EVP':
2119+
return 'Chave Aleatória';
2120+
case 'EMAIL':
2121+
return 'E-mail';
2122+
case 'PHONE':
2123+
return 'Telefone';
2124+
default:
2125+
return pixSettings.key_type;
2126+
}
2127+
})();
2128+
const pixKey = pixSettings.key_type === 'PHONE' ? pixSettings.key.replace('+55', '') : pixSettings.key;
2129+
const content = `*${pixSettings.merchant_name}*\nChave PIX: ${pixKey} (${pixKeyType})`;
2130+
2131+
const send = await this.createMessage(
2132+
instance,
2133+
getConversation,
2134+
content,
2135+
messageType,
2136+
false,
2137+
[],
2138+
body,
2139+
'WAID:' + body.key.id,
2140+
quotedMsg,
2141+
);
2142+
if (!send) this.logger.warn('message not sent');
2143+
} else {
2144+
this.logger.warn('Interactive Button Message not mapped');
2145+
}
2146+
}
2147+
return;
2148+
}
2149+
21012150
const isAdsMessage = (adsMessage && adsMessage.title) || adsMessage.body || adsMessage.thumbnailUrl;
21022151
if (isAdsMessage) {
21032152
const imgBuffer = await axios.get(adsMessage.thumbnailUrl, { responseType: 'arraybuffer' });

0 commit comments

Comments
 (0)