messaging-api-messenger
Version:
Messaging API client for Messenger
388 lines (345 loc) • 9.27 kB
text/typescript
import FormData from 'form-data';
import omit from 'lodash/omit';
import { camelcaseKeysDeep, snakecaseKeysDeep } from 'messaging-api-common';
import * as MessengerTypes from './MessengerTypes';
function createMessage(
payload: MessengerTypes.Message,
options: { quickReplies?: MessengerTypes.QuickReply[] } = {}
): MessengerTypes.Message {
const message = {
...payload,
};
// snakecase support for backward compatibility
const quickReplies =
options.quickReplies ||
// @ts-expect-error
options.quick_replies;
if (quickReplies && Array.isArray(quickReplies) && quickReplies.length >= 1) {
message.quickReplies = quickReplies;
}
return camelcaseKeysDeep(message);
}
function createText(
text: string,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createMessage({ text }, options);
}
function createMessageFormData(
payload: MessengerTypes.FileDataMediaAttachmentMessage,
filedata: MessengerTypes.FileData,
options: { quickReplies?: MessengerTypes.QuickReply[] } = {}
): FormData {
const message: MessengerTypes.FileDataMediaAttachmentMessage = {
...payload,
};
// snakecase support for backward compatibility
const quickReplies =
options.quickReplies ||
// @ts-expect-error
options.quick_replies;
if (quickReplies && Array.isArray(quickReplies) && quickReplies.length >= 1) {
message.quickReplies = quickReplies;
}
const formdata = new FormData();
formdata.append('message', JSON.stringify(snakecaseKeysDeep(message)));
formdata.append(
'filedata',
filedata,
// FIXME: use pick for formdata options
omit(options, ['quickReplies'])
);
return formdata;
}
function createAttachment(
attachment: MessengerTypes.Attachment,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createMessage(
{
attachment,
},
options
);
}
function createAttachmentFormData(
attachment: MessengerTypes.FileDataMediaAttachment,
filedata: MessengerTypes.FileData,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): FormData {
return createMessageFormData(
{
attachment,
},
filedata,
options
);
}
function createAudio(
audio: string | MessengerTypes.MediaAttachmentPayload,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
if (typeof audio === 'string') {
const attachment: MessengerTypes.Attachment = {
type: 'audio',
payload: {
url: audio,
},
};
return createAttachment(attachment, options);
}
const attachment: MessengerTypes.Attachment = {
type: 'audio',
payload: audio as MessengerTypes.MediaAttachmentPayload,
};
return createAttachment(attachment, options);
}
function createAudioFormData(
audio: MessengerTypes.FileData,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): FormData {
const attachment: MessengerTypes.FileDataMediaAttachment = {
type: 'audio',
payload: {},
};
return createAttachmentFormData(attachment, audio, options);
}
function createImage(
image: string | MessengerTypes.MediaAttachmentPayload,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
if (typeof image === 'string') {
const attachment: MessengerTypes.Attachment = {
type: 'image',
payload: {
url: image,
},
};
return createAttachment(attachment, options);
}
const attachment: MessengerTypes.Attachment = {
type: 'image',
payload: image as MessengerTypes.MediaAttachmentPayload,
};
return createAttachment(attachment, options);
}
function createImageFormData(
image: MessengerTypes.FileData,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): FormData {
const attachment: MessengerTypes.FileDataMediaAttachment = {
type: 'image',
payload: {},
};
return createAttachmentFormData(attachment, image, options);
}
function createVideo(
video: string | MessengerTypes.MediaAttachmentPayload,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
if (typeof video === 'string') {
const attachment: MessengerTypes.Attachment = {
type: 'video',
payload: {
url: video,
},
};
return createAttachment(attachment, options);
}
const attachment: MessengerTypes.Attachment = {
type: 'video',
payload: video as MessengerTypes.MediaAttachmentPayload,
};
return createAttachment(attachment, options);
}
function createVideoFormData(
video: MessengerTypes.FileData,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): FormData {
const attachment: MessengerTypes.FileDataMediaAttachment = {
type: 'video',
payload: {},
};
return createAttachmentFormData(attachment, video, options);
}
function createFile(
file: string | MessengerTypes.MediaAttachmentPayload,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
if (typeof file === 'string') {
const attachment: MessengerTypes.Attachment = {
type: 'file',
payload: {
url: file,
},
};
return createAttachment(attachment, options);
}
const attachment: MessengerTypes.Attachment = {
type: 'file',
payload: file as MessengerTypes.MediaAttachmentPayload,
};
return createAttachment(attachment, options);
}
function createFileFormData(
file: MessengerTypes.FileData,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): FormData {
const attachment: MessengerTypes.FileDataMediaAttachment = {
type: 'file',
payload: {},
};
return createAttachmentFormData(attachment, file, options);
}
function createTemplate(
payload: MessengerTypes.TemplateAttachmentPayload,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createAttachment(
{
type: 'template',
payload,
},
options
);
}
function createButtonTemplate(
text: string,
buttons: MessengerTypes.TemplateButton[],
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createTemplate(
{
templateType: 'button',
text,
buttons,
},
options
);
}
function createGenericTemplate(
elements: MessengerTypes.TemplateElement[],
options: {
imageAspectRatio?: 'horizontal' | 'square';
quickReplies?: MessengerTypes.QuickReply[];
} = {}
): MessengerTypes.Message {
return createTemplate(
{
templateType: 'generic',
elements,
...(options.imageAspectRatio
? { imageAspectRatio: options.imageAspectRatio }
: {}),
},
options
);
}
function createMediaTemplate(
elements: MessengerTypes.MediaElement[],
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createTemplate(
{
templateType: 'media',
elements,
},
options
);
}
function createReceiptTemplate(
receipt: MessengerTypes.ReceiptAttributes,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createTemplate(
{
templateType: 'receipt',
...receipt,
},
options
);
}
function createAirlineBoardingPassTemplate(
attrs: MessengerTypes.AirlineBoardingPassAttributes,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createTemplate(
{
templateType: 'airline_boardingpass',
...attrs,
},
options
);
}
function createAirlineCheckinTemplate(
attrs: MessengerTypes.AirlineCheckinAttributes,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createTemplate(
{
templateType: 'airline_checkin',
...attrs,
},
options
);
}
function createAirlineItineraryTemplate(
attrs: MessengerTypes.AirlineItineraryAttributes,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createTemplate(
{
templateType: 'airline_itinerary',
...attrs,
},
options
);
}
function createAirlineUpdateTemplate(
attrs: MessengerTypes.AirlineUpdateAttributes,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createTemplate(
{
templateType: 'airline_update',
...attrs,
},
options
);
}
function createOneTimeNotifReqTemplate(
attrs: MessengerTypes.OneTimeNotifReqAttributes,
options?: { quickReplies?: MessengerTypes.QuickReply[] }
): MessengerTypes.Message {
return createTemplate(
{
templateType: 'one_time_notif_req',
...attrs,
},
options
);
}
const Messenger = {
createMessage,
createText,
createAttachment,
createAudio,
createAudioFormData,
createImage,
createImageFormData,
createVideo,
createVideoFormData,
createFile,
createFileFormData,
createTemplate,
createButtonTemplate,
createGenericTemplate,
createMediaTemplate,
createReceiptTemplate,
createAirlineBoardingPassTemplate,
createAirlineCheckinTemplate,
createAirlineItineraryTemplate,
createAirlineUpdateTemplate,
createOneTimeNotifReqTemplate,
};
export default Messenger;