42 lines
1.4 KiB
TypeScript
42 lines
1.4 KiB
TypeScript
import {
|
|
WhatsAppWebhookRequestBody,
|
|
whatsAppWebhookRequestBodySchema,
|
|
} from '@typebot.io/schemas/features/whatsapp'
|
|
import { resumeWhatsAppFlow } from '@typebot.io/bot-engine/whatsapp/resumeWhatsAppFlow'
|
|
import { isNotDefined } from '@typebot.io/lib'
|
|
import { env } from '@typebot.io/env'
|
|
import type { RequestContext } from '@vercel/edge'
|
|
|
|
const processWhatsAppReply = async (
|
|
entry: WhatsAppWebhookRequestBody['entry']
|
|
) => {
|
|
const receivedMessage = entry.at(0)?.changes.at(0)?.value.messages?.at(0)
|
|
if (isNotDefined(receivedMessage)) return { message: 'No message found' }
|
|
const contactName =
|
|
entry.at(0)?.changes.at(0)?.value?.contacts?.at(0)?.profile?.name ?? ''
|
|
const contactPhoneNumber =
|
|
entry.at(0)?.changes.at(0)?.value?.messages?.at(0)?.from ?? ''
|
|
return resumeWhatsAppFlow({
|
|
receivedMessage,
|
|
sessionId: `wa-preview-${receivedMessage.from}`,
|
|
contact: {
|
|
name: contactName,
|
|
phoneNumber: contactPhoneNumber,
|
|
},
|
|
})
|
|
}
|
|
|
|
export async function POST(request: Request, context: RequestContext) {
|
|
if (!env.WHATSAPP_PREVIEW_FROM_PHONE_NUMBER_ID)
|
|
return new Response(
|
|
'WHATSAPP_PREVIEW_FROM_PHONE_NUMBER_ID is not defined',
|
|
{
|
|
status: 500,
|
|
}
|
|
)
|
|
const body = await request.json()
|
|
const { entry } = whatsAppWebhookRequestBodySchema.parse(body)
|
|
context.waitUntil(processWhatsAppReply(entry))
|
|
return new Response('Message is being processed.', { status: 200 })
|
|
}
|