@billdog.io/react-native 1.0.0-beta.2

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 (309) hide show
  1. package/BillDogReactNative.podspec +30 -0
  2. package/LICENSE +21 -0
  3. package/README.md +330 -0
  4. package/android/build.gradle +99 -0
  5. package/android/src/main/AndroidManifest.xml +1 -0
  6. package/android/src/main/kotlin/io/billdog/reactnative/BillDogABTestModule.kt +317 -0
  7. package/android/src/main/kotlin/io/billdog/reactnative/BillDogAnalyticsModule.kt +389 -0
  8. package/android/src/main/kotlin/io/billdog/reactnative/BillDogModule.kt +817 -0
  9. package/android/src/main/kotlin/io/billdog/reactnative/BillDogPaywallViewManager.kt +383 -0
  10. package/android/src/main/kotlin/io/billdog/reactnative/BillDogSurveyModule.kt +427 -0
  11. package/android/src/main/kotlin/io/billdog/reactnative/BillDogVirtualCurrencyModule.kt +407 -0
  12. package/android/src/main/kotlin/io/billdog/virtualcurrency/BillDogVirtualCurrencyPackage.kt +44 -0
  13. package/dist/AdvancedPaywallCache.d.ts +70 -0
  14. package/dist/AdvancedPaywallCache.js +344 -0
  15. package/dist/BillDog.d.ts +255 -0
  16. package/dist/BillDog.js +918 -0
  17. package/dist/BillDogConfiguration.d.ts +145 -0
  18. package/dist/BillDogConfiguration.js +229 -0
  19. package/dist/ComponentRenderer.d.ts +17 -0
  20. package/dist/ComponentRenderer.js +886 -0
  21. package/dist/LayoutEngine.d.ts +101 -0
  22. package/dist/LayoutEngine.js +394 -0
  23. package/dist/LocalizationResolver.d.ts +99 -0
  24. package/dist/LocalizationResolver.js +266 -0
  25. package/dist/NativePaywallView.d.ts +36 -0
  26. package/dist/NativePaywallView.js +59 -0
  27. package/dist/PaywallCache.d.ts +74 -0
  28. package/dist/PaywallCache.js +293 -0
  29. package/dist/PaywallStateManager.d.ts +62 -0
  30. package/dist/PaywallStateManager.js +147 -0
  31. package/dist/PaywallView.d.ts +42 -0
  32. package/dist/PaywallView.js +275 -0
  33. package/dist/ProductVariableProvider.d.ts +60 -0
  34. package/dist/ProductVariableProvider.js +239 -0
  35. package/dist/VariableResolver.d.ts +120 -0
  36. package/dist/VariableResolver.js +379 -0
  37. package/dist/WebViewPaywall.d.ts +75 -0
  38. package/dist/WebViewPaywall.js +360 -0
  39. package/dist/animations/presets.d.ts +49 -0
  40. package/dist/animations/presets.js +367 -0
  41. package/dist/components/AccoladeCpsComponent.d.ts +13 -0
  42. package/dist/components/AccoladeCpsComponent.js +248 -0
  43. package/dist/components/AccordionComponent.d.ts +10 -0
  44. package/dist/components/AccordionComponent.js +187 -0
  45. package/dist/components/AnimatedWrapper.d.ts +35 -0
  46. package/dist/components/AnimatedWrapper.js +277 -0
  47. package/dist/components/CarouselComponent.d.ts +23 -0
  48. package/dist/components/CarouselComponent.js +484 -0
  49. package/dist/components/ChartCurveComponent.d.ts +13 -0
  50. package/dist/components/ChartCurveComponent.js +333 -0
  51. package/dist/components/CheckboxComponent.d.ts +9 -0
  52. package/dist/components/CheckboxComponent.js +172 -0
  53. package/dist/components/ConfettiComponent.d.ts +9 -0
  54. package/dist/components/ConfettiComponent.js +172 -0
  55. package/dist/components/CountdownComponent.d.ts +16 -0
  56. package/dist/components/CountdownComponent.js +414 -0
  57. package/dist/components/DelayedXComponent.d.ts +12 -0
  58. package/dist/components/DelayedXComponent.js +240 -0
  59. package/dist/components/DrawerModalComponent.d.ts +20 -0
  60. package/dist/components/DrawerModalComponent.js +286 -0
  61. package/dist/components/GradientView.d.ts +38 -0
  62. package/dist/components/GradientView.js +126 -0
  63. package/dist/components/HapticFeedbackComponent.d.ts +16 -0
  64. package/dist/components/HapticFeedbackComponent.js +64 -0
  65. package/dist/components/HorizontalProductsComponent.d.ts +17 -0
  66. package/dist/components/HorizontalProductsComponent.js +284 -0
  67. package/dist/components/MultiChoiceGridComponent.d.ts +13 -0
  68. package/dist/components/MultiChoiceGridComponent.js +234 -0
  69. package/dist/components/NPSScaleComponent.d.ts +16 -0
  70. package/dist/components/NPSScaleComponent.js +260 -0
  71. package/dist/components/NavigationComponent.d.ts +26 -0
  72. package/dist/components/NavigationComponent.js +302 -0
  73. package/dist/components/OAuthButtonComponent.d.ts +20 -0
  74. package/dist/components/OAuthButtonComponent.js +237 -0
  75. package/dist/components/ProgressLoaderComponent.d.ts +13 -0
  76. package/dist/components/ProgressLoaderComponent.js +308 -0
  77. package/dist/components/ProgressStepperComponent.d.ts +18 -0
  78. package/dist/components/ProgressStepperComponent.js +228 -0
  79. package/dist/components/SegmentedPickerComponent.d.ts +10 -0
  80. package/dist/components/SegmentedPickerComponent.js +221 -0
  81. package/dist/components/ShareButtonsComponent.d.ts +21 -0
  82. package/dist/components/ShareButtonsComponent.js +265 -0
  83. package/dist/components/ShareCodeComponent.d.ts +16 -0
  84. package/dist/components/ShareCodeComponent.js +274 -0
  85. package/dist/components/SingleChoiceGridComponent.d.ts +13 -0
  86. package/dist/components/SingleChoiceGridComponent.js +210 -0
  87. package/dist/components/SliderComponent.d.ts +9 -0
  88. package/dist/components/SliderComponent.js +263 -0
  89. package/dist/components/StarRatingInputComponent.d.ts +20 -0
  90. package/dist/components/StarRatingInputComponent.js +198 -0
  91. package/dist/components/StickerCompositeComponent.d.ts +13 -0
  92. package/dist/components/StickerCompositeComponent.js +136 -0
  93. package/dist/components/TabsComponent.d.ts +19 -0
  94. package/dist/components/TabsComponent.js +431 -0
  95. package/dist/components/TextInputComponent.d.ts +18 -0
  96. package/dist/components/TextInputComponent.js +227 -0
  97. package/dist/components/TimelineComponent.d.ts +19 -0
  98. package/dist/components/TimelineComponent.js +104 -0
  99. package/dist/components/ToggleComponent.d.ts +14 -0
  100. package/dist/components/ToggleComponent.js +132 -0
  101. package/dist/components/VerticalProductsComponent.d.ts +17 -0
  102. package/dist/components/VerticalProductsComponent.js +311 -0
  103. package/dist/dynamicValues.d.ts +36 -0
  104. package/dist/dynamicValues.js +142 -0
  105. package/dist/filters/dateFilters.d.ts +50 -0
  106. package/dist/filters/dateFilters.js +390 -0
  107. package/dist/filters/index.d.ts +18 -0
  108. package/dist/filters/index.js +253 -0
  109. package/dist/hooks/useOfferings.d.ts +76 -0
  110. package/dist/hooks/useOfferings.js +99 -0
  111. package/dist/hooks/usePaywall.d.ts +27 -0
  112. package/dist/hooks/usePaywall.js +114 -0
  113. package/dist/hooks/usePlacement.d.ts +34 -0
  114. package/dist/hooks/usePlacement.js +89 -0
  115. package/dist/hooks/useSubscription.d.ts +40 -0
  116. package/dist/hooks/useSubscription.js +97 -0
  117. package/dist/index.d.ts +98 -0
  118. package/dist/index.js +198 -0
  119. package/dist/models/BillDogError.d.ts +40 -0
  120. package/dist/models/BillDogError.js +11 -0
  121. package/dist/models/CacheFetchPolicy.d.ts +8 -0
  122. package/dist/models/CacheFetchPolicy.js +4 -0
  123. package/dist/models/CustomProduct.d.ts +32 -0
  124. package/dist/models/CustomProduct.js +15 -0
  125. package/dist/models/CustomerInfo.d.ts +17 -0
  126. package/dist/models/CustomerInfo.js +11 -0
  127. package/dist/models/Delegate.d.ts +20 -0
  128. package/dist/models/Delegate.js +11 -0
  129. package/dist/models/EntitlementInfo.d.ts +19 -0
  130. package/dist/models/EntitlementInfo.js +2 -0
  131. package/dist/models/Placement.d.ts +54 -0
  132. package/dist/models/Placement.js +15 -0
  133. package/dist/models/PurchaseParams.d.ts +39 -0
  134. package/dist/models/PurchaseParams.js +60 -0
  135. package/dist/models/PurchaseResult.d.ts +30 -0
  136. package/dist/models/PurchaseResult.js +15 -0
  137. package/dist/models/RestoreResult.d.ts +30 -0
  138. package/dist/models/RestoreResult.js +22 -0
  139. package/dist/models/RestoredItem.d.ts +26 -0
  140. package/dist/models/RestoredItem.js +13 -0
  141. package/dist/modules/ABTest.d.ts +65 -0
  142. package/dist/modules/ABTest.js +113 -0
  143. package/dist/modules/Analytics.d.ts +91 -0
  144. package/dist/modules/Analytics.js +182 -0
  145. package/dist/modules/Survey.d.ts +65 -0
  146. package/dist/modules/Survey.js +82 -0
  147. package/dist/modules/VirtualCurrency.d.ts +63 -0
  148. package/dist/modules/VirtualCurrency.js +147 -0
  149. package/dist/murmur.d.ts +23 -0
  150. package/dist/murmur.js +104 -0
  151. package/dist/notifications/LiveActivitiesManager.d.ts +47 -0
  152. package/dist/notifications/LiveActivitiesManager.js +106 -0
  153. package/dist/notifications/NotificationScheduler.d.ts +55 -0
  154. package/dist/notifications/NotificationScheduler.js +199 -0
  155. package/dist/notifications/PurchaseNotificationHandler.d.ts +24 -0
  156. package/dist/notifications/PurchaseNotificationHandler.js +55 -0
  157. package/dist/notifications/useDeviceToken.d.ts +36 -0
  158. package/dist/notifications/useDeviceToken.js +97 -0
  159. package/dist/notifications/useLiveActivity.d.ts +39 -0
  160. package/dist/notifications/useLiveActivity.js +104 -0
  161. package/dist/review/ReviewAnalytics.d.ts +34 -0
  162. package/dist/review/ReviewAnalytics.js +73 -0
  163. package/dist/review/ReviewManager.d.ts +83 -0
  164. package/dist/review/ReviewManager.js +339 -0
  165. package/dist/review/ReviewTimingManager.d.ts +82 -0
  166. package/dist/review/ReviewTimingManager.js +224 -0
  167. package/dist/survey-core/types.d.ts +215 -0
  168. package/dist/survey-core/types.js +8 -0
  169. package/dist/types.d.ts +438 -0
  170. package/dist/types.js +158 -0
  171. package/dist/utils/ApiClient.d.ts +65 -0
  172. package/dist/utils/ApiClient.js +132 -0
  173. package/dist/utils/CSSConverter.d.ts +49 -0
  174. package/dist/utils/CSSConverter.js +470 -0
  175. package/dist/utils/animations.d.ts +41 -0
  176. package/dist/utils/animations.js +194 -0
  177. package/dist/utils/calendarIntegration.d.ts +36 -0
  178. package/dist/utils/calendarIntegration.js +89 -0
  179. package/dist/utils/configurationResolver.d.ts +23 -0
  180. package/dist/utils/configurationResolver.js +78 -0
  181. package/dist/utils/deviceDetection.d.ts +38 -0
  182. package/dist/utils/deviceDetection.js +59 -0
  183. package/dist/utils/hapticFeedback.d.ts +17 -0
  184. package/dist/utils/hapticFeedback.js +53 -0
  185. package/dist/utils/iconMapper.d.ts +26 -0
  186. package/dist/utils/iconMapper.js +113 -0
  187. package/dist/utils/notificationPermissions.d.ts +13 -0
  188. package/dist/utils/notificationPermissions.js +51 -0
  189. package/dist/utils/priceFormatting.d.ts +19 -0
  190. package/dist/utils/priceFormatting.js +99 -0
  191. package/dist/utils/shareSheet.d.ts +17 -0
  192. package/dist/utils/shareSheet.js +42 -0
  193. package/dist/utils/subscriptionUpgrade.d.ts +84 -0
  194. package/dist/utils/subscriptionUpgrade.js +100 -0
  195. package/dist/valueUtils.d.ts +48 -0
  196. package/dist/valueUtils.js +129 -0
  197. package/dist/xFlowTags.d.ts +18 -0
  198. package/dist/xFlowTags.js +385 -0
  199. package/ios/BillDogABTest.m +50 -0
  200. package/ios/BillDogABTest.swift +188 -0
  201. package/ios/BillDogAnalytics.m +105 -0
  202. package/ios/BillDogAnalytics.swift +324 -0
  203. package/ios/BillDogBridge.m +222 -0
  204. package/ios/BillDogBridge.swift +715 -0
  205. package/ios/BillDogLiveActivities.m +41 -0
  206. package/ios/BillDogLiveActivities.swift +104 -0
  207. package/ios/BillDogPaywallViewManager.m +39 -0
  208. package/ios/BillDogPaywallViewManager.swift +361 -0
  209. package/ios/BillDogSurvey.m +34 -0
  210. package/ios/BillDogSurvey.swift +257 -0
  211. package/ios/BillDogVirtualCurrencyBridge.m +63 -0
  212. package/ios/BillDogVirtualCurrencyBridge.swift +511 -0
  213. package/junit.xml +25 -0
  214. package/package.json +61 -0
  215. package/react-native.config.js +13 -0
  216. package/src/AdvancedPaywallCache.ts +433 -0
  217. package/src/BillDog.ts +983 -0
  218. package/src/BillDogConfiguration.ts +318 -0
  219. package/src/ComponentRenderer.tsx +1325 -0
  220. package/src/LayoutEngine.ts +459 -0
  221. package/src/LocalizationResolver.ts +311 -0
  222. package/src/NativePaywallView.tsx +132 -0
  223. package/src/PaywallCache.ts +358 -0
  224. package/src/PaywallStateManager.ts +154 -0
  225. package/src/PaywallView.tsx +328 -0
  226. package/src/ProductVariableProvider.ts +282 -0
  227. package/src/VariableResolver.ts +516 -0
  228. package/src/WebViewPaywall.tsx +454 -0
  229. package/src/animations/presets.ts +421 -0
  230. package/src/components/AccoladeCpsComponent.tsx +259 -0
  231. package/src/components/AccordionComponent.tsx +213 -0
  232. package/src/components/AnimatedWrapper.tsx +316 -0
  233. package/src/components/CarouselComponent.tsx +615 -0
  234. package/src/components/ChartCurveComponent.tsx +452 -0
  235. package/src/components/CheckboxComponent.tsx +185 -0
  236. package/src/components/ConfettiComponent.tsx +178 -0
  237. package/src/components/CountdownComponent.tsx +454 -0
  238. package/src/components/DelayedXComponent.tsx +266 -0
  239. package/src/components/DrawerModalComponent.tsx +324 -0
  240. package/src/components/GradientView.tsx +129 -0
  241. package/src/components/HapticFeedbackComponent.tsx +39 -0
  242. package/src/components/HorizontalProductsComponent.tsx +329 -0
  243. package/src/components/MultiChoiceGridComponent.tsx +265 -0
  244. package/src/components/NPSScaleComponent.tsx +294 -0
  245. package/src/components/NavigationComponent.tsx +329 -0
  246. package/src/components/OAuthButtonComponent.tsx +266 -0
  247. package/src/components/ProgressLoaderComponent.tsx +366 -0
  248. package/src/components/ProgressStepperComponent.tsx +250 -0
  249. package/src/components/SegmentedPickerComponent.tsx +245 -0
  250. package/src/components/ShareButtonsComponent.tsx +299 -0
  251. package/src/components/ShareCodeComponent.tsx +303 -0
  252. package/src/components/SingleChoiceGridComponent.tsx +229 -0
  253. package/src/components/SliderComponent.tsx +280 -0
  254. package/src/components/StarRatingInputComponent.tsx +223 -0
  255. package/src/components/StickerCompositeComponent.tsx +168 -0
  256. package/src/components/TabsComponent.tsx +496 -0
  257. package/src/components/TextInputComponent.tsx +258 -0
  258. package/src/components/TimelineComponent.tsx +129 -0
  259. package/src/components/ToggleComponent.tsx +142 -0
  260. package/src/components/VerticalProductsComponent.tsx +357 -0
  261. package/src/dynamicValues.ts +180 -0
  262. package/src/filters/dateFilters.ts +411 -0
  263. package/src/filters/index.ts +281 -0
  264. package/src/hooks/useOfferings.ts +192 -0
  265. package/src/hooks/usePaywall.ts +154 -0
  266. package/src/hooks/usePlacement.ts +143 -0
  267. package/src/hooks/useSubscription.ts +154 -0
  268. package/src/index.ts +245 -0
  269. package/src/models/BillDogError.ts +24 -0
  270. package/src/models/CacheFetchPolicy.ts +13 -0
  271. package/src/models/CustomProduct.ts +33 -0
  272. package/src/models/CustomerInfo.ts +26 -0
  273. package/src/models/Delegate.ts +22 -0
  274. package/src/models/EntitlementInfo.ts +27 -0
  275. package/src/models/Placement.ts +50 -0
  276. package/src/models/PurchaseParams.ts +81 -0
  277. package/src/models/PurchaseResult.ts +32 -0
  278. package/src/models/RestoreResult.ts +27 -0
  279. package/src/models/RestoredItem.ts +25 -0
  280. package/src/modules/ABTest.ts +131 -0
  281. package/src/modules/Analytics.ts +227 -0
  282. package/src/modules/Survey.ts +126 -0
  283. package/src/modules/VirtualCurrency.ts +223 -0
  284. package/src/murmur.ts +102 -0
  285. package/src/notifications/LiveActivitiesManager.ts +140 -0
  286. package/src/notifications/NotificationScheduler.ts +292 -0
  287. package/src/notifications/PurchaseNotificationHandler.ts +67 -0
  288. package/src/notifications/useDeviceToken.ts +116 -0
  289. package/src/notifications/useLiveActivity.ts +125 -0
  290. package/src/review/ReviewAnalytics.ts +89 -0
  291. package/src/review/ReviewManager.ts +355 -0
  292. package/src/review/ReviewTimingManager.ts +265 -0
  293. package/src/survey-core/types.ts +244 -0
  294. package/src/types/ambient.d.ts +9 -0
  295. package/src/types.ts +680 -0
  296. package/src/utils/ApiClient.ts +163 -0
  297. package/src/utils/CSSConverter.ts +552 -0
  298. package/src/utils/animations.ts +232 -0
  299. package/src/utils/calendarIntegration.ts +113 -0
  300. package/src/utils/configurationResolver.ts +106 -0
  301. package/src/utils/deviceDetection.ts +83 -0
  302. package/src/utils/hapticFeedback.ts +55 -0
  303. package/src/utils/iconMapper.ts +102 -0
  304. package/src/utils/notificationPermissions.ts +48 -0
  305. package/src/utils/priceFormatting.ts +119 -0
  306. package/src/utils/shareSheet.ts +55 -0
  307. package/src/utils/subscriptionUpgrade.ts +183 -0
  308. package/src/valueUtils.ts +108 -0
  309. package/src/xFlowTags.ts +463 -0
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * GradientView Component
4
+ * Wraps content with a gradient background using LinearGradient
5
+ * Falls back to solid color if LinearGradient is not available
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.GradientView = void 0;
42
+ exports.isGradientSupported = isGradientSupported;
43
+ exports.getGradientStyleOrFallback = getGradientStyleOrFallback;
44
+ const react_1 = __importStar(require("react"));
45
+ const react_native_1 = require("react-native");
46
+ const CSSConverter_1 = require("../utils/CSSConverter");
47
+ // Try to import LinearGradient - user must have expo-linear-gradient or react-native-linear-gradient installed
48
+ let LinearGradient = null;
49
+ try {
50
+ // Try expo-linear-gradient first (most common in Expo projects)
51
+ LinearGradient = require('expo-linear-gradient').LinearGradient;
52
+ }
53
+ catch {
54
+ try {
55
+ // Fall back to react-native-linear-gradient
56
+ LinearGradient = require('react-native-linear-gradient').default;
57
+ }
58
+ catch {
59
+ // LinearGradient not available - will use fallback
60
+ LinearGradient = null;
61
+ }
62
+ }
63
+ /**
64
+ * GradientView renders a gradient background
65
+ * Uses LinearGradient if available, falls back to first stop color otherwise
66
+ */
67
+ const GradientView = ({ gradient, fallbackColor, style, children, borderRadius, borderWidth, borderColor, }) => {
68
+ // Calculate gradient colors and positions
69
+ const { colors, locations, start, end } = (0, react_1.useMemo)(() => {
70
+ var _a;
71
+ const colors = gradient.stops.map(stop => stop.color);
72
+ const locations = gradient.stops.map(stop => {
73
+ var _a;
74
+ const pos = (_a = stop.position) !== null && _a !== void 0 ? _a : 0;
75
+ return pos <= 1 ? pos : pos / 100;
76
+ });
77
+ // Get start/end points based on angle
78
+ const points = gradient.type === 'linear'
79
+ ? (0, CSSConverter_1.angleToGradientPoints)((_a = gradient.angle) !== null && _a !== void 0 ? _a : 180)
80
+ : { start: { x: 0.5, y: 0.5 }, end: { x: 1, y: 1 } }; // Radial approximation
81
+ return { colors, locations, ...points };
82
+ }, [gradient]);
83
+ // Container style with border properties
84
+ const containerStyle = {
85
+ borderRadius,
86
+ borderWidth,
87
+ borderColor,
88
+ overflow: 'hidden', // Ensure gradient respects borderRadius
89
+ };
90
+ // If LinearGradient is available, use it
91
+ if (LinearGradient && gradient.type === 'linear') {
92
+ return (<LinearGradient colors={colors} locations={locations} start={start} end={end} style={[style, containerStyle]}>
93
+ {children}
94
+ </LinearGradient>);
95
+ }
96
+ // For radial gradients or if LinearGradient isn't available, use fallback
97
+ const backgroundColor = fallbackColor || colors[0] || 'transparent';
98
+ return (<react_native_1.View style={[style, containerStyle, { backgroundColor }]}>
99
+ {children}
100
+ </react_native_1.View>);
101
+ };
102
+ exports.GradientView = GradientView;
103
+ /**
104
+ * Check if LinearGradient is available
105
+ */
106
+ function isGradientSupported() {
107
+ return LinearGradient !== null;
108
+ }
109
+ /**
110
+ * Get gradient background style or fallback color
111
+ * Use this when you need to decide between GradientView or regular View
112
+ */
113
+ function getGradientStyleOrFallback(gradient, fallbackColor) {
114
+ var _a, _b;
115
+ if (!gradient || !LinearGradient) {
116
+ return {
117
+ useGradient: false,
118
+ backgroundColor: fallbackColor || ((_a = gradient === null || gradient === void 0 ? void 0 : gradient.stops[0]) === null || _a === void 0 ? void 0 : _a.color) || 'transparent',
119
+ };
120
+ }
121
+ return {
122
+ useGradient: true,
123
+ backgroundColor: fallbackColor || ((_b = gradient.stops[0]) === null || _b === void 0 ? void 0 : _b.color) || 'transparent',
124
+ gradient,
125
+ };
126
+ }
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import { PaywallComponent } from '../types';
3
+ interface HapticFeedbackComponentProps {
4
+ component: PaywallComponent;
5
+ isPreviewMode?: boolean;
6
+ }
7
+ /**
8
+ * HapticFeedbackComponent — invisible behavior component.
9
+ *
10
+ * Fires a single device haptic on mount, reusing the shared `triggerHaptic`
11
+ * util (the same one the haptic tap-action uses). Skipped in the builder
12
+ * preview. The style comes from `properties.hapticStyle` (the six canonical
13
+ * HapticType values), falling back to `medium`. Renders nothing visible.
14
+ */
15
+ export declare const HapticFeedbackComponent: React.FC<HapticFeedbackComponentProps>;
16
+ export {};
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.HapticFeedbackComponent = void 0;
37
+ const react_1 = __importStar(require("react"));
38
+ const react_native_1 = require("react-native");
39
+ const hapticFeedback_1 = require("../utils/hapticFeedback");
40
+ const HAPTIC_STYLES = new Set([
41
+ 'light', 'medium', 'heavy', 'success', 'warning', 'error',
42
+ ]);
43
+ /**
44
+ * HapticFeedbackComponent — invisible behavior component.
45
+ *
46
+ * Fires a single device haptic on mount, reusing the shared `triggerHaptic`
47
+ * util (the same one the haptic tap-action uses). Skipped in the builder
48
+ * preview. The style comes from `properties.hapticStyle` (the six canonical
49
+ * HapticType values), falling back to `medium`. Renders nothing visible.
50
+ */
51
+ const HapticFeedbackComponent = ({ component, isPreviewMode = false, }) => {
52
+ const hasFiredRef = (0, react_1.useRef)(false);
53
+ (0, react_1.useEffect)(() => {
54
+ if (isPreviewMode || hasFiredRef.current)
55
+ return;
56
+ hasFiredRef.current = true;
57
+ const props = component.properties || {};
58
+ const raw = typeof props.hapticStyle === 'string' ? props.hapticStyle : 'medium';
59
+ const style = (HAPTIC_STYLES.has(raw) ? raw : 'medium');
60
+ (0, hapticFeedback_1.triggerHaptic)(style);
61
+ }, [component.id, isPreviewMode]);
62
+ return <react_native_1.View style={{ width: 0, height: 0 }}/>;
63
+ };
64
+ exports.HapticFeedbackComponent = HapticFeedbackComponent;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Horizontal Products Component for React Native
3
+ * Pure Child Model: renders children via renderChild with horizontal FlatList layout,
4
+ * overlay extraction, child sanitization, and selection state propagation.
5
+ * Matches Android ProductsComponent.kt and iOS ProductsRenderer.swift architecture.
6
+ */
7
+ import React from 'react';
8
+ import { PaywallComponent, PaywallConfiguration } from '../types';
9
+ export interface HorizontalProductsComponentProps {
10
+ component: PaywallComponent;
11
+ configuration: PaywallConfiguration;
12
+ renderChild: (child: PaywallComponent) => React.ReactNode;
13
+ stateManager?: any;
14
+ onAction?: (componentId: string, action: string) => void;
15
+ }
16
+ export declare const HorizontalProductsComponent: React.FC<HorizontalProductsComponentProps>;
17
+ export default HorizontalProductsComponent;
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ /**
3
+ * Horizontal Products Component for React Native
4
+ * Pure Child Model: renders children via renderChild with horizontal FlatList layout,
5
+ * overlay extraction, child sanitization, and selection state propagation.
6
+ * Matches Android ProductsComponent.kt and iOS ProductsRenderer.swift architecture.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.HorizontalProductsComponent = void 0;
43
+ const react_1 = __importStar(require("react"));
44
+ const react_native_1 = require("react-native");
45
+ const PaywallStateManager_1 = require("../PaywallStateManager");
46
+ function getRole(child) {
47
+ var _a;
48
+ return child.role || ((_a = child.properties) === null || _a === void 0 ? void 0 : _a.role);
49
+ }
50
+ function extractOverlays(children) {
51
+ if (!(children === null || children === void 0 ? void 0 : children.length)) {
52
+ return { badge: null, checkmark: null, radioIndicator: null, remainingChildren: [] };
53
+ }
54
+ const badge = children.find(c => getRole(c) === 'badge') || null;
55
+ const checkmark = children.find(c => getRole(c) === 'checkmark') || null;
56
+ const radioIndicator = children.find(c => getRole(c) === 'radio-indicator') || null;
57
+ const remaining = children.filter(c => c !== badge && c !== checkmark && c !== radioIndicator);
58
+ return { badge, checkmark, radioIndicator, remainingChildren: remaining };
59
+ }
60
+ // ============= CHILD SANITIZATION =============
61
+ function sanitizeProductChild(child) {
62
+ const sanitized = { ...child };
63
+ if (sanitized.appearance) {
64
+ const { fill, backgroundColor, cornerRadius, borderColor, borderWidth, shadow, ...rest } = sanitized.appearance;
65
+ sanitized.appearance = rest;
66
+ }
67
+ sanitized.selectedAppearance = undefined;
68
+ if (sanitized.layout) {
69
+ const { padding, ...restLayout } = sanitized.layout;
70
+ sanitized.layout = restLayout;
71
+ }
72
+ return sanitized;
73
+ }
74
+ // ============= SELECTION STATE PROPAGATION =============
75
+ function applySelectionState(component, isSelected, isHybridMode) {
76
+ var _a;
77
+ if (!isHybridMode)
78
+ return component;
79
+ const role = getRole(component);
80
+ if (role === 'radio-indicator' && component.type === 'stack' && component.children) {
81
+ return {
82
+ ...component,
83
+ children: component.children.map(iconChild => {
84
+ const iconRole = getRole(iconChild);
85
+ if (iconRole === 'selected-icon')
86
+ return { ...iconChild, visible: isSelected };
87
+ if (iconRole === 'unselected-icon')
88
+ return { ...iconChild, visible: !isSelected };
89
+ return applySelectionState(iconChild, isSelected, isHybridMode);
90
+ }),
91
+ };
92
+ }
93
+ if (role === 'checkmark') {
94
+ return { ...component, visible: isSelected };
95
+ }
96
+ if ((_a = component.children) === null || _a === void 0 ? void 0 : _a.length) {
97
+ return {
98
+ ...component,
99
+ children: component.children.map(c => applySelectionState(c, isSelected, isHybridMode)),
100
+ };
101
+ }
102
+ return component;
103
+ }
104
+ // ============= HYBRID MODE DETECTION =============
105
+ function hasHybridChildren(children) {
106
+ return children.some(child => {
107
+ if (getRole(child))
108
+ return true;
109
+ return hasChildWithRole(child);
110
+ });
111
+ }
112
+ function hasChildWithRole(component) {
113
+ if (!component.children)
114
+ return false;
115
+ for (const child of component.children) {
116
+ if (getRole(child))
117
+ return true;
118
+ if (hasChildWithRole(child))
119
+ return true;
120
+ }
121
+ return false;
122
+ }
123
+ // ============= HELPERS =============
124
+ function resolveNumber(val, fallback) {
125
+ if (typeof val === 'number')
126
+ return val;
127
+ if (val && typeof val === 'object' && 'value' in val)
128
+ return val.value;
129
+ return fallback;
130
+ }
131
+ function resolveColor(appearance, key, fallback) {
132
+ if (!appearance)
133
+ return fallback;
134
+ const val = appearance[key];
135
+ if (!val)
136
+ return fallback;
137
+ if (typeof val === 'string')
138
+ return val;
139
+ if (val.resolvedColor)
140
+ return val.resolvedColor;
141
+ if (val.color)
142
+ return typeof val.color === 'string' ? val.color : fallback;
143
+ if (val.hex)
144
+ return val.hex;
145
+ return fallback;
146
+ }
147
+ function resolveFillColor(appearance, fallback) {
148
+ if (!appearance)
149
+ return fallback;
150
+ if (appearance.fill)
151
+ return resolveColor(appearance, 'fill', fallback);
152
+ if (appearance.backgroundColor)
153
+ return resolveColor(appearance, 'backgroundColor', fallback);
154
+ return fallback;
155
+ }
156
+ // ============= MAIN COMPONENT =============
157
+ const HorizontalProductsComponent = ({ component, configuration, renderChild, stateManager, onAction, }) => {
158
+ const properties = component.properties || {};
159
+ const allChildren = component.children || [];
160
+ const flatListRef = (0, react_1.useRef)(null);
161
+ // Package binding
162
+ const bindToPackages = properties.bindToPackages !== false;
163
+ const packageIdentifiers = properties.packageIdentifiers || [];
164
+ const boundPackages = bindToPackages
165
+ ? (packageIdentifiers.length > 0
166
+ ? packageIdentifiers
167
+ .map(id => (configuration.packages || []).find(p => p.identifier === id || p.productId === id))
168
+ .filter(Boolean)
169
+ : configuration.packages || [])
170
+ : [];
171
+ const children = (bindToPackages && boundPackages.length > 0)
172
+ ? allChildren.slice(0, boundPackages.length)
173
+ : allChildren.filter(c => c.visible !== false);
174
+ const gap = resolveNumber(properties.gap, 12);
175
+ const defaultSelectedIndex = resolveNumber(properties.defaultSelectedIndex, 0);
176
+ const cardWidth = resolveNumber(properties.cardWidth, 160);
177
+ const cardHeight = resolveNumber(properties.cardHeight, 200);
178
+ const showBadge = !!properties.showBadge;
179
+ const badgeProductIndex = resolveNumber(properties.badgeProductIndex, 0);
180
+ const enableSnapScrolling = properties.enableSnapScrolling !== false;
181
+ const isHybridMode = hasHybridChildren(children);
182
+ // State
183
+ const stateKey = `element:${component.id}.selectedIndex`;
184
+ const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(defaultSelectedIndex);
185
+ (0, react_1.useEffect)(() => {
186
+ var _a, _b, _c;
187
+ if (!stateManager)
188
+ return;
189
+ const existing = (_a = stateManager.getState) === null || _a === void 0 ? void 0 : _a.call(stateManager, stateKey);
190
+ if (existing !== undefined && existing !== null) {
191
+ setSelectedIndex(Number(existing));
192
+ }
193
+ else {
194
+ (_b = stateManager.setState) === null || _b === void 0 ? void 0 : _b.call(stateManager, stateKey, defaultSelectedIndex);
195
+ }
196
+ // Return the unsubscribe. This was dropped on the floor while nothing supplied a
197
+ // stateManager and every call no-opped; now that one is provided, an uncleaned
198
+ // subscription leaks a listener holding a stale setSelectedIndex on each remount.
199
+ return (_c = stateManager.subscribe) === null || _c === void 0 ? void 0 : _c.call(stateManager, stateKey, (value) => {
200
+ setSelectedIndex(Number(value) || 0);
201
+ });
202
+ }, [component.id, stateManager]);
203
+ // Publish the live selection PAYWALL-WIDE so Dynamic Values can react to it
204
+ // (`products.selectedIndex == 1` templates) and so `selectedProduct.*` resolves for
205
+ // the user's actual choice. The per-element key above is scoped to this component.
206
+ // With multiple products components, last write wins — same contract as Android
207
+ // ProductsComponent and iOS ProductsRenderer.updateSelectionState.
208
+ (0, react_1.useEffect)(() => {
209
+ var _a;
210
+ (_a = stateManager === null || stateManager === void 0 ? void 0 : stateManager.setState) === null || _a === void 0 ? void 0 : _a.call(stateManager, PaywallStateManager_1.PaywallStateManager.SELECTED_INDEX_KEY, selectedIndex);
211
+ }, [selectedIndex, stateManager]);
212
+ const handleSelect = (0, react_1.useCallback)((index) => {
213
+ var _a, _b;
214
+ setSelectedIndex(index);
215
+ (_a = stateManager === null || stateManager === void 0 ? void 0 : stateManager.setState) === null || _a === void 0 ? void 0 : _a.call(stateManager, stateKey, index);
216
+ onAction === null || onAction === void 0 ? void 0 : onAction(component.id, `select_package:${index},${(_b = children[index]) === null || _b === void 0 ? void 0 : _b.id}`);
217
+ react_native_1.AccessibilityInfo.announceForAccessibility(`Selected product ${index + 1}`);
218
+ }, [stateKey, stateManager, onAction, component.id, children]);
219
+ const renderProductCard = (child, index) => {
220
+ const isSelected = index === selectedIndex;
221
+ const childAppearance = child.appearance;
222
+ const childSelectedAppearance = child.selectedAppearance;
223
+ const childLayout = child.layout;
224
+ const cardBg = resolveFillColor(childAppearance, 'transparent');
225
+ const cardCornerRadius = resolveNumber(childAppearance === null || childAppearance === void 0 ? void 0 : childAppearance.cornerRadius, 12);
226
+ const cardBorderColor = resolveColor(childAppearance, 'borderColor', 'rgba(128,128,128,0.2)');
227
+ const cardBorderWidth = resolveNumber(childAppearance === null || childAppearance === void 0 ? void 0 : childAppearance.borderWidth, 0);
228
+ const selectedBg = resolveFillColor(childSelectedAppearance, 'rgba(59,130,246,0.1)');
229
+ const selectedBorderColor = resolveColor(childSelectedAppearance, 'borderColor', '#3B82F6');
230
+ const selectedBorderWidth = resolveNumber(childSelectedAppearance === null || childSelectedAppearance === void 0 ? void 0 : childSelectedAppearance.borderWidth, 2);
231
+ const bgColor = isSelected ? selectedBg : cardBg;
232
+ const borderColorVal = isSelected ? selectedBorderColor : cardBorderColor;
233
+ const borderWidthVal = isSelected ? selectedBorderWidth : cardBorderWidth;
234
+ // Padding from child.layout.padding
235
+ const padding = childLayout === null || childLayout === void 0 ? void 0 : childLayout.padding;
236
+ const paddingTop = resolveNumber(padding === null || padding === void 0 ? void 0 : padding.top, 14);
237
+ const paddingRight = resolveNumber(padding === null || padding === void 0 ? void 0 : padding.right, 16);
238
+ const paddingBottom = resolveNumber(padding === null || padding === void 0 ? void 0 : padding.bottom, 14);
239
+ const paddingLeft = resolveNumber(padding === null || padding === void 0 ? void 0 : padding.left, 16);
240
+ const extraction = extractOverlays(child.children);
241
+ const childWithRemaining = { ...child, children: extraction.remainingChildren };
242
+ const sanitized = sanitizeProductChild(childWithRemaining);
243
+ const transformed = applySelectionState(sanitized, isSelected, isHybridMode);
244
+ return (<react_native_1.TouchableOpacity activeOpacity={0.8} onPress={() => handleSelect(index)} accessibilityRole="radio" accessibilityState={{ selected: isSelected }} accessibilityLabel={`Product ${index + 1}, ${isSelected ? 'selected' : 'not selected'}`} style={{ marginRight: index < children.length - 1 ? gap : 0 }}>
245
+ <react_native_1.View style={{ width: cardWidth, height: cardHeight, position: 'relative' }}>
246
+ {/* Layer 1: Background */}
247
+ <react_native_1.View style={{
248
+ ...react_native_1.StyleSheet.absoluteFillObject,
249
+ backgroundColor: bgColor,
250
+ borderRadius: cardCornerRadius,
251
+ borderColor: borderColorVal,
252
+ borderWidth: borderWidthVal,
253
+ }}/>
254
+
255
+ {/* Layer 2: Content */}
256
+ <react_native_1.View style={{
257
+ flex: 1,
258
+ alignItems: 'center',
259
+ justifyContent: 'center',
260
+ paddingTop,
261
+ paddingRight,
262
+ paddingBottom,
263
+ paddingLeft,
264
+ }}>
265
+ {renderChild(transformed)}
266
+ </react_native_1.View>
267
+
268
+ {/* Layer 3: Badge overlay */}
269
+ {extraction.badge && showBadge && index === badgeProductIndex && (<react_native_1.View style={{ position: 'absolute', top: -10, right: 12, zIndex: 10 }}>
270
+ {renderChild(extraction.badge)}
271
+ </react_native_1.View>)}
272
+ </react_native_1.View>
273
+ </react_native_1.TouchableOpacity>);
274
+ };
275
+ return (<react_native_1.View accessibilityRole="radiogroup" accessibilityLabel="Select a product">
276
+ <react_native_1.FlatList ref={flatListRef} data={children} renderItem={({ item, index }) => renderProductCard(item, index)} keyExtractor={(item, index) => item.id || `product-${index}`} horizontal showsHorizontalScrollIndicator={false} snapToInterval={enableSnapScrolling ? cardWidth + gap : undefined} snapToAlignment="start" decelerationRate={enableSnapScrolling ? 'fast' : 'normal'} contentContainerStyle={{ paddingTop: 12 }} getItemLayout={(_, index) => ({
277
+ length: cardWidth + gap,
278
+ offset: (cardWidth + gap) * index,
279
+ index,
280
+ })}/>
281
+ </react_native_1.View>);
282
+ };
283
+ exports.HorizontalProductsComponent = HorizontalProductsComponent;
284
+ exports.default = exports.HorizontalProductsComponent;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Multi Choice Grid Component for React Native
3
+ * Checkbox style grid selection (multiple selection)
4
+ */
5
+ import React from 'react';
6
+ import { PaywallComponent } from '../types';
7
+ interface MultiChoiceGridProps {
8
+ component: PaywallComponent;
9
+ stateManager?: any;
10
+ isPreviewMode?: boolean;
11
+ }
12
+ export declare const MultiChoiceGridComponent: React.FC<MultiChoiceGridProps>;
13
+ export {};