Skip to content

Commit 27633aa

Browse files
committed
feature: handle with interactive button message for pix
1 parent df20c5f commit 27633aa

File tree

1 file changed

+53
-1
lines changed

1 file changed

+53
-1
lines changed

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

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1666,6 +1666,13 @@ export class ChatwootService {
16661666
return result;
16671667
}
16681668

1669+
private isInteractiveButtonMessage(messageType: string, message: any) {
1670+
return (
1671+
messageType === 'interactiveMessage' &&
1672+
message.interactiveMessage?.nativeFlowMessage?.buttons?.length > 0
1673+
);
1674+
}
1675+
16691676
private getAdsMessage(msg: any) {
16701677
interface AdsMessage {
16711678
title: string;
@@ -1984,8 +1991,9 @@ export class ChatwootService {
19841991
const adsMessage = this.getAdsMessage(body);
19851992

19861993
const reactionMessage = this.getReactionMessage(body.message);
1994+
const isInteractiveButtonMessage = this.isInteractiveButtonMessage(body.messageType, body.message);
19871995

1988-
if (!bodyMessage && !isMedia && !reactionMessage) {
1996+
if (!bodyMessage && !isMedia && !reactionMessage && !isInteractiveButtonMessage) {
19891997
this.logger.warn('no body message found');
19901998
return;
19911999
}
@@ -2118,6 +2126,50 @@ export class ChatwootService {
21182126
return;
21192127
}
21202128

2129+
if (isInteractiveButtonMessage) {
2130+
const buttons = body.message.interactiveMessage.nativeFlowMessage.buttons;
2131+
this.logger.info('is Interactive Button Message: ' + JSON.stringify(buttons));
2132+
2133+
for (const button of buttons) {
2134+
const buttonParams = JSON.parse(button.buttonParamsJson);
2135+
const paymentSettings = buttonParams.payment_settings;
2136+
2137+
if (button.name === 'payment_info' && paymentSettings[0].type === 'pix_static_code') {
2138+
const pixSettings = paymentSettings[0].pix_static_code;
2139+
const pixKeyType = (() => {
2140+
switch (pixSettings.key_type) {
2141+
case 'EVP':
2142+
return 'Chave Aleatória';
2143+
case 'EMAIL':
2144+
return 'E-mail';
2145+
case 'PHONE':
2146+
return 'Telefone';
2147+
default:
2148+
return pixSettings.key_type;
2149+
}
2150+
})();
2151+
const pixKey = pixSettings.key_type === 'PHONE' ? pixSettings.key.replace('+55', '') : pixSettings.key;
2152+
const content = `*${pixSettings.merchant_name}*\nChave PIX: ${pixKey} (${pixKeyType})`;
2153+
2154+
const send = await this.createMessage(
2155+
instance,
2156+
getConversation,
2157+
content,
2158+
messageType,
2159+
false,
2160+
[],
2161+
body,
2162+
'WAID:' + body.key.id,
2163+
quotedMsg,
2164+
);
2165+
if (!send) this.logger.warn('message not sent');
2166+
} else {
2167+
this.logger.warn('Interactive Button Message not mapped');
2168+
}
2169+
}
2170+
return;
2171+
}
2172+
21212173
const isAdsMessage = (adsMessage && adsMessage.title) || adsMessage.body || adsMessage.thumbnailUrl;
21222174
if (isAdsMessage) {
21232175
const imgBuffer = await axios.get(adsMessage.thumbnailUrl, { responseType: 'arraybuffer' });

0 commit comments

Comments
 (0)