import Context from '../context/Context'; import { Action } from '../types'; import { RoutePredicate, route } from '../router'; import MessengerContext from './MessengerContext'; type Route = ( action: Action ) => { predicate: RoutePredicate; action: Action; }; type Messenger = Route & { any: Route; message: Route; accountLinking: Route & { linked: Route; unlinked: Route; }; checkoutUpdate: Route; delivery: Route; echo: Route; gamePlay: Route; passThreadControl: Route; takeThreadControl: Route; requestThreadControl: Route; appRoles: Route; optin: Route; payment: Route; policyEnforcement: Route; postback: Route; preCheckout: Route; read: Route; referral: Route; standby: Route; reaction: Route & { react: Route; unreact: Route; }; }; const messenger: Messenger = ( action: Action ) => { return route((context: C) => context.platform === 'messenger', action); }; messenger.any = messenger; function message(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isMessage, action ); } messenger.message = message; function accountLinking( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isAccountLinking, action ); } messenger.accountLinking = accountLinking; function accountLinkingLinked( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isAccountLinking && context.event.accountLinking.status === 'linked', action ); } accountLinking.linked = accountLinkingLinked; function accountLinkingUnlinked( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isAccountLinking && context.event.accountLinking.status === 'unlinked', action ); } accountLinking.unlinked = accountLinkingUnlinked; function checkoutUpdate( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isCheckoutUpdate, action ); } messenger.checkoutUpdate = checkoutUpdate; function delivery(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isDelivery, action ); } messenger.delivery = delivery; function echo(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isEcho, action ); } messenger.echo = echo; function gamePlay(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isGamePlay, action ); } messenger.gamePlay = gamePlay; function passThreadControl( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isPassThreadControl, action ); } messenger.passThreadControl = passThreadControl; function takeThreadControl( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isTakeThreadControl, action ); } messenger.takeThreadControl = takeThreadControl; function requestThreadControl( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isRequestThreadControl, action ); } messenger.requestThreadControl = requestThreadControl; function appRoles(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isAppRoles, action ); } messenger.appRoles = appRoles; function optin(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isOptin, action ); } messenger.optin = optin; function payment(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isPayment, action ); } messenger.payment = payment; function policyEnforcement( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isPolicyEnforcement, action ); } messenger.policyEnforcement = policyEnforcement; function postback(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isPostback, action ); } messenger.postback = postback; function preCheckout(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isPreCheckout, action ); } messenger.preCheckout = preCheckout; function read(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isRead, action ); } messenger.read = read; function referral(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isReferral, action ); } messenger.referral = referral; function standby(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isStandby, action ); } messenger.standby = standby; function reaction(action: Action) { return route( (context: C) => context.platform === 'messenger' && context.event.isReaction, action ); } messenger.reaction = reaction; function reactionReact( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isReaction && context.event.reaction.action === 'react', action ); } reaction.react = reactionReact; function reactionUnreact( action: Action ) { return route( (context: C) => context.platform === 'messenger' && context.event.isReaction && context.event.reaction.action === 'unreact', action ); } reaction.unreact = reactionUnreact; export default messenger;