From 566e7a9a2966b8a1e87510092969af2fe847ca6d Mon Sep 17 00:00:00 2001 From: Renato Alcara Date: Sat, 14 Feb 2026 22:55:32 -0300 Subject: [PATCH] fix: separate carousel header title from body text to avoid duplicate display Previously the same `text` field was used for both header.title and body.text, causing duplicate content to appear. Now `title` controls the header (defaults to a space like Pastorini) and `text` controls the body independently. Co-Authored-By: Claude Opus 4.6 --- src/Types/Message.ts | 2 ++ src/Utils/messages.ts | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Types/Message.ts b/src/Types/Message.ts index fcd9252a..1df1f129 100644 --- a/src/Types/Message.ts +++ b/src/Types/Message.ts @@ -467,6 +467,8 @@ export type CarouselCardInput = { export type CarouselMessageOptions = { /** Cards in the carousel (2-10 recommended) */ cards: CarouselCardInput[] + /** Header title (displayed once above the carousel) */ + title?: string /** Main body text */ text?: string /** Footer text */ diff --git a/src/Utils/messages.ts b/src/Utils/messages.ts index 1179be8b..c2e94832 100644 --- a/src/Utils/messages.ts +++ b/src/Utils/messages.ts @@ -591,7 +591,7 @@ export const generateCarouselMessage = async ( options: CarouselMessageOptions, mediaOptions?: MessageContentGenerationOptions ): Promise => { - const { cards, text, footer } = options + const { cards, title, text, footer } = options if (!cards || cards.length < 2) { throw new Boom('Carousel requires at least 2 cards', { statusCode: 400 }) @@ -689,7 +689,7 @@ export const generateCarouselMessage = async ( // - messageVersion: 1 in carouselMessage // - Body and footer at root level const interactiveMessage: proto.Message.IInteractiveMessage = { - header: { title: text || '', hasMediaAttachment: false }, + header: { title: title || ' ', hasMediaAttachment: false }, body: { text: text || '' }, footer: footer ? { text: footer } : undefined, carouselMessage: { @@ -1238,6 +1238,7 @@ export const generateWAMessageContent = async ( const carouselMsg = message as any const carouselOptions: CarouselMessageOptions = { cards: carouselMsg.nativeCarousel.cards, + title: carouselMsg.nativeCarousel.title || carouselMsg.title, text: carouselMsg.text, footer: carouselMsg.footer }