@builder.io/sdk-react-native 1.0.30 → 1.0.31-1

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 (348) hide show
  1. package/lib/browser/commonjs/blocks/symbol/symbol.js +1 -0
  2. package/lib/browser/commonjs/blocks/symbol/symbol.js.map +1 -1
  3. package/lib/browser/commonjs/components/block/block.js +4 -4
  4. package/lib/browser/commonjs/components/block/block.js.map +1 -1
  5. package/lib/browser/commonjs/components/content/components/enable-editor.js +9 -9
  6. package/lib/browser/commonjs/components/content/components/enable-editor.js.map +1 -1
  7. package/lib/browser/commonjs/components/content/components/styles.helpers.js +2 -2
  8. package/lib/browser/commonjs/components/content/components/styles.helpers.js.map +1 -1
  9. package/lib/browser/commonjs/components/content/content.js +1 -0
  10. package/lib/browser/commonjs/components/content/content.js.map +1 -1
  11. package/lib/browser/commonjs/constants/sdk-version.js +1 -1
  12. package/lib/browser/commonjs/constants/sdk-version.js.map +1 -1
  13. package/lib/browser/commonjs/functions/get-block-actions.js +2 -1
  14. package/lib/browser/commonjs/functions/get-block-actions.js.map +1 -1
  15. package/lib/browser/commonjs/functions/get-content/index.js +2 -1
  16. package/lib/browser/commonjs/functions/get-content/index.js.map +1 -1
  17. package/lib/browser/commonjs/helpers/cookie.js +12 -2
  18. package/lib/browser/commonjs/helpers/cookie.js.map +1 -1
  19. package/lib/browser/module/blocks/symbol/symbol.js +1 -0
  20. package/lib/browser/module/blocks/symbol/symbol.js.map +1 -1
  21. package/lib/browser/module/components/block/block.js +4 -4
  22. package/lib/browser/module/components/block/block.js.map +1 -1
  23. package/lib/browser/module/components/content/components/enable-editor.js +9 -9
  24. package/lib/browser/module/components/content/components/enable-editor.js.map +1 -1
  25. package/lib/browser/module/components/content/components/styles.helpers.js +2 -2
  26. package/lib/browser/module/components/content/components/styles.helpers.js.map +1 -1
  27. package/lib/browser/module/components/content/content.js +1 -0
  28. package/lib/browser/module/components/content/content.js.map +1 -1
  29. package/lib/browser/module/constants/sdk-version.js +1 -1
  30. package/lib/browser/module/constants/sdk-version.js.map +1 -1
  31. package/lib/browser/module/functions/get-block-actions.js +2 -1
  32. package/lib/browser/module/functions/get-block-actions.js.map +1 -1
  33. package/lib/browser/module/functions/get-content/index.js +2 -1
  34. package/lib/browser/module/functions/get-content/index.js.map +1 -1
  35. package/lib/browser/module/helpers/cookie.js +11 -2
  36. package/lib/browser/module/helpers/cookie.js.map +1 -1
  37. package/lib/browser/typescript/blocks/symbol/symbol.d.ts.map +1 -1
  38. package/lib/browser/typescript/components/content/content.d.ts.map +1 -1
  39. package/lib/browser/typescript/constants/sdk-version.d.ts +1 -1
  40. package/lib/browser/typescript/constants/sdk-version.d.ts.map +1 -1
  41. package/lib/browser/typescript/context/types.d.ts +1 -0
  42. package/lib/browser/typescript/context/types.d.ts.map +1 -1
  43. package/lib/browser/typescript/helpers/cookie.d.ts +1 -0
  44. package/lib/browser/typescript/helpers/cookie.d.ts.map +1 -1
  45. package/lib/edge/commonjs/blocks/symbol/symbol.js +1 -0
  46. package/lib/edge/commonjs/blocks/symbol/symbol.js.map +1 -1
  47. package/lib/edge/commonjs/components/block/block.js +4 -4
  48. package/lib/edge/commonjs/components/block/block.js.map +1 -1
  49. package/lib/edge/commonjs/components/content/components/enable-editor.js +9 -9
  50. package/lib/edge/commonjs/components/content/components/enable-editor.js.map +1 -1
  51. package/lib/edge/commonjs/components/content/components/styles.helpers.js +2 -2
  52. package/lib/edge/commonjs/components/content/components/styles.helpers.js.map +1 -1
  53. package/lib/edge/commonjs/components/content/content.js +1 -0
  54. package/lib/edge/commonjs/components/content/content.js.map +1 -1
  55. package/lib/edge/commonjs/constants/sdk-version.js +1 -1
  56. package/lib/edge/commonjs/constants/sdk-version.js.map +1 -1
  57. package/lib/edge/commonjs/functions/get-block-actions.js +2 -1
  58. package/lib/edge/commonjs/functions/get-block-actions.js.map +1 -1
  59. package/lib/edge/commonjs/functions/get-content/index.js +2 -1
  60. package/lib/edge/commonjs/functions/get-content/index.js.map +1 -1
  61. package/lib/edge/commonjs/helpers/cookie.js +12 -2
  62. package/lib/edge/commonjs/helpers/cookie.js.map +1 -1
  63. package/lib/edge/module/blocks/symbol/symbol.js +1 -0
  64. package/lib/edge/module/blocks/symbol/symbol.js.map +1 -1
  65. package/lib/edge/module/components/block/block.js +4 -4
  66. package/lib/edge/module/components/block/block.js.map +1 -1
  67. package/lib/edge/module/components/content/components/enable-editor.js +9 -9
  68. package/lib/edge/module/components/content/components/enable-editor.js.map +1 -1
  69. package/lib/edge/module/components/content/components/styles.helpers.js +2 -2
  70. package/lib/edge/module/components/content/components/styles.helpers.js.map +1 -1
  71. package/lib/edge/module/components/content/content.js +1 -0
  72. package/lib/edge/module/components/content/content.js.map +1 -1
  73. package/lib/edge/module/constants/sdk-version.js +1 -1
  74. package/lib/edge/module/constants/sdk-version.js.map +1 -1
  75. package/lib/edge/module/functions/get-block-actions.js +2 -1
  76. package/lib/edge/module/functions/get-block-actions.js.map +1 -1
  77. package/lib/edge/module/functions/get-content/index.js +2 -1
  78. package/lib/edge/module/functions/get-content/index.js.map +1 -1
  79. package/lib/edge/module/helpers/cookie.js +11 -2
  80. package/lib/edge/module/helpers/cookie.js.map +1 -1
  81. package/lib/edge/typescript/blocks/symbol/symbol.d.ts.map +1 -1
  82. package/lib/edge/typescript/components/content/content.d.ts.map +1 -1
  83. package/lib/edge/typescript/constants/sdk-version.d.ts +1 -1
  84. package/lib/edge/typescript/constants/sdk-version.d.ts.map +1 -1
  85. package/lib/edge/typescript/context/types.d.ts +1 -0
  86. package/lib/edge/typescript/context/types.d.ts.map +1 -1
  87. package/lib/edge/typescript/helpers/cookie.d.ts +1 -0
  88. package/lib/edge/typescript/helpers/cookie.d.ts.map +1 -1
  89. package/lib/node/commonjs/blocks/symbol/symbol.js +1 -0
  90. package/lib/node/commonjs/blocks/symbol/symbol.js.map +1 -1
  91. package/lib/node/commonjs/components/block/block.js +4 -4
  92. package/lib/node/commonjs/components/block/block.js.map +1 -1
  93. package/lib/node/commonjs/components/content/components/enable-editor.js +9 -9
  94. package/lib/node/commonjs/components/content/components/enable-editor.js.map +1 -1
  95. package/lib/node/commonjs/components/content/components/styles.helpers.js +2 -2
  96. package/lib/node/commonjs/components/content/components/styles.helpers.js.map +1 -1
  97. package/lib/node/commonjs/components/content/content.js +1 -0
  98. package/lib/node/commonjs/components/content/content.js.map +1 -1
  99. package/lib/node/commonjs/constants/sdk-version.js +1 -1
  100. package/lib/node/commonjs/constants/sdk-version.js.map +1 -1
  101. package/lib/node/commonjs/functions/get-block-actions.js +2 -1
  102. package/lib/node/commonjs/functions/get-block-actions.js.map +1 -1
  103. package/lib/node/commonjs/functions/get-content/index.js +2 -1
  104. package/lib/node/commonjs/functions/get-content/index.js.map +1 -1
  105. package/lib/node/commonjs/helpers/cookie.js +12 -2
  106. package/lib/node/commonjs/helpers/cookie.js.map +1 -1
  107. package/lib/node/index.cjs +6910 -0
  108. package/lib/node/index.mjs +7477 -0
  109. package/lib/node/module/blocks/symbol/symbol.js +1 -0
  110. package/lib/node/module/blocks/symbol/symbol.js.map +1 -1
  111. package/lib/node/module/components/block/block.js +4 -4
  112. package/lib/node/module/components/block/block.js.map +1 -1
  113. package/lib/node/module/components/content/components/enable-editor.js +9 -9
  114. package/lib/node/module/components/content/components/enable-editor.js.map +1 -1
  115. package/lib/node/module/components/content/components/styles.helpers.js +2 -2
  116. package/lib/node/module/components/content/components/styles.helpers.js.map +1 -1
  117. package/lib/node/module/components/content/content.js +1 -0
  118. package/lib/node/module/components/content/content.js.map +1 -1
  119. package/lib/node/module/constants/sdk-version.js +1 -1
  120. package/lib/node/module/constants/sdk-version.js.map +1 -1
  121. package/lib/node/module/functions/get-block-actions.js +2 -1
  122. package/lib/node/module/functions/get-block-actions.js.map +1 -1
  123. package/lib/node/module/functions/get-content/index.js +2 -1
  124. package/lib/node/module/functions/get-content/index.js.map +1 -1
  125. package/lib/node/module/helpers/cookie.js +11 -2
  126. package/lib/node/module/helpers/cookie.js.map +1 -1
  127. package/lib/node/typescript/blocks/symbol/symbol.d.ts.map +1 -1
  128. package/lib/node/typescript/components/content/content.d.ts.map +1 -1
  129. package/lib/node/typescript/constants/sdk-version.d.ts +1 -1
  130. package/lib/node/typescript/constants/sdk-version.d.ts.map +1 -1
  131. package/lib/node/typescript/context/types.d.ts +1 -0
  132. package/lib/node/typescript/context/types.d.ts.map +1 -1
  133. package/lib/node/typescript/helpers/cookie.d.ts +1 -0
  134. package/lib/node/typescript/helpers/cookie.d.ts.map +1 -1
  135. package/package.json +9 -5
  136. package/src/blocks/BaseText.tsx +17 -0
  137. package/src/blocks/accordion/accordion.tsx +181 -0
  138. package/src/blocks/accordion/accordion.types.ts +12 -0
  139. package/src/blocks/accordion/component-info.ts +124 -0
  140. package/src/blocks/accordion/helpers.ts +3 -0
  141. package/src/blocks/accordion/index.ts +1 -0
  142. package/src/blocks/button/button.tsx +56 -0
  143. package/src/blocks/button/button.types.ts +7 -0
  144. package/src/blocks/button/component-info.ts +35 -0
  145. package/src/blocks/button/index.ts +1 -0
  146. package/src/blocks/columns/columns.tsx +199 -0
  147. package/src/blocks/columns/columns.types.ts +14 -0
  148. package/src/blocks/columns/component-info.ts +219 -0
  149. package/src/blocks/columns/helpers.ts +3 -0
  150. package/src/blocks/columns/index.ts +1 -0
  151. package/src/blocks/custom-code/component-info.ts +24 -0
  152. package/src/blocks/custom-code/custom-code.tsx +71 -0
  153. package/src/blocks/custom-code/index.ts +1 -0
  154. package/src/blocks/embed/component-info.ts +38 -0
  155. package/src/blocks/embed/embed.tsx +62 -0
  156. package/src/blocks/embed/helpers.ts +2 -0
  157. package/src/blocks/embed/index.ts +1 -0
  158. package/src/blocks/form/form/component-info.ts +233 -0
  159. package/src/blocks/form/form/form.tsx +324 -0
  160. package/src/blocks/form/form/index.ts +1 -0
  161. package/src/blocks/form/input/component-info.ts +47 -0
  162. package/src/blocks/form/input/index.ts +1 -0
  163. package/src/blocks/form/input/input.tsx +49 -0
  164. package/src/blocks/form/select/component-info.ts +44 -0
  165. package/src/blocks/form/select/index.ts +1 -0
  166. package/src/blocks/form/select/select.tsx +54 -0
  167. package/src/blocks/form/submit-button/component-info.ts +27 -0
  168. package/src/blocks/form/submit-button/index.ts +1 -0
  169. package/src/blocks/form/submit-button/submit-button.tsx +34 -0
  170. package/src/blocks/fragment/component-info.ts +8 -0
  171. package/src/blocks/fragment/fragment.tsx +18 -0
  172. package/src/blocks/fragment/fragment.types.ts +5 -0
  173. package/src/blocks/fragment/index.ts +1 -0
  174. package/src/blocks/helpers.ts +43 -0
  175. package/src/blocks/image/component-info.ts +124 -0
  176. package/src/blocks/image/image.helpers.ts +47 -0
  177. package/src/blocks/image/image.tsx +65 -0
  178. package/src/blocks/image/image.types.ts +19 -0
  179. package/src/blocks/image/index.ts +1 -0
  180. package/src/blocks/img/component-info.ts +16 -0
  181. package/src/blocks/img/img.tsx +55 -0
  182. package/src/blocks/img/index.ts +1 -0
  183. package/src/blocks/raw-text/component-info.ts +11 -0
  184. package/src/blocks/raw-text/index.ts +1 -0
  185. package/src/blocks/raw-text/raw-text.tsx +1 -0
  186. package/src/blocks/section/component-info.ts +41 -0
  187. package/src/blocks/section/index.ts +1 -0
  188. package/src/blocks/section/section.tsx +39 -0
  189. package/src/blocks/section/section.types.ts +6 -0
  190. package/src/blocks/slot/component-info.ts +15 -0
  191. package/src/blocks/slot/index.ts +1 -0
  192. package/src/blocks/slot/slot.tsx +42 -0
  193. package/src/blocks/symbol/component-info.ts +35 -0
  194. package/src/blocks/symbol/index.ts +1 -0
  195. package/src/blocks/symbol/symbol.helpers.ts +47 -0
  196. package/src/blocks/symbol/symbol.tsx +100 -0
  197. package/src/blocks/symbol/symbol.types.ts +17 -0
  198. package/src/blocks/tabs/component-info.ts +139 -0
  199. package/src/blocks/tabs/index.ts +1 -0
  200. package/src/blocks/tabs/tabs.tsx +79 -0
  201. package/src/blocks/tabs/tabs.types.ts +13 -0
  202. package/src/blocks/text/component-info.ts +20 -0
  203. package/src/blocks/text/index.ts +1 -0
  204. package/src/blocks/text/text.tsx +105 -0
  205. package/src/blocks/text/text.types.ts +4 -0
  206. package/src/blocks/textarea/component-info.ts +38 -0
  207. package/src/blocks/textarea/index.ts +1 -0
  208. package/src/blocks/textarea/textarea.tsx +41 -0
  209. package/src/blocks/video/component-info.ts +83 -0
  210. package/src/blocks/video/index.ts +1 -0
  211. package/src/blocks/video/video.tsx +70 -0
  212. package/src/blocks/video/video.types.ts +21 -0
  213. package/src/components/block/animator.ts +220 -0
  214. package/src/components/block/block.helpers.ts +106 -0
  215. package/src/components/block/block.tsx +235 -0
  216. package/src/components/block/components/block-styles.tsx +136 -0
  217. package/src/components/block/components/block-wrapper.tsx +53 -0
  218. package/src/components/block/components/component-ref/component-ref.helpers.ts +55 -0
  219. package/src/components/block/components/component-ref/component-ref.tsx +66 -0
  220. package/src/components/block/components/interactive-element.tsx +53 -0
  221. package/src/components/block/components/repeated-block.tsx +37 -0
  222. package/src/components/block/types.ts +6 -0
  223. package/src/components/blocks/blocks-wrapper.tsx +93 -0
  224. package/src/components/blocks/blocks.tsx +57 -0
  225. package/src/components/blocks/blocks.types.ts +7 -0
  226. package/src/components/blocks/index.ts +1 -0
  227. package/src/components/content/components/enable-editor.tsx +471 -0
  228. package/src/components/content/components/styles.helpers.ts +101 -0
  229. package/src/components/content/components/styles.tsx +42 -0
  230. package/src/components/content/content.helpers.ts +40 -0
  231. package/src/components/content/content.tsx +151 -0
  232. package/src/components/content/content.types.ts +13 -0
  233. package/src/components/content/contentProps.types.ts +17 -0
  234. package/src/components/content/index.ts +1 -0
  235. package/src/components/content/wrap-component-ref.ts +6 -0
  236. package/src/components/content-variants/content-variants.tsx +146 -0
  237. package/src/components/content-variants/content-variants.types.ts +84 -0
  238. package/src/components/content-variants/helpers.ts +72 -0
  239. package/src/components/content-variants/index.ts +1 -0
  240. package/src/components/content-variants/inlined-fns.ts +22 -0
  241. package/src/components/dynamic-div.tsx +30 -0
  242. package/src/components/dynamic-renderer/dynamic-renderer.helpers.ts +7 -0
  243. package/src/components/dynamic-renderer/dynamic-renderer.tsx +47 -0
  244. package/src/components/error-boundary.tsx +38 -0
  245. package/src/components/inlined-script.tsx +10 -0
  246. package/src/components/inlined-styles.tsx +10 -0
  247. package/src/constants/builder-registered-components.ts +59 -0
  248. package/src/constants/device-sizes.ts +59 -0
  249. package/src/constants/extra-components.ts +1 -0
  250. package/src/constants/sdk-version.ts +1 -0
  251. package/src/constants/target.ts +3 -0
  252. package/src/context/builder.context.ts +15 -0
  253. package/src/context/components.context.ts +3 -0
  254. package/src/context/index.ts +1 -0
  255. package/src/context/types.ts +38 -0
  256. package/src/functions/apply-patch-with-mutation.ts +61 -0
  257. package/src/functions/camel-to-kebab-case.ts +1 -0
  258. package/src/functions/deopt.ts +6 -0
  259. package/src/functions/evaluate/browser-runtime/browser.ts +61 -0
  260. package/src/functions/evaluate/browser-runtime/index.ts +1 -0
  261. package/src/functions/evaluate/choose-eval.ts +23 -0
  262. package/src/functions/evaluate/edge-runtime/acorn-interpreter.ts +2891 -0
  263. package/src/functions/evaluate/edge-runtime/edge-runtime.ts +96 -0
  264. package/src/functions/evaluate/edge-runtime/index.ts +1 -0
  265. package/src/functions/evaluate/evaluate.ts +76 -0
  266. package/src/functions/evaluate/helpers.ts +56 -0
  267. package/src/functions/evaluate/index.ts +1 -0
  268. package/src/functions/evaluate/node-runtime/index.ts +1 -0
  269. package/src/functions/evaluate/node-runtime/init.ts +33 -0
  270. package/src/functions/evaluate/node-runtime/node-runtime.ts +176 -0
  271. package/src/functions/evaluate/node-runtime/safeDynamicRequire.ts +24 -0
  272. package/src/functions/evaluate/placeholder-runtime.ts +4 -0
  273. package/src/functions/evaluate/should-force-browser-runtime-in-node.ts +16 -0
  274. package/src/functions/event-handler-name.ts +4 -0
  275. package/src/functions/extract-text-styles.ts +24 -0
  276. package/src/functions/fast-clone.ts +4 -0
  277. package/src/functions/fetch-builder-props.ts +75 -0
  278. package/src/functions/get-block-actions-handler.ts +17 -0
  279. package/src/functions/get-block-actions.ts +35 -0
  280. package/src/functions/get-block-component-options.ts +11 -0
  281. package/src/functions/get-block-properties.ts +62 -0
  282. package/src/functions/get-builder-search-params/index.ts +33 -0
  283. package/src/functions/get-class-prop-name.ts +15 -0
  284. package/src/functions/get-content/generate-content-url.ts +88 -0
  285. package/src/functions/get-content/index.ts +99 -0
  286. package/src/functions/get-content/types.ts +157 -0
  287. package/src/functions/get-env.ts +5 -0
  288. package/src/functions/get-fetch.ts +11 -0
  289. package/src/functions/get-global-this.ts +16 -0
  290. package/src/functions/get-processed-block.ts +70 -0
  291. package/src/functions/get-style.ts +38 -0
  292. package/src/functions/get.ts +4 -0
  293. package/src/functions/is-browser.ts +3 -0
  294. package/src/functions/is-edge-runtime.ts +9 -0
  295. package/src/functions/is-editing.ts +8 -0
  296. package/src/functions/is-from-trusted-host.ts +8 -0
  297. package/src/functions/is-iframe.ts +4 -0
  298. package/src/functions/is-node-runtime.ts +8 -0
  299. package/src/functions/is-previewing.ts +16 -0
  300. package/src/functions/on-change.ts +29 -0
  301. package/src/functions/register-component.ts +30 -0
  302. package/src/functions/register.ts +44 -0
  303. package/src/functions/set-editor-settings.ts +15 -0
  304. package/src/functions/set.ts +14 -0
  305. package/src/functions/track/helpers.ts +51 -0
  306. package/src/functions/track/index.ts +131 -0
  307. package/src/functions/track/interaction.ts +63 -0
  308. package/src/functions/transform-block-properties.ts +33 -0
  309. package/src/functions/transform-block.ts +30 -0
  310. package/src/functions/transform-style-property.ts +296 -0
  311. package/src/helpers/ab-tests.ts +166 -0
  312. package/src/helpers/canTrack.ts +2 -0
  313. package/src/helpers/cookie.ts +109 -0
  314. package/src/helpers/css.ts +33 -0
  315. package/src/helpers/flatten.ts +41 -0
  316. package/src/helpers/localStorage.ts +36 -0
  317. package/src/helpers/logger.ts +7 -0
  318. package/src/helpers/nullable.ts +2 -0
  319. package/src/helpers/omit.ts +7 -0
  320. package/src/helpers/preview-lru-cache/get.ts +4 -0
  321. package/src/helpers/preview-lru-cache/helpers.ts +1 -0
  322. package/src/helpers/preview-lru-cache/init.ts +7 -0
  323. package/src/helpers/preview-lru-cache/set.ts +12 -0
  324. package/src/helpers/preview-lru-cache/types.ts +1 -0
  325. package/src/helpers/search/search.ts +18 -0
  326. package/src/helpers/sessionId.ts +37 -0
  327. package/src/helpers/subscribe-to-editor.ts +95 -0
  328. package/src/helpers/time.ts +2 -0
  329. package/src/helpers/url.ts +15 -0
  330. package/src/helpers/uuid.ts +17 -0
  331. package/src/helpers/visitorId.ts +37 -0
  332. package/src/index-helpers/blocks-exports.ts +16 -0
  333. package/src/index-helpers/top-of-file.ts +2 -0
  334. package/src/index.ts +15 -0
  335. package/src/scripts/init-editing.ts +119 -0
  336. package/src/server-index.ts +43 -0
  337. package/src/types/api-version.ts +2 -0
  338. package/src/types/builder-block.ts +89 -0
  339. package/src/types/builder-content.ts +47 -0
  340. package/src/types/builder-props.ts +12 -0
  341. package/src/types/can-track.ts +3 -0
  342. package/src/types/components.ts +119 -0
  343. package/src/types/deep-partial.ts +1 -0
  344. package/src/types/element.ts +57 -0
  345. package/src/types/enforced-partials.ts +19 -0
  346. package/src/types/input.ts +123 -0
  347. package/src/types/targets.ts +1 -0
  348. package/src/types/typescript.ts +9 -0
