From 94cb9d2a7c73d0ee3d37c8c1d9b637c2c7aea094 Mon Sep 17 00:00:00 2001 From: Mohamed Marrouchi Date: Tue, 20 May 2025 15:57:32 +0100 Subject: [PATCH] feat: adjust local fallback --- api/src/chat/services/block.service.spec.ts | 20 ++++- api/src/chat/services/block.service.ts | 94 ++++++++++++--------- 2 files changed, 70 insertions(+), 44 deletions(-) diff --git a/api/src/chat/services/block.service.spec.ts b/api/src/chat/services/block.service.spec.ts index 2d1a7137..627979a9 100644 --- a/api/src/chat/services/block.service.spec.ts +++ b/api/src/chat/services/block.service.spec.ts @@ -832,9 +832,13 @@ describe('BlockService', () => { ); expect(env).toEqual({ - format: OutgoingMessageFormat.text, + format: OutgoingMessageFormat.quickReplies, message: { text: 'Local fallback message ...', + quickReplies: [ + { content_type: QuickReplyType.text, title: 'Yes', payload: 'YES' }, + { content_type: QuickReplyType.text, title: 'No', payload: 'NO' }, + ], }, }); }); @@ -938,9 +942,21 @@ describe('BlockService', () => { ); expect(env).toEqual({ - format: OutgoingMessageFormat.text, + format: OutgoingMessageFormat.buttons, message: { text: 'Local fallback message ...', + buttons: [ + { + type: ButtonType.postback, + title: 'Red', + payload: 'RED', + }, + { + type: ButtonType.postback, + title: 'Green', + payload: 'GREEN', + }, + ], }, }); }); diff --git a/api/src/chat/services/block.service.ts b/api/src/chat/services/block.service.ts index dbc3cc29..4cc05513 100644 --- a/api/src/chat/services/block.service.ts +++ b/api/src/chat/services/block.service.ts @@ -36,7 +36,6 @@ import { Label } from '../schemas/label.schema'; import { Subscriber } from '../schemas/subscriber.schema'; import { Context } from '../schemas/types/context'; import { - BlockMessage, OutgoingMessageFormat, StdOutgoingEnvelope, StdOutgoingSystemEnvelope, @@ -623,55 +622,64 @@ export class BlockService extends BaseService< settings, this.i18n, ); - const blockMessage: BlockMessage = - isLocalFallback && block.options?.fallback - ? [...block.options.fallback.message] - : Array.isArray(block.message) - ? [...block.message] - : { ...block.message }; + const fallback = isLocalFallback ? block.options.fallback : undefined; - if (Array.isArray(blockMessage)) { + if (Array.isArray(block.message)) { // Text Message - return envelopeFactory.buildTextEnvelope(blockMessage); - } else if (blockMessage && 'text' in blockMessage) { + return envelopeFactory.buildTextEnvelope( + fallback ? fallback.message : block.message, + ); + } else if ('text' in block.message) { if ( - 'quickReplies' in blockMessage && - Array.isArray(blockMessage.quickReplies) && - blockMessage.quickReplies.length > 0 + 'quickReplies' in block.message && + Array.isArray(block.message.quickReplies) && + block.message.quickReplies.length > 0 ) { return envelopeFactory.buildQuickRepliesEnvelope( - blockMessage.text, - blockMessage.quickReplies, + fallback ? fallback.message : block.message.text, + block.message.quickReplies, ); } else if ( - 'buttons' in blockMessage && - Array.isArray(blockMessage.buttons) && - blockMessage.buttons.length > 0 + 'buttons' in block.message && + Array.isArray(block.message.buttons) && + block.message.buttons.length > 0 ) { return envelopeFactory.buildButtonsEnvelope( - blockMessage.text, - blockMessage.buttons, + fallback ? fallback.message : block.message.text, + block.message.buttons, ); } - } else if (blockMessage && 'attachment' in blockMessage) { - const attachmentPayload = blockMessage.attachment.payload; + } else if ('attachment' in block.message) { + const attachmentPayload = block.message.attachment.payload; if (!('id' in attachmentPayload)) { this.checkDeprecatedAttachmentUrl(block); throw new Error( 'Remote attachments in blocks are no longer supported!', ); } + const quickReplies = block.message.quickReplies + ? [...block.message.quickReplies] + : []; - return envelopeFactory.buildAttachmentEnvelope( - { - type: blockMessage.attachment.type, - payload: blockMessage.attachment.payload, - }, - blockMessage.quickReplies ? [...blockMessage.quickReplies] : undefined, - ); + if (fallback) { + return quickReplies.length > 0 + ? envelopeFactory.buildQuickRepliesEnvelope( + fallback.message, + block.message.quickReplies ? [...block.message.quickReplies] : [], + ) + : envelopeFactory.buildTextEnvelope(fallback.message); + } else { + return envelopeFactory.buildAttachmentEnvelope( + { + type: block.message.attachment.type, + payload: block.message.attachment.payload, + }, + block.message.quickReplies ? [...block.message.quickReplies] : [], + ); + } } else if ( - blockMessage && - 'elements' in blockMessage && + block.message && + 'elements' in block.message && block.options?.content ) { const contentBlockOptions = block.options.content; @@ -691,14 +699,16 @@ export class BlockService extends BaseService< skip, ); - return envelopeFactory.buildListEnvelope( - contentBlockOptions.display as - | OutgoingMessageFormat.list - | OutgoingMessageFormat.carousel, - contentBlockOptions, - elements, - pagination, - ); + return fallback + ? envelopeFactory.buildTextEnvelope(fallback.message) + : envelopeFactory.buildListEnvelope( + contentBlockOptions.display as + | OutgoingMessageFormat.list + | OutgoingMessageFormat.carousel, + contentBlockOptions, + elements, + pagination, + ); } catch (err) { this.logger.error( 'Unable to retrieve content for list template process', @@ -706,10 +716,10 @@ export class BlockService extends BaseService< ); throw err; } - } else if (blockMessage && 'plugin' in blockMessage) { + } else if (block.message && 'plugin' in block.message) { const plugin = this.pluginService.findPlugin( PluginType.block, - blockMessage.plugin, + block.message.plugin, ); // Process custom plugin block try { @@ -722,7 +732,7 @@ export class BlockService extends BaseService< return envelope; } catch (e) { this.logger.error('Plugin was unable to load/process ', e); - throw new Error(`Unknown plugin - ${JSON.stringify(blockMessage)}`); + throw new Error(`Unknown plugin - ${JSON.stringify(block.message)}`); } } throw new Error('Invalid message format.');