diff --git a/packages/blocks/bubbles/src/constants.ts b/packages/blocks/bubbles/src/constants.ts index 761db5b16..398f02e32 100644 --- a/packages/blocks/bubbles/src/constants.ts +++ b/packages/blocks/bubbles/src/constants.ts @@ -4,4 +4,5 @@ export enum BubbleBlockType { VIDEO = "video", EMBED = "embed", AUDIO = "audio", + LOCATION = "location", } diff --git a/packages/whatsapp/src/convertMessageToWhatsAppMessage.ts b/packages/whatsapp/src/convertMessageToWhatsAppMessage.ts index c03c3ffb0..a10fad346 100644 --- a/packages/whatsapp/src/convertMessageToWhatsAppMessage.ts +++ b/packages/whatsapp/src/convertMessageToWhatsAppMessage.ts @@ -15,6 +15,7 @@ type Props = { message: ContinueChatResponse["messages"][number]; mediaCache?: UploadMediaCache; }; + export const convertMessageToWhatsAppMessage = async ({ message, mediaCache, @@ -39,13 +40,11 @@ export const convertMessageToWhatsAppMessage = async ({ case BubbleBlockType.IMAGE: { if (!message.content.url || isImageUrlNotCompatible(message.content.url)) return null; - if (mediaCache) { const mediaId = await getOrUploadMedia({ url: message.content.url, cache: mediaCache, }); - if (mediaId) { return { type: "image", @@ -55,7 +54,6 @@ export const convertMessageToWhatsAppMessage = async ({ }; } } - return { type: "image", image: { @@ -65,13 +63,11 @@ export const convertMessageToWhatsAppMessage = async ({ } case BubbleBlockType.AUDIO: if (!message.content.url) return null; - if (mediaCache) { const mediaId = await getOrUploadMedia({ url: message.content.url, cache: mediaCache, }); - if (mediaId) { return { type: "audio", @@ -81,7 +77,6 @@ export const convertMessageToWhatsAppMessage = async ({ }; } } - return { type: "audio", audio: { @@ -97,7 +92,6 @@ export const convertMessageToWhatsAppMessage = async ({ url: message.content.url, cache: mediaCache, }); - if (mediaId) { return { type: "video", @@ -107,7 +101,6 @@ export const convertMessageToWhatsAppMessage = async ({ }; } } - // Fall back to using the URL if pre-upload fails or credentials not provided return { type: "video", @@ -129,6 +122,19 @@ export const convertMessageToWhatsAppMessage = async ({ }, }; return null; + case BubbleBlockType.LOCATION: { + // Handle location messages + if (!message.content.latitude || !message.content.longitude) return null; + return { + type: "location", + location: { + latitude: message.content.latitude, + longitude: message.content.longitude, + name: message.content.name, + address: message.content.address, + }, + }; + } case BubbleBlockType.EMBED: if (!message.content.url) return null; return { diff --git a/packages/whatsapp/src/schemas.ts b/packages/whatsapp/src/schemas.ts index f3ad535b4..6014d7afe 100644 --- a/packages/whatsapp/src/schemas.ts +++ b/packages/whatsapp/src/schemas.ts @@ -76,6 +76,15 @@ const sendingMessageSchema = z.discriminatedUnion("type", [ type: z.literal("video"), video: mediaSchema, }), + z.object({ + type: z.literal("location"), + location: z.object({ + latitude: z.number(), + longitude: z.number(), + name: z.string().optional(), + address: z.string().optional(), + }), + }), z.object({ type: z.literal("interactive"), interactive: interactiveSchema, @@ -90,6 +99,7 @@ const incomingMessageReferral = z.object({ ctwa_clid: z.string().optional(), source_id: z.string().optional(), }); + export type WhatsAppMessageReferral = z.infer; const sharedIncomingMessageFieldsSchema = z.object({ @@ -274,7 +284,7 @@ const whatsAppComparisonSchema = z.object({ comparisonOperator: z.nativeEnum(ComparisonOperators).optional(), value: z.string().optional(), }); -export type WhatsAppComparison = z.infer; +export type WhatsAppComparison = z.infer; export type WhatsAppIncomingMessage = z.infer; export type WhatsAppSendingMessage = z.infer;