@@ -0,0 +1,471 @@
1
+ import * as React from "react";
2
+ import {
3
+ FlatList,
4
+ ScrollView,
5
+ View,
6
+ StyleSheet,
7
+ Image,
8
+ Text,
9
+ Pressable,
10
+ TextInput,
11
+ } from "react-native";
12
+ import { useState, useContext, useRef, useEffect } from "react";
13
+
14
+ type BuilderEditorProps = Omit<
15
+ ContentProps,
16
+ | "customComponents"
17
+ | "apiVersion"
18
+ | "isSsrAbTest"
19
+ | "blocksWrapper"
20
+ | "blocksWrapperProps"
21
+ | "isNestedRender"
22
+ > & {
23
+ builderContextSignal: BuilderContextInterface;
24
+ setBuilderContextSignal?: (signal: any) => any;
25
+ children?: any;
26
+ };
27
+ import builderContext from "../../../context/builder.context";
28
+ import type { BuilderContextInterface } from "../../../context/types";
29
+ import { evaluate } from "../../../functions/evaluate/index";
30
+ import { fastClone } from "../../../functions/fast-clone";
31
+ import { fetchOneEntry } from "../../../functions/get-content/index";
32
+ import { fetch } from "../../../functions/get-fetch";
33
+ import { isBrowser } from "../../../functions/is-browser";
34
+ import { isEditing } from "../../../functions/is-editing";
35
+ import { isPreviewing } from "../../../functions/is-previewing";
36
+ import { createRegisterComponentMessage } from "../../../functions/register-component";
37
+ import { _track } from "../../../functions/track/index";
38
+ import { getInteractionPropertiesForEvent } from "../../../functions/track/interaction";
39
+ import { getDefaultCanTrack } from "../../../helpers/canTrack";
40
+ import { logger } from "../../../helpers/logger";
41
+ import { postPreviewContent } from "../../../helpers/preview-lru-cache/set";
42
+ import { createEditorListener } from "../../../helpers/subscribe-to-editor";
43
+ import {
44
+ registerInsertMenu,
45
+ setupBrowserForEditing,
46
+ } from "../../../scripts/init-editing";
47
+ import type { BuilderContent } from "../../../types/builder-content";
48
+ import type { ComponentInfo } from "../../../types/components";
49
+ import type { Dictionary } from "../../../types/typescript";
50
+ import { triggerAnimation } from "../../block/animator";
51
+ import DynamicDiv from "../../dynamic-div";
52
+ import type {
53
+ BuilderComponentStateChange,
54
+ ContentProps,
55
+ } from "../content.types";
56
+ import { getWrapperClassName } from "./styles.helpers";
57
+
58
+ function EnableEditor(props: BuilderEditorProps) {
59
+ const elementRef = useRef<HTMLDivElement>(null);
60
+ function mergeNewRootState(newData: Dictionary<any>) {
61
+ const combinedState = {
62
+ ...props.builderContextSignal.rootState,
63
+ ...newData,
64
+ };
65
+ if (props.builderContextSignal.rootSetState) {
66
+ props.builderContextSignal.rootSetState?.(combinedState);
67
+ } else {
68
+ props.setBuilderContextSignal((PREVIOUS_VALUE) => ({
69
+ ...PREVIOUS_VALUE,
70
+ rootState: combinedState,
71
+ }));
72
+ }
73
+ }
74
+
75
+ function mergeNewContent(newContent: BuilderContent) {
76
+ const newContentValue = {
77
+ ...props.builderContextSignal.content,
78
+ ...newContent,
79
+ data: {
80
+ ...props.builderContextSignal.content?.data,
81
+ ...newContent?.data,
82
+ },
83
+ meta: {
84
+ ...props.builderContextSignal.content?.meta,
85
+ ...newContent?.meta,
86
+ breakpoints:
87
+ newContent?.meta?.breakpoints ||
88
+ props.builderContextSignal.content?.meta?.breakpoints,
89
+ },
90
+ };
91
+ props.setBuilderContextSignal((PREVIOUS_VALUE) => ({
92
+ ...PREVIOUS_VALUE,
93
+ content: newContentValue,
94
+ }));
95
+ }
96
+
97
+ function showContentProps() {
98
+ return props.showContent
99
+ ? {}
100
+ : {
101
+ hidden: true,
102
+ "aria-hidden": true,
103
+ };
104
+ }
105
+
106
+ const [ContentWrapper, setContentWrapper] = useState(
107
+ () => props.contentWrapper || ScrollView
108
+ );
109
+
110
+ function processMessage(event: MessageEvent) {
111
+ return createEditorListener({
112
+ model: props.model,
113
+ trustedHosts: props.trustedHosts,
114
+ callbacks: {
115
+ configureSdk: (messageContent) => {
116
+ const { breakpoints, contentId } = messageContent;
117
+ if (
118
+ !contentId ||
119
+ contentId !== props.builderContextSignal.content?.id
120
+ ) {
121
+ return;
122
+ }
123
+ if (breakpoints) {
124
+ mergeNewContent({
125
+ meta: {
126
+ breakpoints,
127
+ },
128
+ });
129
+ }
130
+ },
131
+ animation: (animation) => {
132
+ triggerAnimation(animation);
133
+ },
134
+ contentUpdate: (newContent) => {
135
+ mergeNewContent(newContent);
136
+ },
137
+ },
138
+ })(event);
139
+ }
140
+
141
+ function evaluateJsCode() {
142
+ // run any dynamic JS code attached to content
143
+ const jsCode = props.builderContextSignal.content?.data?.jsCode;
144
+ if (jsCode) {
145
+ evaluate({
146
+ code: jsCode,
147
+ context: props.context || {},
148
+ localState: undefined,
149
+ rootState: props.builderContextSignal.rootState,
150
+ rootSetState: props.builderContextSignal.rootSetState,
151
+ /**
152
+ * We don't want to cache the result of the JS code, since it's arbitrary side effect code.
153
+ */
154
+ enableCache: false,
155
+ });
156
+ }
157
+ }
158
+
159
+ const [httpReqsData, setHttpReqsData] = useState(() => ({}));
160
+
161
+ const [httpReqsPending, setHttpReqsPending] = useState(() => ({}));
162
+
163
+ const [clicked, setClicked] = useState(() => false);
164
+
165
+ function onClick(event: any) {
166
+ if (props.builderContextSignal.content) {
167
+ const variationId = props.builderContextSignal.content?.testVariationId;
168
+ const contentId = props.builderContextSignal.content?.id;
169
+ _track({
170
+ type: "click",
171
+ canTrack: getDefaultCanTrack(props.canTrack),
172
+ contentId,
173
+ apiKey: props.apiKey,
174
+ variationId: variationId !== contentId ? variationId : undefined,
175
+ ...getInteractionPropertiesForEvent(event),
176
+ unique: !clicked,
177
+ });
178
+ }
179
+ if (!clicked) {
180
+ setClicked(true);
181
+ }
182
+ }
183
+
184
+ function runHttpRequests() {
185
+ const requests: {
186
+ [key: string]: string;
187
+ } = props.builderContextSignal.content?.data?.httpRequests ?? {};
188
+ Object.entries(requests).forEach(([key, url]) => {
189
+ if (!url) return;
190
+
191
+ // request already in progress
192
+ if (httpReqsPending[key]) return;
193
+
194
+ // request already completed, and not in edit mode
195
+ if (httpReqsData[key] && !isEditing()) return;
196
+ httpReqsPending[key] = true;
197
+ const evaluatedUrl = url.replace(/{{([^}]+)}}/g, (_match, group) =>
198
+ String(
199
+ evaluate({
200
+ code: group,
201
+ context: props.context || {},
202
+ localState: undefined,
203
+ rootState: props.builderContextSignal.rootState,
204
+ rootSetState: props.builderContextSignal.rootSetState,
205
+ enableCache: true,
206
+ })
207
+ )
208
+ );
209
+ fetch(evaluatedUrl)
210
+ .then((response) => response.json())
211
+ .then((json) => {
212
+ mergeNewRootState({
213
+ [key]: json,
214
+ });
215
+ httpReqsData[key] = true;
216
+ })
217
+ .catch((err) => {
218
+ console.error("error fetching dynamic data", url, err);
219
+ })
220
+ .finally(() => {
221
+ httpReqsPending[key] = false;
222
+ });
223
+ });
224
+ }
225
+
226
+ function emitStateUpdate() {
227
+ if (isEditing()) {
228
+ window.dispatchEvent(
229
+ new CustomEvent<BuilderComponentStateChange>(
230
+ "builder:component:stateChange",
231
+ {
232
+ detail: {
233
+ state: fastClone(props.builderContextSignal.rootState),
234
+ ref: {
235
+ name: props.model,
236
+ },
237
+ },
238
+ }
239
+ )
240
+ );
241
+ }
242
+ }
243
+
244
+ function elementRef_onIniteditingbldr(event) {
245
+ window.addEventListener("message", processMessage);
246
+ registerInsertMenu();
247
+ setupBrowserForEditing({
248
+ ...(props.locale
249
+ ? {
250
+ locale: props.locale,
251
+ }
252
+ : {}),
253
+ ...(props.enrich
254
+ ? {
255
+ enrich: props.enrich,
256
+ }
257
+ : {}),
258
+ ...(props.trustedHosts
259
+ ? {
260
+ trustedHosts: props.trustedHosts,
261
+ }
262
+ : {}),
263
+ });
264
+ Object.values<ComponentInfo>(
265
+ props.builderContextSignal.componentInfos
266
+ ).forEach((registeredComponent) => {
267
+ const message = createRegisterComponentMessage(registeredComponent);
268
+ window.parent?.postMessage(message, "*");
269
+ });
270
+ window.addEventListener(
271
+ "builder:component:stateChangeListenerActivated",
272
+ emitStateUpdate
273
+ );
274
+ }
275
+
276
+ function elementRef_onInitpreviewingbldr(event) {
277
+ const searchParams = new URL(location.href).searchParams;
278
+ const searchParamPreviewModel = searchParams.get("builder.preview");
279
+ const searchParamPreviewId = searchParams.get(
280
+ `builder.overrides.${searchParamPreviewModel}`
281
+ );
282
+ const previewApiKey =
283
+ searchParams.get("apiKey") || searchParams.get("builder.space");
284
+
285
+ /**
286
+ * Make sure that:
287
+ * - the preview model name is the same as the one we're rendering, since there can be multiple models rendered * at the same time, e.g. header/page/footer. * - the API key is the same, since we don't want to preview content from other organizations.
288
+ * - if there is content, that the preview ID is the same as that of the one we receive.
289
+ *
290
+ * TO-DO: should we only update the state when there is a change?
291
+ **/
292
+ if (
293
+ searchParamPreviewModel === props.model &&
294
+ previewApiKey === props.apiKey &&
295
+ (!props.content || searchParamPreviewId === props.content.id)
296
+ ) {
297
+ fetchOneEntry({
298
+ model: props.model,
299
+ apiKey: props.apiKey,
300
+ apiVersion: props.builderContextSignal.apiVersion,
301
+ }).then((content) => {
302
+ if (content) {
303
+ mergeNewContent(content);
304
+ }
305
+ });
306
+ }
307
+ }
308
+
309
+ useEffect(() => {
310
+ if (isBrowser()) {
311
+ if (isEditing()) {
312
+ window.addEventListener("message", processMessage);
313
+ registerInsertMenu();
314
+ setupBrowserForEditing({
315
+ ...(props.locale
316
+ ? {
317
+ locale: props.locale,
318
+ }
319
+ : {}),
320
+ ...(props.enrich
321
+ ? {
322
+ enrich: props.enrich,
323
+ }
324
+ : {}),
325
+ ...(props.trustedHosts
326
+ ? {
327
+ trustedHosts: props.trustedHosts,
328
+ }
329
+ : {}),
330
+ });
331
+ Object.values<ComponentInfo>(
332
+ props.builderContextSignal.componentInfos
333
+ ).forEach((registeredComponent) => {
334
+ const message = createRegisterComponentMessage(registeredComponent);
335
+ window.parent?.postMessage(message, "*");
336
+ });
337
+ window.addEventListener(
338
+ "builder:component:stateChangeListenerActivated",
339
+ emitStateUpdate
340
+ );
341
+ }
342
+ const shouldTrackImpression =
343
+ props.builderContextSignal.content &&
344
+ getDefaultCanTrack(props.canTrack);
345
+ if (shouldTrackImpression) {
346
+ const variationId = props.builderContextSignal.content?.testVariationId;
347
+ const contentId = props.builderContextSignal.content?.id;
348
+ const apiKeyProp = props.apiKey;
349
+ _track({
350
+ type: "impression",
351
+ canTrack: true,
352
+ contentId,
353
+ apiKey: apiKeyProp!,
354
+ variationId: variationId !== contentId ? variationId : undefined,
355
+ });
356
+ }
357
+
358
+ /**
359
+ * Override normal content in preview mode.
360
+ * We ignore this when editing, since the edited content is already being sent from the editor via post messages.
361
+ */
362
+ if (isPreviewing() && !isEditing()) {
363
+ const searchParams = new URL(location.href).searchParams;
364
+ const searchParamPreviewModel = searchParams.get("builder.preview");
365
+ const searchParamPreviewId = searchParams.get(
366
+ `builder.overrides.${searchParamPreviewModel}`
367
+ );
368
+ const previewApiKey =
369
+ searchParams.get("apiKey") || searchParams.get("builder.space");
370
+
371
+ /**
372
+ * Make sure that:
373
+ * - the preview model name is the same as the one we're rendering, since there can be multiple models rendered * at the same time, e.g. header/page/footer. * - the API key is the same, since we don't want to preview content from other organizations.
374
+ * - if there is content, that the preview ID is the same as that of the one we receive.
375
+ *
376
+ * TO-DO: should we only update the state when there is a change?
377
+ **/
378
+ if (
379
+ searchParamPreviewModel === props.model &&
380
+ previewApiKey === props.apiKey &&
381
+ (!props.content || searchParamPreviewId === props.content.id)
382
+ ) {
383
+ fetchOneEntry({
384
+ model: props.model,
385
+ apiKey: props.apiKey,
386
+ apiVersion: props.builderContextSignal.apiVersion,
387
+ }).then((content) => {
388
+ if (content) {
389
+ mergeNewContent(content);
390
+ }
391
+ });
392
+ }
393
+ }
394
+ }
395
+ }, []);
396
+ useEffect(() => {
397
+ if (!props.apiKey) {
398
+ logger.error(
399
+ "No API key provided to `Content` component. This can cause issues. Please provide an API key using the `apiKey` prop."
400
+ );
401
+ }
402
+ evaluateJsCode();
403
+ runHttpRequests();
404
+ emitStateUpdate();
405
+ }, []);
406
+
407
+ useEffect(() => {
408
+ if (props.content) {
409
+ mergeNewContent(props.content);
410
+ }
411
+ }, [props.content]);
412
+ useEffect(() => {
413
+ evaluateJsCode();
414
+ }, [props.builderContextSignal.content?.data?.jsCode]);
415
+ useEffect(() => {
416
+ runHttpRequests();
417
+ }, [props.builderContextSignal.content?.data?.httpRequests]);
418
+ useEffect(() => {
419
+ emitStateUpdate();
420
+ }, [props.builderContextSignal.rootState]);
421
+ useEffect(() => {
422
+ if (props.data) {
423
+ mergeNewRootState(props.data);
424
+ }
425
+ }, [props.data]);
426
+ useEffect(() => {
427
+ if (props.locale) {
428
+ mergeNewRootState({
429
+ locale: props.locale,
430
+ });
431
+ }
432
+ }, [props.locale]);
433
+
434
+ useEffect(() => {
435
+ return () => {
436
+ if (isBrowser()) {
437
+ window.removeEventListener("message", processMessage);
438
+ window.removeEventListener(
439
+ "builder:component:stateChangeListenerActivated",
440
+ emitStateUpdate
441
+ );
442
+ }
443
+ };
444
+ }, []);
445
+
446
+ return (
447
+ <builderContext.Provider value={props.builderContextSignal}>
448
+ {props.builderContextSignal.content ? (
449
+ <ContentWrapper
450
+ {...{}}
451
+ ref={elementRef}
452
+ onPress={(event) => onClick(event)}
453
+ builder-content-id={props.builderContextSignal.content?.id}
454
+ builder-model={props.model}
455
+ {...{
456
+ // currently, we can't set the actual ID here. // we don't need it right now, we just need to identify content divs for testing.
457
+ dataSet: {
458
+ "builder-content-id": "",
459
+ },
460
+ }}
461
+ {...showContentProps()}
462
+ {...props.contentWrapperProps}
463
+ >
464
+ {props.children}
465
+ </ContentWrapper>
466
+ ) : null}
467
+ </builderContext.Provider>
468
+ );
469
+ }
470
+
471
+ export default EnableEditor;
@@ -0,0 +1,101 @@
1
+ export interface CustomFont {
2
+ family?: string;
3
+ kind?: string;
4
+ fileUrl?: string;
5
+ files?: {
6
+ [key: string]: string;
7
+ };
8
+ }
9
+ const getCssFromFont = (font: CustomFont) => {
10
+ // TODO: compute what font sizes are used and only load those.......
11
+ const family = font.family + (font.kind && !font.kind.includes('#') ? ', ' + font.kind : '');
12
+ const name = family.split(',')[0];
13
+ const url = font.fileUrl ?? font?.files?.regular;
14
+ let str = '';
15
+ if (url && family && name) {
16
+ str += `
17
+ @font-face {
18
+ font-family: "${family}";
19
+ src: local("${name}"), url('${url}') format('woff2');
20
+ font-display: fallback;
21
+ font-weight: 400;
22
+ }
23
+ `.trim();
24
+ }
25
+ if (font.files) {
26
+ for (const weight in font.files) {
27
+ const isNumber = String(Number(weight)) === weight;
28
+ if (!isNumber) {
29
+ continue;
30
+ }
31
+ // TODO: maybe limit number loaded
32
+ const weightUrl = font.files[weight];
33
+ if (weightUrl && weightUrl !== url) {
34
+ str += `
35
+ @font-face {
36
+ font-family: "${family}";
37
+ src: url('${weightUrl}') format('woff2');
38
+ font-display: fallback;
39
+ font-weight: ${weight};
40
+ }
41
+ `.trim();
42
+ }
43
+ }
44
+ }
45
+ return str;
46
+ };
47
+ export const getFontCss = ({
48
+ customFonts
49
+ }: {
50
+ customFonts?: CustomFont[];
51
+ }) => {
52
+ // TODO: flag for this
53
+ // if (!this.builder.allowCustomFonts) {
54
+ // return '';
55
+ // }
56
+ // TODO: separate internal data from external
57
+ return customFonts?.map(font => getCssFromFont(font))?.join(' ') || '';
58
+ };
59
+ export const getCss = ({
60
+ cssCode,
61
+ contentId
62
+ }: {
63
+ cssCode?: string;
64
+ contentId?: string;
65
+ }) => {
66
+ if (!cssCode) {
67
+ return '';
68
+ }
69
+ if (!contentId) {
70
+ return cssCode;
71
+ }
72
+
73
+ // Allow using `&` in custom CSS code like @emotion
74
+ // E.g. `& .foobar { ... }` to scope CSS
75
+ // TODO: handle if '&' is within a string like `content: "&"`
76
+ return cssCode?.replace(/&/g, `div[builder-content-id="${contentId}"]`) || '';
77
+ };
78
+ const DEFAULT_STYLES = `
79
+ .builder-button {
80
+ all: unset;
81
+ }
82
+
83
+ .builder-text > p:first-of-type, .builder-text > .builder-paragraph:first-of-type {
84
+ margin: 0;
85
+ }
86
+ .builder-text > p, .builder-text > .builder-paragraph {
87
+ color: inherit;
88
+ line-height: inherit;
89
+ letter-spacing: inherit;
90
+ font-weight: inherit;
91
+ font-size: inherit;
92
+ text-align: inherit;
93
+ font-family: inherit;
94
+ }
95
+ `;
96
+ export const getDefaultStyles = (isNested: boolean | undefined) => {
97
+ return !isNested ? DEFAULT_STYLES : '';
98
+ };
99
+ export const getWrapperClassName = (variationId?: string) => {
100
+ return `variant-${variationId}`;
101
+ }
@@ -0,0 +1,42 @@
1
+ import * as React from "react";
2
+ import {
3
+ FlatList,
4
+ ScrollView,
5
+ View,
6
+ StyleSheet,
7
+ Image,
8
+ Text,
9
+ Pressable,
10
+ TextInput,
11
+ } from "react-native";
12
+ import { useState } from "react";
13
+
14
+ interface Props {
15
+ cssCode?: string;
16
+ customFonts?: CustomFont[];
17
+ contentId?: string;
18
+ isNestedRender?: boolean;
19
+ }
20
+
21
+ import InlinedStyles from "../../inlined-styles";
22
+ import type { CustomFont } from "./styles.helpers";
23
+ import { getCss, getDefaultStyles, getFontCss } from "./styles.helpers";
24
+
25
+ function ContentStyles(props: Props) {
26
+ const [injectedStyles, setInjectedStyles] = useState(() =>
27
+ `
28
+ ${getCss({
29
+ cssCode: props.cssCode,
30
+ contentId: props.contentId,
31
+ })}
32
+ ${getFontCss({
33
+ customFonts: props.customFonts,
34
+ })}
35
+ ${getDefaultStyles(props.isNestedRender)}
36
+ `.trim()
37
+ );
38
+
39
+ return <InlinedStyles id="builderio-content" styles={injectedStyles} />;
40
+ }
41
+
42
+ export default ContentStyles;
@@ -0,0 +1,40 @@
1
+ import type { BuilderRenderState } from '../../context/types';
2
+ import type { BuilderContent } from '../../types/builder-content';
3
+ import type { Nullable } from '../../types/typescript';
4
+ import type { ContentProps } from './content.types';
5
+ export const getRootStateInitialValue = ({
6
+ content,
7
+ data,
8
+ locale
9
+ }: Pick<ContentProps, 'content' | 'data' | 'locale'>) => {
10
+ const defaultValues: BuilderRenderState = {};
11
+ const initialState = content?.data?.state || {};
12
+
13
+ // set default values for content state inputs
14
+ content?.data?.inputs?.forEach(input => {
15
+ if (input.name && input.defaultValue !== undefined) {
16
+ defaultValues[input.name] = input.defaultValue;
17
+ }
18
+ });
19
+ return {
20
+ ...defaultValues,
21
+ ...initialState,
22
+ ...data,
23
+ ...(locale ? {
24
+ locale
25
+ } : {})
26
+ };
27
+ };
28
+ export const getContentInitialValue = ({
29
+ content,
30
+ data
31
+ }: Pick<ContentProps, 'content' | 'data'>): Nullable<BuilderContent> => {
32
+ return !content ? undefined : {
33
+ ...content,
34
+ data: {
35
+ ...content?.data,
36
+ ...data
37
+ },
38
+ meta: content?.meta
39
+ };
40
+ }