@calculusky/meta-whatsapp-sdk
Version:
Meta WhatsApp SDK for the Cloud API
190 lines (189 loc) • 6.67 kB
TypeScript
import { RequesterResponseData } from "./requester";
export declare const enum MessageTypesEnum {
Template = "template",
Text = "text",
Image = "image",
Document = "document",
Video = "video",
Audio = "audio",
Sticker = "sticker",
Reaction = "reaction"
}
export type ComponentTypes = "header" | "body" | "button";
export type GeneralMessageBody = {
messaging_product: "whatsapp";
};
export type ParametersTypes = "currency" | "date_time" | "document" | "image" | "text" | "video" | "payload";
type ParametersObject<T extends ParametersTypes> = {
type: T;
};
type ConTextObject = {
message_id: string;
};
export type MessageRequestBody<T extends MessageTypesEnum> = GeneralMessageBody & {
recipient_type?: "individual";
to: string;
context?: ConTextObject;
type: T;
} & {
[K in T]: T extends keyof MessageObjectMap<ComponentTypes> ? MessageObjectMap<ComponentTypes>[T] : never;
};
export type MessagesResponse = GeneralMessageBody & {
contacts: [
{
input: string;
wa_id: string;
}
];
messages: [
{
id: string;
message_status: string;
}
];
};
type SimpleTextObject = {
text: string;
};
type TextParametersObject = ParametersObject<"text"> & SimpleTextObject;
type CurrencyObject = {
fallback_value: string;
code: CurrencyCodes;
amount_1000: number;
};
type CurrencyParametersObject = ParametersObject<"currency"> & {
currency: CurrencyObject;
};
type DateTimeObject = {
fallback_value: string;
};
type DateTimeParametersObject = ParametersObject<"date_time"> & {
date_time: DateTimeObject;
};
type MetaDocumentMediaObject = {
id: string;
link?: never;
caption?: string;
filename?: string;
};
type HostedDocumentMediaObject = {
id?: never;
link: string;
caption?: string;
filename?: string;
};
type DocumentParametersObject = ParametersObject<"document"> & DocumentMediaObject;
type MetaImageMediaObject = {
id: string;
link?: never;
caption?: string;
};
type HostedImageMediaObject = {
id?: never;
link: string;
caption?: string;
};
type ImageParametersObject = ParametersObject<"image"> & ImageMediaObject;
type MetaHostedVideoMediaObject = {
id: string;
link?: never;
caption?: string;
};
type SelfHostedVideoMediaObject = {
id?: never;
link: string;
caption?: string;
};
type MetaAudioMediaObject = {
id: string;
link?: never;
};
type HostedAudioMediaObject = {
id?: never;
link: string;
};
type VideoParametersObject = ParametersObject<"video"> & VideoMediaObject;
type QuickReplyButtonParametersObject = {
type: "payload";
payload: string;
};
type URLButtonParametersObject = SimpleTextObject & {
type: "text";
};
type ButtonParameterObject = QuickReplyButtonParametersObject | URLButtonParametersObject;
type ComponentObject<T extends ComponentTypes> = {
type: T;
parameters: (CurrencyParametersObject | DateTimeParametersObject | DocumentParametersObject | ImageParametersObject | TextParametersObject | VideoParametersObject)[];
};
type ButtonComponentObject = ComponentObject<"button"> & {
parameters: ButtonParameterObject;
sub_type: ButtonTypes;
index: ButtonPosition;
};
export type MessageTemplateObject<T extends ComponentTypes> = {
name: string;
language: LanguageObject;
components?: (ComponentObject<T> | ButtonComponentObject)[];
};
export type MessageTemplateRequestBody<T extends ComponentTypes> = MessageRequestBody<MessageTypesEnum.Template> & MessageTemplateObject<T>;
export type ImageMediaObject = MetaImageMediaObject | HostedImageMediaObject;
export type TextObject = {
body: string;
preview_url?: boolean;
};
export type DocumentMediaObject = MetaDocumentMediaObject | HostedDocumentMediaObject;
export type VideoMediaObject = MetaHostedVideoMediaObject | SelfHostedVideoMediaObject;
export type AudioMediaObject = MetaAudioMediaObject | HostedAudioMediaObject;
type MetaStickerMediaObject = {
id: string;
link?: never;
};
type ReactionObject = {
message_id: string;
emoji: string;
};
type HostedStickerMediaObject = {
id?: never;
link: string;
};
export type StickerMediaObject = MetaStickerMediaObject | HostedStickerMediaObject;
type LanguageObject = {
policy?: "deterministic";
code: Language;
};
type CurrencyCodes = "EUR" | "USD" | "NGN";
type Language = "en" | "en_GB" | "en_US";
export type ButtonTypes = "quick_reply" | "url";
export type ButtonPosition = 0 | 1 | 2;
export interface BodyBuilderOptions<TMessageType extends MessageTypesEnum, TComponentType extends ComponentTypes> {
type: TMessageType;
toNumber: string;
replyMessageId?: string;
payload: TMessageType extends keyof MessageObjectMap<TComponentType> ? MessageObjectMap<TComponentType>[TMessageType] : never;
}
type MessageObjectMap<TComponentType extends ComponentTypes> = {
[MessageTypesEnum.Audio]: AudioMediaObject;
[MessageTypesEnum.Document]: DocumentMediaObject;
[MessageTypesEnum.Image]: ImageMediaObject;
[MessageTypesEnum.Template]: MessageTemplateObject<TComponentType>;
[MessageTypesEnum.Text]: TextObject;
[MessageTypesEnum.Video]: VideoMediaObject;
[MessageTypesEnum.Sticker]: StickerMediaObject;
[MessageTypesEnum.Reaction]: ReactionObject;
};
export interface SendMessageOptions<TMessageType extends MessageTypesEnum, TComponentType extends ComponentTypes = ComponentTypes> {
recipient: string;
replyMessageId?: string;
body: TMessageType extends keyof MessageObjectMap<TComponentType> ? MessageObjectMap<TComponentType>[TMessageType] : never;
}
export interface IMessageAPI {
template(options: SendMessageOptions<MessageTypesEnum.Template>): Promise<RequesterResponseData<MessagesResponse>>;
text(options: SendMessageOptions<MessageTypesEnum.Text>): Promise<RequesterResponseData<MessagesResponse>>;
image(options: SendMessageOptions<MessageTypesEnum.Image>): Promise<RequesterResponseData<MessagesResponse>>;
video(options: SendMessageOptions<MessageTypesEnum.Video>): Promise<RequesterResponseData<MessagesResponse>>;
audio(options: SendMessageOptions<MessageTypesEnum.Audio>): Promise<RequesterResponseData<MessagesResponse>>;
document(options: SendMessageOptions<MessageTypesEnum.Document>): Promise<RequesterResponseData<MessagesResponse>>;
sticker(options: SendMessageOptions<MessageTypesEnum.Sticker>): Promise<RequesterResponseData<MessagesResponse>>;
reaction(options: SendMessageOptions<MessageTypesEnum.Reaction>): Promise<RequesterResponseData<MessagesResponse>>;
}
export {};