@botonic/plugin-flow-builder 0.58.0-alpha.2 → 0.58.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/lib/cjs/action/contents-result.d.ts +0 -1
  2. package/lib/cjs/action/get-contents.js +0 -1
  3. package/lib/cjs/action/get-contents.js.map +1 -1
  4. package/lib/cjs/action/index.d.ts +1 -2
  5. package/lib/cjs/action/index.js +15 -11
  6. package/lib/cjs/action/index.js.map +1 -1
  7. package/lib/cjs/action/push-flow-resolver.js +1 -2
  8. package/lib/cjs/action/push-flow-resolver.js.map +1 -1
  9. package/lib/cjs/api.d.ts +0 -1
  10. package/lib/cjs/api.js +0 -3
  11. package/lib/cjs/api.js.map +1 -1
  12. package/lib/cjs/bot-context-manager.d.ts +3 -1
  13. package/lib/cjs/bot-context-manager.js +4 -2
  14. package/lib/cjs/bot-context-manager.js.map +1 -1
  15. package/lib/cjs/campaign-execution.d.ts +12 -0
  16. package/lib/cjs/campaign-execution.js +37 -0
  17. package/lib/cjs/campaign-execution.js.map +1 -0
  18. package/lib/cjs/content-fields/content-fields-base.d.ts +1 -0
  19. package/lib/cjs/content-fields/content-fields-base.js.map +1 -1
  20. package/lib/cjs/content-fields/custom-conditional/flow-custom-condition-v2.d.ts +1 -0
  21. package/lib/cjs/content-fields/custom-conditional/flow-custom-condition-v2.js +3 -0
  22. package/lib/cjs/content-fields/custom-conditional/flow-custom-condition-v2.js.map +1 -1
  23. package/lib/cjs/content-fields/flow-ai-agent-base.d.ts +1 -0
  24. package/lib/cjs/content-fields/flow-ai-agent-base.js +3 -0
  25. package/lib/cjs/content-fields/flow-ai-agent-base.js.map +1 -1
  26. package/lib/cjs/content-fields/flow-bot-action.d.ts +1 -0
  27. package/lib/cjs/content-fields/flow-bot-action.js +3 -0
  28. package/lib/cjs/content-fields/flow-bot-action.js.map +1 -1
  29. package/lib/cjs/content-fields/flow-button.d.ts +1 -0
  30. package/lib/cjs/content-fields/flow-button.js +3 -0
  31. package/lib/cjs/content-fields/flow-button.js.map +1 -1
  32. package/lib/cjs/content-fields/flow-capture-user-input.d.ts +1 -0
  33. package/lib/cjs/content-fields/flow-capture-user-input.js +3 -0
  34. package/lib/cjs/content-fields/flow-capture-user-input.js.map +1 -1
  35. package/lib/cjs/content-fields/flow-carousel.d.ts +1 -0
  36. package/lib/cjs/content-fields/flow-carousel.js +3 -0
  37. package/lib/cjs/content-fields/flow-carousel.js.map +1 -1
  38. package/lib/cjs/content-fields/flow-channel-conditional.d.ts +1 -0
  39. package/lib/cjs/content-fields/flow-channel-conditional.js +3 -0
  40. package/lib/cjs/content-fields/flow-channel-conditional.js.map +1 -1
  41. package/lib/cjs/content-fields/flow-contact-reasons-conditional.d.ts +1 -0
  42. package/lib/cjs/content-fields/flow-contact-reasons-conditional.js +3 -0
  43. package/lib/cjs/content-fields/flow-contact-reasons-conditional.js.map +1 -1
  44. package/lib/cjs/content-fields/flow-country-conditional.d.ts +1 -0
  45. package/lib/cjs/content-fields/flow-country-conditional.js +3 -0
  46. package/lib/cjs/content-fields/flow-country-conditional.js.map +1 -1
  47. package/lib/cjs/content-fields/flow-custom-conditional.d.ts +1 -0
  48. package/lib/cjs/content-fields/flow-custom-conditional.js +3 -0
  49. package/lib/cjs/content-fields/flow-custom-conditional.js.map +1 -1
  50. package/lib/cjs/content-fields/flow-do-nothing.d.ts +2 -0
  51. package/lib/cjs/content-fields/flow-do-nothing.js +19 -0
  52. package/lib/cjs/content-fields/flow-do-nothing.js.map +1 -1
  53. package/lib/cjs/content-fields/flow-element.d.ts +1 -0
  54. package/lib/cjs/content-fields/flow-element.js +3 -0
  55. package/lib/cjs/content-fields/flow-element.js.map +1 -1
  56. package/lib/cjs/content-fields/flow-go-to-flow.d.ts +1 -0
  57. package/lib/cjs/content-fields/flow-go-to-flow.js +3 -0
  58. package/lib/cjs/content-fields/flow-go-to-flow.js.map +1 -1
  59. package/lib/cjs/content-fields/flow-handoff.d.ts +1 -0
  60. package/lib/cjs/content-fields/flow-handoff.js +3 -0
  61. package/lib/cjs/content-fields/flow-handoff.js.map +1 -1
  62. package/lib/cjs/content-fields/flow-image.d.ts +1 -0
  63. package/lib/cjs/content-fields/flow-image.js +3 -0
  64. package/lib/cjs/content-fields/flow-image.js.map +1 -1
  65. package/lib/cjs/content-fields/flow-queue-status-conditional.d.ts +1 -0
  66. package/lib/cjs/content-fields/flow-queue-status-conditional.js +3 -0
  67. package/lib/cjs/content-fields/flow-queue-status-conditional.js.map +1 -1
  68. package/lib/cjs/content-fields/flow-rating.d.ts +1 -0
  69. package/lib/cjs/content-fields/flow-rating.js +3 -0
  70. package/lib/cjs/content-fields/flow-rating.js.map +1 -1
  71. package/lib/cjs/content-fields/flow-text.d.ts +1 -0
  72. package/lib/cjs/content-fields/flow-text.js +3 -0
  73. package/lib/cjs/content-fields/flow-text.js.map +1 -1
  74. package/lib/cjs/content-fields/flow-update-variables.d.ts +1 -0
  75. package/lib/cjs/content-fields/flow-update-variables.js +3 -0
  76. package/lib/cjs/content-fields/flow-update-variables.js.map +1 -1
  77. package/lib/cjs/content-fields/flow-video.d.ts +1 -0
  78. package/lib/cjs/content-fields/flow-video.js +3 -0
  79. package/lib/cjs/content-fields/flow-video.js.map +1 -1
  80. package/lib/cjs/content-fields/flow-webview.d.ts +1 -0
  81. package/lib/cjs/content-fields/flow-webview.js +3 -0
  82. package/lib/cjs/content-fields/flow-webview.js.map +1 -1
  83. package/lib/cjs/content-fields/flow-whatsapp-cta-url-button.d.ts +1 -0
  84. package/lib/cjs/content-fields/flow-whatsapp-cta-url-button.js +3 -0
  85. package/lib/cjs/content-fields/flow-whatsapp-cta-url-button.js.map +1 -1
  86. package/lib/cjs/content-fields/flow-whatsapp-request-contact-info.d.ts +1 -0
  87. package/lib/cjs/content-fields/flow-whatsapp-request-contact-info.js +3 -0
  88. package/lib/cjs/content-fields/flow-whatsapp-request-contact-info.js.map +1 -1
  89. package/lib/cjs/content-fields/flow-whatsapp-template.d.ts +1 -0
  90. package/lib/cjs/content-fields/flow-whatsapp-template.js +3 -0
  91. package/lib/cjs/content-fields/flow-whatsapp-template.js.map +1 -1
  92. package/lib/cjs/content-fields/whatsapp-button-list/flow-whatsapp-button-list-row.d.ts +1 -0
  93. package/lib/cjs/content-fields/whatsapp-button-list/flow-whatsapp-button-list-row.js +3 -0
  94. package/lib/cjs/content-fields/whatsapp-button-list/flow-whatsapp-button-list-row.js.map +1 -1
  95. package/lib/cjs/content-fields/whatsapp-button-list/flow-whatsapp-button-list-section.d.ts +1 -0
  96. package/lib/cjs/content-fields/whatsapp-button-list/flow-whatsapp-button-list-section.js +3 -0
  97. package/lib/cjs/content-fields/whatsapp-button-list/flow-whatsapp-button-list-section.js.map +1 -1
  98. package/lib/cjs/content-fields/whatsapp-button-list/flow-whatsapp-button-list.d.ts +1 -0
  99. package/lib/cjs/content-fields/whatsapp-button-list/flow-whatsapp-button-list.js +3 -0
  100. package/lib/cjs/content-fields/whatsapp-button-list/flow-whatsapp-button-list.js.map +1 -1
  101. package/lib/cjs/index.d.ts +2 -0
  102. package/lib/cjs/index.js +3 -1
  103. package/lib/cjs/index.js.map +1 -1
  104. package/lib/cjs/services/campaigns-v2-api.d.ts +14 -0
  105. package/lib/cjs/services/campaigns-v2-api.js +30 -0
  106. package/lib/cjs/services/campaigns-v2-api.js.map +1 -0
  107. package/lib/esm/action/contents-result.d.ts +0 -1
  108. package/lib/esm/action/get-contents.js +0 -1
  109. package/lib/esm/action/get-contents.js.map +1 -1
  110. package/lib/esm/action/index.d.ts +1 -2
  111. package/lib/esm/action/index.js +15 -11
  112. package/lib/esm/action/index.js.map +1 -1
  113. package/lib/esm/action/push-flow-resolver.js +1 -2
  114. package/lib/esm/action/push-flow-resolver.js.map +1 -1
  115. package/lib/esm/api.d.ts +0 -1
  116. package/lib/esm/api.js +0 -3
  117. package/lib/esm/api.js.map +1 -1
  118. package/lib/esm/bot-context-manager.d.ts +3 -1
  119. package/lib/esm/bot-context-manager.js +4 -2
  120. package/lib/esm/bot-context-manager.js.map +1 -1
  121. package/lib/esm/campaign-execution.d.ts +12 -0
  122. package/lib/esm/campaign-execution.js +37 -0
  123. package/lib/esm/campaign-execution.js.map +1 -0
  124. package/lib/esm/content-fields/content-fields-base.d.ts +1 -0
  125. package/lib/esm/content-fields/content-fields-base.js.map +1 -1
  126. package/lib/esm/content-fields/custom-conditional/flow-custom-condition-v2.d.ts +1 -0
  127. package/lib/esm/content-fields/custom-conditional/flow-custom-condition-v2.js +3 -0
  128. package/lib/esm/content-fields/custom-conditional/flow-custom-condition-v2.js.map +1 -1
  129. package/lib/esm/content-fields/flow-ai-agent-base.d.ts +1 -0
  130. package/lib/esm/content-fields/flow-ai-agent-base.js +3 -0
  131. package/lib/esm/content-fields/flow-ai-agent-base.js.map +1 -1
  132. package/lib/esm/content-fields/flow-bot-action.d.ts +1 -0
  133. package/lib/esm/content-fields/flow-bot-action.js +3 -0
  134. package/lib/esm/content-fields/flow-bot-action.js.map +1 -1
  135. package/lib/esm/content-fields/flow-button.d.ts +1 -0
  136. package/lib/esm/content-fields/flow-button.js +3 -0
  137. package/lib/esm/content-fields/flow-button.js.map +1 -1
  138. package/lib/esm/content-fields/flow-capture-user-input.d.ts +1 -0
  139. package/lib/esm/content-fields/flow-capture-user-input.js +3 -0
  140. package/lib/esm/content-fields/flow-capture-user-input.js.map +1 -1
  141. package/lib/esm/content-fields/flow-carousel.d.ts +1 -0
  142. package/lib/esm/content-fields/flow-carousel.js +3 -0
  143. package/lib/esm/content-fields/flow-carousel.js.map +1 -1
  144. package/lib/esm/content-fields/flow-channel-conditional.d.ts +1 -0
  145. package/lib/esm/content-fields/flow-channel-conditional.js +3 -0
  146. package/lib/esm/content-fields/flow-channel-conditional.js.map +1 -1
  147. package/lib/esm/content-fields/flow-contact-reasons-conditional.d.ts +1 -0
  148. package/lib/esm/content-fields/flow-contact-reasons-conditional.js +3 -0
  149. package/lib/esm/content-fields/flow-contact-reasons-conditional.js.map +1 -1
  150. package/lib/esm/content-fields/flow-country-conditional.d.ts +1 -0
  151. package/lib/esm/content-fields/flow-country-conditional.js +3 -0
  152. package/lib/esm/content-fields/flow-country-conditional.js.map +1 -1
  153. package/lib/esm/content-fields/flow-custom-conditional.d.ts +1 -0
  154. package/lib/esm/content-fields/flow-custom-conditional.js +3 -0
  155. package/lib/esm/content-fields/flow-custom-conditional.js.map +1 -1
  156. package/lib/esm/content-fields/flow-do-nothing.d.ts +2 -0
  157. package/lib/esm/content-fields/flow-do-nothing.js +19 -0
  158. package/lib/esm/content-fields/flow-do-nothing.js.map +1 -1
  159. package/lib/esm/content-fields/flow-element.d.ts +1 -0
  160. package/lib/esm/content-fields/flow-element.js +3 -0
  161. package/lib/esm/content-fields/flow-element.js.map +1 -1
  162. package/lib/esm/content-fields/flow-go-to-flow.d.ts +1 -0
  163. package/lib/esm/content-fields/flow-go-to-flow.js +3 -0
  164. package/lib/esm/content-fields/flow-go-to-flow.js.map +1 -1
  165. package/lib/esm/content-fields/flow-handoff.d.ts +1 -0
  166. package/lib/esm/content-fields/flow-handoff.js +3 -0
  167. package/lib/esm/content-fields/flow-handoff.js.map +1 -1
  168. package/lib/esm/content-fields/flow-image.d.ts +1 -0
  169. package/lib/esm/content-fields/flow-image.js +3 -0
  170. package/lib/esm/content-fields/flow-image.js.map +1 -1
  171. package/lib/esm/content-fields/flow-queue-status-conditional.d.ts +1 -0
  172. package/lib/esm/content-fields/flow-queue-status-conditional.js +3 -0
  173. package/lib/esm/content-fields/flow-queue-status-conditional.js.map +1 -1
  174. package/lib/esm/content-fields/flow-rating.d.ts +1 -0
  175. package/lib/esm/content-fields/flow-rating.js +3 -0
  176. package/lib/esm/content-fields/flow-rating.js.map +1 -1
  177. package/lib/esm/content-fields/flow-text.d.ts +1 -0
  178. package/lib/esm/content-fields/flow-text.js +3 -0
  179. package/lib/esm/content-fields/flow-text.js.map +1 -1
  180. package/lib/esm/content-fields/flow-update-variables.d.ts +1 -0
  181. package/lib/esm/content-fields/flow-update-variables.js +3 -0
  182. package/lib/esm/content-fields/flow-update-variables.js.map +1 -1
  183. package/lib/esm/content-fields/flow-video.d.ts +1 -0
  184. package/lib/esm/content-fields/flow-video.js +3 -0
  185. package/lib/esm/content-fields/flow-video.js.map +1 -1
  186. package/lib/esm/content-fields/flow-webview.d.ts +1 -0
  187. package/lib/esm/content-fields/flow-webview.js +3 -0
  188. package/lib/esm/content-fields/flow-webview.js.map +1 -1
  189. package/lib/esm/content-fields/flow-whatsapp-cta-url-button.d.ts +1 -0
  190. package/lib/esm/content-fields/flow-whatsapp-cta-url-button.js +3 -0
  191. package/lib/esm/content-fields/flow-whatsapp-cta-url-button.js.map +1 -1
  192. package/lib/esm/content-fields/flow-whatsapp-request-contact-info.d.ts +1 -0
  193. package/lib/esm/content-fields/flow-whatsapp-request-contact-info.js +3 -0
  194. package/lib/esm/content-fields/flow-whatsapp-request-contact-info.js.map +1 -1
  195. package/lib/esm/content-fields/flow-whatsapp-template.d.ts +1 -0
  196. package/lib/esm/content-fields/flow-whatsapp-template.js +3 -0
  197. package/lib/esm/content-fields/flow-whatsapp-template.js.map +1 -1
  198. package/lib/esm/content-fields/whatsapp-button-list/flow-whatsapp-button-list-row.d.ts +1 -0
  199. package/lib/esm/content-fields/whatsapp-button-list/flow-whatsapp-button-list-row.js +3 -0
  200. package/lib/esm/content-fields/whatsapp-button-list/flow-whatsapp-button-list-row.js.map +1 -1
  201. package/lib/esm/content-fields/whatsapp-button-list/flow-whatsapp-button-list-section.d.ts +1 -0
  202. package/lib/esm/content-fields/whatsapp-button-list/flow-whatsapp-button-list-section.js +3 -0
  203. package/lib/esm/content-fields/whatsapp-button-list/flow-whatsapp-button-list-section.js.map +1 -1
  204. package/lib/esm/content-fields/whatsapp-button-list/flow-whatsapp-button-list.d.ts +1 -0
  205. package/lib/esm/content-fields/whatsapp-button-list/flow-whatsapp-button-list.js +3 -0
  206. package/lib/esm/content-fields/whatsapp-button-list/flow-whatsapp-button-list.js.map +1 -1
  207. package/lib/esm/index.d.ts +2 -0
  208. package/lib/esm/index.js +3 -1
  209. package/lib/esm/index.js.map +1 -1
  210. package/lib/esm/services/campaigns-v2-api.d.ts +14 -0
  211. package/lib/esm/services/campaigns-v2-api.js +30 -0
  212. package/lib/esm/services/campaigns-v2-api.js.map +1 -0
  213. package/package.json +2 -2
  214. package/src/action/contents-result.ts +0 -1
  215. package/src/action/get-contents.ts +0 -1
  216. package/src/action/index.tsx +20 -24
  217. package/src/action/push-flow-resolver.ts +0 -2
  218. package/src/api.ts +1 -10
  219. package/src/bot-context-manager.ts +4 -1
  220. package/src/campaign-execution.ts +51 -0
  221. package/src/content-fields/content-fields-base.ts +2 -0
  222. package/src/content-fields/custom-conditional/flow-custom-condition-v2.tsx +4 -0
  223. package/src/content-fields/flow-ai-agent-base.tsx +4 -0
  224. package/src/content-fields/flow-bot-action.tsx +4 -0
  225. package/src/content-fields/flow-button.tsx +4 -0
  226. package/src/content-fields/flow-capture-user-input.tsx +4 -0
  227. package/src/content-fields/flow-carousel.tsx +4 -0
  228. package/src/content-fields/flow-channel-conditional.tsx +4 -0
  229. package/src/content-fields/flow-contact-reasons-conditional.tsx +4 -0
  230. package/src/content-fields/flow-country-conditional.tsx +4 -0
  231. package/src/content-fields/flow-custom-conditional.tsx +4 -0
  232. package/src/content-fields/flow-do-nothing.tsx +24 -0
  233. package/src/content-fields/flow-element.tsx +4 -0
  234. package/src/content-fields/flow-go-to-flow.tsx +4 -0
  235. package/src/content-fields/flow-handoff.tsx +4 -0
  236. package/src/content-fields/flow-image.tsx +4 -0
  237. package/src/content-fields/flow-queue-status-conditional.tsx +4 -0
  238. package/src/content-fields/flow-rating.tsx +4 -0
  239. package/src/content-fields/flow-text.tsx +4 -0
  240. package/src/content-fields/flow-update-variables.tsx +4 -0
  241. package/src/content-fields/flow-video.tsx +4 -0
  242. package/src/content-fields/flow-webview.tsx +4 -0
  243. package/src/content-fields/flow-whatsapp-cta-url-button.tsx +4 -0
  244. package/src/content-fields/flow-whatsapp-request-contact-info.tsx +4 -0
  245. package/src/content-fields/flow-whatsapp-template.tsx +4 -0
  246. package/src/content-fields/whatsapp-button-list/flow-whatsapp-button-list-row.tsx +4 -0
  247. package/src/content-fields/whatsapp-button-list/flow-whatsapp-button-list-section.tsx +4 -0
  248. package/src/content-fields/whatsapp-button-list/flow-whatsapp-button-list.tsx +4 -0
  249. package/src/index.ts +4 -0
  250. package/src/services/campaigns-v2-api.ts +44 -0
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CampaignsV2Api = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const axios_1 = tslib_1.__importDefault(require("axios"));
6
+ const constants_1 = require("../constants");
7
+ const get_flow_builder_plugin_1 = require("../utils/get-flow-builder-plugin");
8
+ class CampaignsV2Api {
9
+ constructor(botContext) {
10
+ this.hubtypeApiUrl =
11
+ botContext.session._hubtype_api ||
12
+ botContext.settings?.HUBTYPE_API_URL ||
13
+ constants_1.FLOW_BUILDER_API_URL_PROD;
14
+ const flowBuilderPlugin = (0, get_flow_builder_plugin_1.getFlowBuilderPlugin)(botContext.plugins);
15
+ this.accessToken = flowBuilderPlugin.getAccessToken(botContext.session);
16
+ this.botId = botContext.session.bot.id;
17
+ this.chatId = botContext.session.user.id;
18
+ }
19
+ async skipEmptyBotResponse(campaignId) {
20
+ const { data } = await axios_1.default.post(`${this.hubtypeApiUrl}/external/v2/conversational_apps/${this.botId}/users/${this.chatId}/skip_campaign/`, { campaign_id: campaignId }, {
21
+ headers: {
22
+ 'Content-Type': 'application/json',
23
+ Authorization: `Bearer ${this.accessToken}`,
24
+ },
25
+ });
26
+ return data;
27
+ }
28
+ }
29
+ exports.CampaignsV2Api = CampaignsV2Api;
30
+ //# sourceMappingURL=campaigns-v2-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"campaigns-v2-api.js","sourceRoot":"","sources":["../../../src/services/campaigns-v2-api.ts"],"names":[],"mappings":";;;;AACA,0DAAyB;AACzB,4CAAwD;AACxD,8EAAuE;AAQvE,MAAa,cAAc;IAMzB,YAAY,UAAsB;QAChC,IAAI,CAAC,aAAa;YAChB,UAAU,CAAC,OAAO,CAAC,YAAY;gBAC/B,UAAU,CAAC,QAAQ,EAAE,eAAe;gBACpC,qCAAyB,CAAA;QAC3B,MAAM,iBAAiB,GAAG,IAAA,8CAAoB,EAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAClE,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACvE,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAA;QACtC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,UAAkB;QAElB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,GAAG,IAAI,CAAC,aAAa,oCAAoC,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,MAAM,iBAAiB,EACzG,EAAE,WAAW,EAAE,UAAU,EAAE,EAC3B;YACE,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;aAC5C;SACF,CACF,CAAA;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAhCD,wCAgCC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botonic/plugin-flow-builder",
3
- "version": "0.58.0-alpha.2",
3
+ "version": "0.58.0-alpha.3",
4
4
  "main": "./lib/cjs/index.js",
5
5
  "module": "./lib/esm/index.js",
6
6
  "description": "Use Flow Builder to show your contents",
@@ -15,7 +15,7 @@
15
15
  "format": "biome format --write src/ tests/"
16
16
  },
17
17
  "dependencies": {
18
- "@botonic/react": "0.58.0-alpha.2",
18
+ "@botonic/react": "0.58.0-alpha.3",
19
19
  "axios": "^1.18.1",
20
20
  "uuid": "^10.0.0"
21
21
  },
@@ -2,5 +2,4 @@ import type { FlowContent } from '../content-fields'
2
2
 
3
3
  export type FlowBuilderContentsResult = {
4
4
  contents: FlowContent[]
5
- campaignFirstMessageId?: string
6
5
  }
@@ -5,7 +5,6 @@ import {
5
5
  WhatsappInputOrigin,
6
6
  } from '@botonic/core'
7
7
  import { EMPTY_PAYLOAD } from '../constants'
8
- // import type { FlowContent } from '../content-fields'
9
8
  import { inputHasTextOrTranscript } from '../utils/input'
10
9
  import { getContentsByAiAgentFromUserInput } from './ai-agent-from-user-input'
11
10
  import type { FlowBuilderContentsResult } from './contents-result'
@@ -22,7 +22,6 @@ import { getContents } from './get-contents'
22
22
 
23
23
  export type FlowBuilderActionProps = {
24
24
  contents: FlowContent[]
25
- campaignFirstMessageId?: string
26
25
  webchatSettingsParams?: WebchatSettingsProps
27
26
  }
28
27
 
@@ -48,10 +47,7 @@ export class FlowBuilderAction extends React.Component<FlowBuilderActionProps> {
48
47
  botContext: BotContext,
49
48
  contentID?: string
50
49
  ): Promise<FlowBuilderActionProps> {
51
- const { contents, campaignFirstMessageId } = await getContents(
52
- botContext,
53
- contentID
54
- )
50
+ const { contents } = await getContents(botContext, contentID)
55
51
 
56
52
  const contentsToRender = await FlowBuilderAction.prepareContentsToRender(
57
53
  botContext,
@@ -60,7 +56,6 @@ export class FlowBuilderAction extends React.Component<FlowBuilderActionProps> {
60
56
 
61
57
  return {
62
58
  contents: contentsToRender,
63
- campaignFirstMessageId,
64
59
  }
65
60
  }
66
61
 
@@ -68,17 +63,22 @@ export class FlowBuilderAction extends React.Component<FlowBuilderActionProps> {
68
63
  botContext: BotContext,
69
64
  contents: FlowContent[]
70
65
  ) {
66
+ const flowBuilderPlugin = getFlowBuilderPlugin(botContext.plugins)
67
+ const { campaignExecution, cmsApi } = flowBuilderPlugin
68
+
71
69
  for (const content of contents) {
72
70
  if (FlowBuilderAction.isAiAgentContent(content)) {
73
71
  await FlowBuilderAction.processAiAgentContent(botContext, contents)
72
+ campaignExecution.updateHasBotResponse(content)
74
73
  continue
75
74
  }
76
75
 
77
76
  await content.processContent(botContext)
78
77
 
78
+ campaignExecution.updateHasBotResponse(content)
79
+
79
80
  if (content instanceof FlowWhatsappRequestContactInfoNode) {
80
- const flowBuilderPlugin = getFlowBuilderPlugin(botContext.plugins)
81
- flowBuilderPlugin.cmsApi.setWhatsappRequestContactId(content.id)
81
+ cmsApi.setWhatsappRequestContactId(content.id)
82
82
  }
83
83
  }
84
84
 
@@ -145,7 +145,7 @@ export class FlowBuilderAction extends React.Component<FlowBuilderActionProps> {
145
145
  }
146
146
 
147
147
  render(): JSX.Element | JSX.Element[] {
148
- const { contents, campaignFirstMessageId } = this.props
148
+ const { contents } = this.props
149
149
  const botContext = this.context as BotContext
150
150
  const { shouldSendWebchatSettings, webchatSettingsParams } =
151
151
  this.getWebchatSettingsParams(botContext)
@@ -155,28 +155,28 @@ export class FlowBuilderAction extends React.Component<FlowBuilderActionProps> {
155
155
  {shouldSendWebchatSettings && (
156
156
  <WebchatSettings {...webchatSettingsParams} />
157
157
  )}
158
- {FlowBuilderAction.renderContents(
159
- contents,
160
- botContext,
161
- campaignFirstMessageId
162
- )}
158
+ {FlowBuilderAction.renderContents(contents, botContext)}
163
159
  </>
164
160
  )
165
161
  }
166
162
 
167
163
  protected static renderContents(
168
164
  contents: FlowContent[],
169
- botContext: BotContext,
170
- campaignFirstMessageId?: string
165
+ botContext: BotContext
171
166
  ): JSX.Element | JSX.Element[] {
167
+ const flowBuilderPlugin = getFlowBuilderPlugin(botContext.plugins)
168
+ const { campaignExecution } = flowBuilderPlugin
169
+
172
170
  const rendered = contents.map(content => content.toBotonic(botContext))
173
171
 
174
- if (!campaignFirstMessageId) {
172
+ if (!campaignExecution.isActive() || !campaignExecution.campaignId) {
175
173
  return rendered
176
174
  }
177
175
 
178
176
  return (
179
- <CampaignMessageAttributesProvider campaignId={campaignFirstMessageId}>
177
+ <CampaignMessageAttributesProvider
178
+ campaignId={campaignExecution.campaignId}
179
+ >
180
180
  {rendered}
181
181
  </CampaignMessageAttributesProvider>
182
182
  )
@@ -185,7 +185,7 @@ export class FlowBuilderAction extends React.Component<FlowBuilderActionProps> {
185
185
 
186
186
  export class FlowBuilderMultichannelAction extends FlowBuilderAction {
187
187
  render(): JSX.Element | JSX.Element[] {
188
- const { contents, campaignFirstMessageId } = this.props
188
+ const { contents } = this.props
189
189
  const botContext = this.context as BotContext
190
190
  const { shouldSendWebchatSettings, webchatSettingsParams } =
191
191
  this.getWebchatSettingsParams(botContext)
@@ -195,11 +195,7 @@ export class FlowBuilderMultichannelAction extends FlowBuilderAction {
195
195
  {shouldSendWebchatSettings && (
196
196
  <WebchatSettings {...webchatSettingsParams} />
197
197
  )}
198
- {FlowBuilderAction.renderContents(
199
- contents,
200
- botContext,
201
- campaignFirstMessageId
202
- )}
198
+ {FlowBuilderAction.renderContents(contents, botContext)}
203
199
  </Multichannel>
204
200
  )
205
201
  }
@@ -50,7 +50,6 @@ export class PushFlowResolver {
50
50
  }
51
51
 
52
52
  const {
53
- campaign_id: campaignId,
54
53
  campaign_flow_id: campaignFlowId,
55
54
  campaign_follow_up_id: campaignFollowUpId,
56
55
  } = campaignContext
@@ -71,7 +70,6 @@ export class PushFlowResolver {
71
70
  contents: await this.flowBuilderPlugin.getContentsByNode(
72
71
  followUpNode ?? campaignStartNode
73
72
  ),
74
- campaignFirstMessageId: campaignId,
75
73
  }
76
74
  }
77
75
 
package/src/api.ts CHANGED
@@ -1,12 +1,7 @@
1
1
  import type { BotContext } from '@botonic/core'
2
2
  import axios from 'axios'
3
3
 
4
- import {
5
- AI_AGENTS_FLOW_NAME,
6
- PUSH_FLOW_PAYLOAD,
7
- SEPARATOR,
8
- UUID_REGEXP,
9
- } from './constants'
4
+ import { AI_AGENTS_FLOW_NAME, SEPARATOR, UUID_REGEXP } from './constants'
10
5
  import {
11
6
  type HtBotActionNode,
12
7
  type HtCaptureUserInputNode,
@@ -340,8 +335,4 @@ export class FlowBuilderApi {
340
335
  defaultLocaleCode
341
336
  ).resolve()
342
337
  }
343
-
344
- isPushFlowPayload(payload?: string): boolean {
345
- return payload?.startsWith(PUSH_FLOW_PAYLOAD) ?? false
346
- }
347
338
  }
@@ -6,6 +6,7 @@ import {
6
6
  } from '@botonic/core'
7
7
 
8
8
  import type { FlowBuilderApi } from './api'
9
+ import type { CampaignExecution } from './campaign-execution'
9
10
  import {
10
11
  EMPTY_PAYLOAD,
11
12
  ON_CLOSE_HANDOFF_PAYLOAD,
@@ -24,6 +25,7 @@ import { inputHasTextOrTranscript } from './utils/input'
24
25
 
25
26
  export class BotContextManager {
26
27
  constructor(
28
+ private readonly campaignExecution: CampaignExecution,
27
29
  private readonly cmsApi: FlowBuilderApi,
28
30
  private readonly smartIntentsConfig: SmartIntentsInferenceConfig
29
31
  ) {}
@@ -48,7 +50,8 @@ export class BotContextManager {
48
50
  private async updateFirstInteractionOnPushFlowPayload(
49
51
  botContext: BotContext
50
52
  ): Promise<void> {
51
- if (this.cmsApi.isPushFlowPayload(botContext.input.payload)) {
53
+ const campaignExecution = this.campaignExecution
54
+ if (campaignExecution.isPushFlowPayload()) {
52
55
  botContext.session.is_first_interaction = false
53
56
  }
54
57
  }
@@ -0,0 +1,51 @@
1
+ import {
2
+ type BotContext,
3
+ BotonicInputContextType,
4
+ getInputContextOfType,
5
+ type PushFlowContext,
6
+ } from '@botonic/core'
7
+
8
+ import { PUSH_FLOW_PAYLOAD } from './constants'
9
+ import type { FlowContent } from './content-fields'
10
+
11
+ export class CampaignExecution {
12
+ public hasBotResponse = false
13
+ private botContext: BotContext
14
+
15
+ constructor(botContext: BotContext) {
16
+ this.botContext = botContext
17
+ }
18
+
19
+ isActive(): boolean {
20
+ if (!this.isPushFlowPayload()) {
21
+ return false
22
+ }
23
+
24
+ return this.getPushFlowContext() !== undefined
25
+ }
26
+
27
+ get campaignId(): string | undefined {
28
+ return this.getPushFlowContext()?.campaign_id
29
+ }
30
+
31
+ updateHasBotResponse(content: FlowContent): void {
32
+ if (!this.isActive() || this.hasBotResponse) {
33
+ return
34
+ }
35
+ if (content.producesBotResponse()) {
36
+ this.hasBotResponse = true
37
+ }
38
+ }
39
+
40
+ isPushFlowPayload(): boolean {
41
+ const payload = this.botContext.input.payload
42
+ return payload?.startsWith(PUSH_FLOW_PAYLOAD) ?? false
43
+ }
44
+
45
+ private getPushFlowContext(): PushFlowContext | undefined {
46
+ return getInputContextOfType(
47
+ this.botContext.input.context,
48
+ BotonicInputContextType.PushFlow
49
+ )
50
+ }
51
+ }
@@ -22,6 +22,8 @@ export abstract class ContentFieldsBase {
22
22
 
23
23
  abstract trackFlow(botContext: BotContext): Promise<void>
24
24
 
25
+ abstract producesBotResponse(): boolean
26
+
25
27
  abstract processContent(botContext: BotContext): Promise<void>
26
28
 
27
29
  async filterContent(
@@ -124,6 +124,10 @@ export class FlowCustomConditionalV2 extends ContentFieldsBase {
124
124
  await trackEvent(botContext, action, eventArgs)
125
125
  }
126
126
 
127
+ producesBotResponse(): boolean {
128
+ return false
129
+ }
130
+
127
131
  async processContent(botContext: BotContext): Promise<void> {
128
132
  await this.filterContent(botContext, this)
129
133
  await this.trackFlow(botContext)
@@ -114,6 +114,10 @@ export abstract class FlowAiAgentBase extends ContentFieldsBase {
114
114
  return
115
115
  }
116
116
 
117
+ producesBotResponse(): boolean {
118
+ return this.jsxElements.length > 0
119
+ }
120
+
117
121
  async processContent(
118
122
  botContext: BotContext,
119
123
  previousContents?: FlowContent[]
@@ -51,6 +51,10 @@ export class FlowBotAction extends ContentFieldsBase {
51
51
  botContext.session._botonic_action = `${BotonicAction.Redirect}:${this.payload}`
52
52
  }
53
53
 
54
+ producesBotResponse(): boolean {
55
+ return false
56
+ }
57
+
54
58
  async processContent(botContext: BotContext): Promise<void> {
55
59
  await this.filterContent(botContext, this)
56
60
  this.doBotAction(botContext)
@@ -98,6 +98,10 @@ export class FlowButton extends ContentFieldsBase {
98
98
  }
99
99
  }
100
100
 
101
+ producesBotResponse(): boolean {
102
+ return false
103
+ }
104
+
101
105
  async processContent(): Promise<void> {
102
106
  return
103
107
  }
@@ -34,6 +34,10 @@ export class FlowCaptureUserInput extends ContentFieldsBase {
34
34
  return
35
35
  }
36
36
 
37
+ producesBotResponse(): boolean {
38
+ return false
39
+ }
40
+
37
41
  async processContent(): Promise<void> {
38
42
  return
39
43
  }
@@ -203,6 +203,10 @@ export class FlowCarousel extends ContentFieldsBase {
203
203
  }
204
204
  }
205
205
 
206
+ producesBotResponse(): boolean {
207
+ return true
208
+ }
209
+
206
210
  async processContent(botContext: BotContext): Promise<void> {
207
211
  await this.filterContent(botContext, this)
208
212
  await this.trackFlow(botContext)
@@ -62,6 +62,10 @@ export class FlowChannelConditional extends ContentFieldsBase {
62
62
  await trackEvent(botContext, action, eventArgs)
63
63
  }
64
64
 
65
+ producesBotResponse(): boolean {
66
+ return false
67
+ }
68
+
65
69
  async processContent(botContext: BotContext): Promise<void> {
66
70
  await this.filterContent(botContext, this)
67
71
  await this.trackFlow(botContext)
@@ -107,6 +107,10 @@ export class FlowContactReasonsConditional extends ContentFieldsBase {
107
107
  return
108
108
  }
109
109
 
110
+ producesBotResponse(): boolean {
111
+ return false
112
+ }
113
+
110
114
  async processContent(botContext: BotContext): Promise<void> {
111
115
  await this.filterContent(botContext, this)
112
116
  await this.trackFlow(botContext)
@@ -64,6 +64,10 @@ export class FlowCountryConditional extends ContentFieldsBase {
64
64
  await trackEvent(botContext, action, eventArgs)
65
65
  }
66
66
 
67
+ producesBotResponse(): boolean {
68
+ return false
69
+ }
70
+
67
71
  async processContent(botContext: BotContext): Promise<void> {
68
72
  await this.filterContent(botContext, this)
69
73
  await this.trackFlow(botContext)
@@ -115,6 +115,10 @@ export class FlowCustomConditional extends ContentFieldsBase {
115
115
  )
116
116
  }
117
117
 
118
+ producesBotResponse(): boolean {
119
+ return false
120
+ }
121
+
118
122
  async processContent(botContext: BotContext): Promise<void> {
119
123
  await this.filterContent(botContext, this)
120
124
  await this.trackFlow(botContext)
@@ -1,6 +1,8 @@
1
1
  import type { BotContext } from '@botonic/core'
2
2
 
3
+ import { CampaignsV2Api } from '../services/campaigns-v2-api'
3
4
  import { trackOneContent } from '../tracking'
5
+ import { getFlowBuilderPlugin } from '../utils/get-flow-builder-plugin'
4
6
  import { ContentFieldsBase } from './content-fields-base'
5
7
  import type { HtDoNothingNode } from './hubtype-fields'
6
8
 
@@ -13,13 +15,35 @@ export class FlowDoNothing extends ContentFieldsBase {
13
15
  return newDoNothing
14
16
  }
15
17
 
18
+ private async skipCampaignIfNoBotResponse(
19
+ botContext: BotContext
20
+ ): Promise<void> {
21
+ const flowBuilderPlugin = getFlowBuilderPlugin(botContext.plugins)
22
+ const campaignExecution = flowBuilderPlugin.campaignExecution
23
+ if (!campaignExecution.isActive() || campaignExecution.hasBotResponse) {
24
+ return
25
+ }
26
+ const campaignId = campaignExecution.campaignId
27
+ if (!campaignId) {
28
+ return
29
+ }
30
+
31
+ const campaignsV2Api = new CampaignsV2Api(botContext)
32
+ await campaignsV2Api.skipEmptyBotResponse(campaignId)
33
+ }
34
+
16
35
  async trackFlow(botContext: BotContext): Promise<void> {
17
36
  await trackOneContent(botContext, this)
18
37
  }
19
38
 
39
+ producesBotResponse(): boolean {
40
+ return false
41
+ }
42
+
20
43
  async processContent(botContext: BotContext): Promise<void> {
21
44
  await this.filterContent(botContext, this)
22
45
  await this.trackFlow(botContext)
46
+ await this.skipCampaignIfNoBotResponse(botContext)
23
47
  return
24
48
  }
25
49
 
@@ -62,6 +62,10 @@ export class FlowElement extends ContentFieldsBase {
62
62
  }
63
63
  }
64
64
 
65
+ producesBotResponse(): boolean {
66
+ return false
67
+ }
68
+
65
69
  async processContent(botContext: BotContext): Promise<void> {
66
70
  await this.trackFlow(botContext)
67
71
  return
@@ -50,6 +50,10 @@ export class FlowGoToFlow extends ContentFieldsBase {
50
50
  await trackEvent(botContext, action, eventArgs)
51
51
  }
52
52
 
53
+ producesBotResponse(): boolean {
54
+ return false
55
+ }
56
+
53
57
  async processContent(botContext: BotContext): Promise<void> {
54
58
  await this.filterContent(botContext, this)
55
59
  await this.trackFlow(botContext)
@@ -142,6 +142,10 @@ export class FlowHandoff extends ContentFieldsBase {
142
142
  // TODO: Not apply for this content because backend track handoff success event
143
143
  }
144
144
 
145
+ producesBotResponse(): boolean {
146
+ return false
147
+ }
148
+
145
149
  async processContent(botContext: BotContext): Promise<void> {
146
150
  await this.filterContent(botContext, this)
147
151
  await this.doHandoff(botContext)
@@ -21,6 +21,10 @@ export class FlowImage extends ContentFieldsBase {
21
21
  await trackOneContent(botContext, this)
22
22
  }
23
23
 
24
+ producesBotResponse(): boolean {
25
+ return true
26
+ }
27
+
24
28
  async processContent(botContext: BotContext): Promise<void> {
25
29
  await this.filterContent(botContext, this)
26
30
  await this.trackFlow(botContext)
@@ -127,6 +127,10 @@ export class FlowQueueStatusConditional extends ContentFieldsBase {
127
127
  await trackEvent(botContext, action, eventArgs)
128
128
  }
129
129
 
130
+ producesBotResponse(): boolean {
131
+ return false
132
+ }
133
+
130
134
  async processContent(botContext: BotContext): Promise<void> {
131
135
  await this.filterContent(botContext, this)
132
136
  await this.trackFlow(botContext)
@@ -39,6 +39,10 @@ export class FlowRating extends ContentFieldsBase {
39
39
  await trackOneContent(botContext, this)
40
40
  }
41
41
 
42
+ producesBotResponse(): boolean {
43
+ return true
44
+ }
45
+
42
46
  async processContent(botContext: BotContext): Promise<void> {
43
47
  await this.filterContent(botContext, this)
44
48
  await this.trackFlow(botContext)
@@ -70,6 +70,10 @@ export class FlowText extends ContentFieldsBase {
70
70
  )
71
71
  }
72
72
 
73
+ producesBotResponse(): boolean {
74
+ return true
75
+ }
76
+
73
77
  async processContent(botContext: BotContext): Promise<void> {
74
78
  await this.filterContent(botContext, this)
75
79
  await this.trackFlow(botContext)
@@ -174,6 +174,10 @@ export class FlowUpdateVariables extends ContentFieldsBase {
174
174
  await trackEvent(botContext, action, eventArgs)
175
175
  }
176
176
 
177
+ producesBotResponse(): boolean {
178
+ return false
179
+ }
180
+
177
181
  async processContent(botContext: BotContext): Promise<void> {
178
182
  await this.trackFlow(botContext)
179
183
  }
@@ -21,6 +21,10 @@ export class FlowVideo extends ContentFieldsBase {
21
21
  await trackOneContent(botContext, this)
22
22
  }
23
23
 
24
+ producesBotResponse(): boolean {
25
+ return true
26
+ }
27
+
24
28
  async processContent(botContext: BotContext): Promise<void> {
25
29
  await this.filterContent(botContext, this)
26
30
  await this.trackFlow(botContext)
@@ -95,6 +95,10 @@ export class FlowWebview extends ContentFieldsBase {
95
95
  await trackEvent(botContext, action, eventArgs)
96
96
  }
97
97
 
98
+ producesBotResponse(): boolean {
99
+ return false
100
+ }
101
+
98
102
  async processContent(): Promise<void> {
99
103
  return
100
104
  }
@@ -120,6 +120,10 @@ export class FlowWhatsappCtaUrlButtonNode extends ContentFieldsBase {
120
120
  await trackOneContent(botContext, this)
121
121
  }
122
122
 
123
+ producesBotResponse(): boolean {
124
+ return true
125
+ }
126
+
123
127
  async processContent(botContext: BotContext): Promise<void> {
124
128
  await this.filterContent(botContext, this)
125
129
  await this.trackFlow(botContext)
@@ -48,6 +48,10 @@ export class FlowWhatsappRequestContactInfoNode extends ContentFieldsBase {
48
48
  await trackOneContent(botContext, this)
49
49
  }
50
50
 
51
+ producesBotResponse(): boolean {
52
+ return true
53
+ }
54
+
51
55
  async processContent(botContext: BotContext): Promise<void> {
52
56
  await this.filterContent(botContext, this)
53
57
  await this.trackFlow(botContext)
@@ -425,6 +425,10 @@ export class FlowWhatsappTemplate extends ContentFieldsBase {
425
425
  await trackOneContent(botContext, this)
426
426
  }
427
427
 
428
+ producesBotResponse(): boolean {
429
+ return true
430
+ }
431
+
428
432
  async processContent(botContext: BotContext): Promise<void> {
429
433
  await this.filterContent(botContext, this)
430
434
  await this.trackFlow(botContext)
@@ -33,6 +33,10 @@ export class FlowWhatsappButtonListRow extends ContentFieldsBase {
33
33
  return
34
34
  }
35
35
 
36
+ producesBotResponse(): boolean {
37
+ return false
38
+ }
39
+
36
40
  async processContent(): Promise<void> {
37
41
  return
38
42
  }
@@ -32,6 +32,10 @@ export class FlowWhatsappButtonListSection extends ContentFieldsBase {
32
32
  return
33
33
  }
34
34
 
35
+ producesBotResponse(): boolean {
36
+ return false
37
+ }
38
+
35
39
  async processContent(): Promise<void> {
36
40
  return
37
41
  }