@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,105 @@
1
+ //
2
+ // BillDogAnalytics.m
3
+ // @billdog.io/react-native
4
+ //
5
+ // RCT_EXTERN bridge declarations for the BillDogAnalytics Swift module.
6
+ // ⚠️ Requires `pod install` + Xcode to compile/verify — no iOS toolchain in
7
+ // the authoring environment.
8
+ //
9
+
10
+ #import <React/RCTBridgeModule.h>
11
+ #import <React/RCTEventEmitter.h>
12
+
13
+ @interface RCT_EXTERN_MODULE(BillDogAnalytics, RCTEventEmitter)
14
+
15
+ RCT_EXTERN_METHOD(initialize:(RCTPromiseResolveBlock)resolve
16
+ rejecter:(RCTPromiseRejectBlock)reject)
17
+
18
+ RCT_EXTERN_METHOD(track:(NSString *)name
19
+ properties:(NSDictionary *)properties
20
+ resolver:(RCTPromiseResolveBlock)resolve
21
+ rejecter:(RCTPromiseRejectBlock)reject)
22
+
23
+ RCT_EXTERN_METHOD(trackRevenue:(nonnull NSNumber *)amount
24
+ currency:(NSString *)currency
25
+ productId:(NSString *)productId
26
+ properties:(NSDictionary *)properties
27
+ resolver:(RCTPromiseResolveBlock)resolve
28
+ rejecter:(RCTPromiseRejectBlock)reject)
29
+
30
+ RCT_EXTERN_METHOD(identify:(NSString *)userId
31
+ properties:(NSDictionary *)properties
32
+ resolver:(RCTPromiseResolveBlock)resolve
33
+ rejecter:(RCTPromiseRejectBlock)reject)
34
+
35
+ RCT_EXTERN_METHOD(setSuperProperties:(NSDictionary *)properties
36
+ resolver:(RCTPromiseResolveBlock)resolve
37
+ rejecter:(RCTPromiseRejectBlock)reject)
38
+
39
+ RCT_EXTERN_METHOD(updateUserProperties:(NSString *)operation
40
+ properties:(NSDictionary *)properties
41
+ resolver:(RCTPromiseResolveBlock)resolve
42
+ rejecter:(RCTPromiseRejectBlock)reject)
43
+
44
+ RCT_EXTERN_METHOD(flush:(RCTPromiseResolveBlock)resolve
45
+ rejecter:(RCTPromiseRejectBlock)reject)
46
+
47
+ RCT_EXTERN_METHOD(optOut:(RCTPromiseResolveBlock)resolve
48
+ rejecter:(RCTPromiseRejectBlock)reject)
49
+
50
+ RCT_EXTERN_METHOD(optIn:(RCTPromiseResolveBlock)resolve
51
+ rejecter:(RCTPromiseRejectBlock)reject)
52
+
53
+ RCT_EXTERN_METHOD(reset:(RCTPromiseResolveBlock)resolve
54
+ rejecter:(RCTPromiseRejectBlock)reject)
55
+
56
+ RCT_EXTERN_METHOD(alias:(NSString *)newId
57
+ originalId:(NSString *)originalId
58
+ resolver:(RCTPromiseResolveBlock)resolve
59
+ rejecter:(RCTPromiseRejectBlock)reject)
60
+
61
+ RCT_EXTERN_METHOD(timeEvent:(NSString *)eventName
62
+ resolver:(RCTPromiseResolveBlock)resolve
63
+ rejecter:(RCTPromiseRejectBlock)reject)
64
+
65
+ RCT_EXTERN_METHOD(setGroup:(NSString *)groupType
66
+ groupId:(NSString *)groupId
67
+ resolver:(RCTPromiseResolveBlock)resolve
68
+ rejecter:(RCTPromiseRejectBlock)reject)
69
+
70
+ RCT_EXTERN_METHOD(setGroupProperties:(NSString *)groupType
71
+ groupId:(NSString *)groupId
72
+ properties:(NSDictionary *)properties
73
+ resolver:(RCTPromiseResolveBlock)resolve
74
+ rejecter:(RCTPromiseRejectBlock)reject)
75
+
76
+ RCT_EXTERN_METHOD(trackScreen:(NSString *)screenName
77
+ properties:(NSDictionary *)properties
78
+ resolver:(RCTPromiseResolveBlock)resolve
79
+ rejecter:(RCTPromiseRejectBlock)reject)
80
+
81
+ RCT_EXTERN_METHOD(trackDeepLink:(NSString *)url
82
+ resolver:(RCTPromiseResolveBlock)resolve
83
+ rejecter:(RCTPromiseRejectBlock)reject)
84
+
85
+ RCT_EXTERN_METHOD(getDeviceId:(RCTPromiseResolveBlock)resolve
86
+ rejecter:(RCTPromiseRejectBlock)reject)
87
+
88
+ RCT_EXTERN_METHOD(getDistinctId:(RCTPromiseResolveBlock)resolve
89
+ rejecter:(RCTPromiseRejectBlock)reject)
90
+
91
+ RCT_EXTERN_METHOD(getSessionId:(RCTPromiseResolveBlock)resolve
92
+ rejecter:(RCTPromiseRejectBlock)reject)
93
+
94
+ RCT_EXTERN_METHOD(registerSuperPropertiesOnce:(NSDictionary *)properties
95
+ resolver:(RCTPromiseResolveBlock)resolve
96
+ rejecter:(RCTPromiseRejectBlock)reject)
97
+
98
+ RCT_EXTERN_METHOD(unregisterSuperProperty:(NSString *)key
99
+ resolver:(RCTPromiseResolveBlock)resolve
100
+ rejecter:(RCTPromiseRejectBlock)reject)
101
+
102
+ RCT_EXTERN_METHOD(clearSuperProperties:(RCTPromiseResolveBlock)resolve
103
+ rejecter:(RCTPromiseRejectBlock)reject)
104
+
105
+ @end
@@ -0,0 +1,324 @@
1
+ //
2
+ // BillDogAnalytics.swift
3
+ // @billdog.io/react-native
4
+ //
5
+ // React Native bridge → native `BillDogAnalyticsManager`.
6
+ //
7
+ // ⚠️ VERIFICATION: there is no iOS/CocoaPods toolchain in the authoring
8
+ // environment. This file is written to be internally consistent and
9
+ // compile-ready against the verified native signatures (cited inline as
10
+ // `BillDogAnalytics.swift:<line>` / `BillDog.swift:<line>`), but it REQUIRES a
11
+ // `pod install` + Xcode build to actually compile and run.
12
+ //
13
+ // Manager is looked up per-call via `BillDog.shared.getModules()`
14
+ // (BillDog.swift:579) — cheap array compactMap. When the analytics module is
15
+ // not registered (SDK not configured), every mutating call is a best-effort
16
+ // NO-OP that resolves nil, matching the JS side (which silently no-ops when the
17
+ // native module is unlinked). Mirrors packages/flutter/.../BillDogAnalyticsChannel.swift.
18
+ //
19
+
20
+ import Foundation
21
+ import React
22
+ import BillDogFull
23
+
24
+ @objc(BillDogAnalytics)
25
+ class BillDogAnalytics: RCTEventEmitter {
26
+
27
+ private var hasListeners = false
28
+
29
+ override static func requiresMainQueueSetup() -> Bool {
30
+ return false
31
+ }
32
+
33
+ override func supportedEvents() -> [String]! {
34
+ return ["onAnalyticsFlush"]
35
+ }
36
+
37
+ override func startObserving() {
38
+ hasListeners = true
39
+ }
40
+
41
+ override func stopObserving() {
42
+ hasListeners = false
43
+ }
44
+
45
+ // MARK: - Native manager access
46
+
47
+ // BillDog.shared.getModules() -> [BillDogModule] (BillDog.swift:579)
48
+ // BillDogAnalyticsManager: BillDogModule (BillDogAnalytics.swift:18)
49
+ private func manager() -> BillDogAnalyticsManager? {
50
+ return BillDog.shared.getModules()
51
+ .compactMap { $0 as? BillDogAnalyticsManager }
52
+ .first
53
+ }
54
+
55
+ // MARK: - Lifecycle
56
+
57
+ // The analytics module is registered by BillDogBridge.configure() via
58
+ // `BillDog.shared.use(module:)` — NOT by `configure(config:)`, which registers
59
+ // nothing. (An earlier comment here claimed the latter, which masked the fact
60
+ // that nothing registered analytics at all and every event was dropped.)
61
+ // Resolve as a no-op so the JS init handshake completes; warn loudly when the
62
+ // registry is still empty.
63
+ @objc
64
+ func initialize(_ resolve: @escaping RCTPromiseResolveBlock,
65
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
66
+ if manager() == nil {
67
+ NSLog("[BillDogAnalytics] initialize(): analytics module NOT registered — "
68
+ + "call BillDog configure() first; track()/identify() will no-op")
69
+ }
70
+ resolve(nil)
71
+ }
72
+
73
+ // MARK: - Tracking
74
+
75
+ @objc
76
+ func track(_ name: String,
77
+ properties: NSDictionary,
78
+ resolver resolve: @escaping RCTPromiseResolveBlock,
79
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
80
+ // Facade: BillDog.shared.trackEvent(_:properties:) (BillDog.swift:2682)
81
+ BillDog.shared.trackEvent(name, properties: properties as? [String: Any] ?? [:])
82
+ resolve(nil)
83
+ }
84
+
85
+ @objc
86
+ func trackRevenue(_ amount: NSNumber,
87
+ currency: String,
88
+ productId: String?,
89
+ properties: NSDictionary,
90
+ resolver resolve: @escaping RCTPromiseResolveBlock,
91
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
92
+ guard let mgr = manager() else { resolve(nil); return }
93
+ // mgr.trackRevenue(amount:currency:productId:properties:) (BillDogAnalytics.swift:729)
94
+ mgr.trackRevenue(
95
+ amount: amount.doubleValue,
96
+ currency: currency,
97
+ productId: productId,
98
+ properties: properties as? [String: Any] ?? [:]
99
+ )
100
+ resolve(nil)
101
+ }
102
+
103
+ @objc
104
+ func identify(_ userId: String,
105
+ properties: NSDictionary,
106
+ resolver resolve: @escaping RCTPromiseResolveBlock,
107
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
108
+ guard let mgr = manager() else { resolve(nil); return }
109
+ // mgr.identify(userId:properties:) (BillDogAnalytics.swift:717)
110
+ mgr.identify(userId: userId, properties: properties as? [String: Any] ?? [:])
111
+ resolve(nil)
112
+ }
113
+
114
+ @objc
115
+ func setSuperProperties(_ properties: NSDictionary,
116
+ resolver resolve: @escaping RCTPromiseResolveBlock,
117
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
118
+ guard let mgr = manager() else { resolve(nil); return }
119
+ // mgr.registerSuperProperties(_:) (BillDogAnalytics.swift:479)
120
+ mgr.registerSuperProperties(properties as? [String: Any] ?? [:])
121
+ resolve(nil)
122
+ }
123
+
124
+ @objc
125
+ func updateUserProperties(_ operation: String,
126
+ properties: NSDictionary,
127
+ resolver resolve: @escaping RCTPromiseResolveBlock,
128
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
129
+ guard let mgr = manager() else { resolve(nil); return }
130
+ let props = properties as? [String: Any] ?? [:]
131
+ // Route by operation to the matching per-key / bulk user-property methods.
132
+ switch operation {
133
+ case "$set":
134
+ // mgr.setUserProperties(_:) (BillDogAnalytics.swift:760)
135
+ mgr.setUserProperties(props)
136
+ case "$set_once":
137
+ // mgr.setUserPropertyOnce(_:value:) (BillDogAnalytics.swift:764) — per key
138
+ for (key, value) in props { mgr.setUserPropertyOnce(key, value: value) }
139
+ case "$add":
140
+ // mgr.incrementUserProperty(_:by:) (BillDogAnalytics.swift:768) — per key, Double
141
+ for (key, value) in props {
142
+ let by = (value as? NSNumber)?.doubleValue ?? (value as? Double) ?? 0
143
+ mgr.incrementUserProperty(key, by: by)
144
+ }
145
+ case "$append":
146
+ // mgr.appendToUserProperty(_:value:) (BillDogAnalytics.swift:772) — per key
147
+ for (key, value) in props { mgr.appendToUserProperty(key, value: value) }
148
+ case "$unset":
149
+ // mgr.unsetUserProperties(_:) (BillDogAnalytics.swift:780) — keys
150
+ mgr.unsetUserProperties(Array(props.keys))
151
+ case "$remove":
152
+ // No native counterpart — best-effort no-op.
153
+ break
154
+ default:
155
+ break
156
+ }
157
+ resolve(nil)
158
+ }
159
+
160
+ @objc
161
+ func flush(_ resolve: @escaping RCTPromiseResolveBlock,
162
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
163
+ guard let mgr = manager() else { resolve(nil); return }
164
+ // mgr.flush() (BillDogAnalytics.swift:792)
165
+ mgr.flush()
166
+ // The native flush() returns Void (no batch count), so `eventCount` is
167
+ // reported as 0 — there is no native equivalent for the flushed count.
168
+ if hasListeners {
169
+ sendEvent(withName: "onAnalyticsFlush", body: ["eventCount": 0])
170
+ }
171
+ resolve(nil)
172
+ }
173
+
174
+ @objc
175
+ func optOut(_ resolve: @escaping RCTPromiseResolveBlock,
176
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
177
+ guard let mgr = manager() else { resolve(nil); return }
178
+ // mgr.optOut() (BillDogAnalytics.swift:446)
179
+ mgr.optOut()
180
+ resolve(nil)
181
+ }
182
+
183
+ @objc
184
+ func optIn(_ resolve: @escaping RCTPromiseResolveBlock,
185
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
186
+ guard let mgr = manager() else { resolve(nil); return }
187
+ // mgr.optIn() (BillDogAnalytics.swift:465)
188
+ mgr.optIn()
189
+ resolve(nil)
190
+ }
191
+
192
+ @objc
193
+ func reset(_ resolve: @escaping RCTPromiseResolveBlock,
194
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
195
+ guard let mgr = manager() else { resolve(nil); return }
196
+ // mgr.reset() (BillDogAnalytics.swift:959)
197
+ mgr.reset()
198
+ resolve(nil)
199
+ }
200
+
201
+ @objc
202
+ func alias(_ newId: String,
203
+ originalId: String?,
204
+ resolver resolve: @escaping RCTPromiseResolveBlock,
205
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
206
+ guard let mgr = manager() else { resolve(nil); return }
207
+ // mgr.alias(newId:previousId:) (BillDogAnalytics.swift:1138) — originalId -> previousId
208
+ mgr.alias(newId: newId, previousId: originalId)
209
+ resolve(nil)
210
+ }
211
+
212
+ @objc
213
+ func timeEvent(_ eventName: String,
214
+ resolver resolve: @escaping RCTPromiseResolveBlock,
215
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
216
+ guard let mgr = manager() else { resolve(nil); return }
217
+ // mgr.timeEvent(_:) (BillDogAnalytics.swift:1130)
218
+ mgr.timeEvent(eventName)
219
+ resolve(nil)
220
+ }
221
+
222
+ @objc
223
+ func setGroup(_ groupType: String,
224
+ groupId: String,
225
+ resolver resolve: @escaping RCTPromiseResolveBlock,
226
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
227
+ guard let mgr = manager() else { resolve(nil); return }
228
+ // mgr.setGroup(groupType:groupId:) (BillDogAnalytics.swift:1104)
229
+ mgr.setGroup(groupType: groupType, groupId: groupId)
230
+ resolve(nil)
231
+ }
232
+
233
+ @objc
234
+ func setGroupProperties(_ groupType: String,
235
+ groupId: String,
236
+ properties: NSDictionary,
237
+ resolver resolve: @escaping RCTPromiseResolveBlock,
238
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
239
+ guard let mgr = manager() else { resolve(nil); return }
240
+ // mgr.setGroupProperties(groupType:groupId:properties:) (BillDogAnalytics.swift:1116)
241
+ mgr.setGroupProperties(
242
+ groupType: groupType,
243
+ groupId: groupId,
244
+ properties: properties as? [String: Any] ?? [:]
245
+ )
246
+ resolve(nil)
247
+ }
248
+
249
+ @objc
250
+ func trackScreen(_ screenName: String,
251
+ properties: NSDictionary,
252
+ resolver resolve: @escaping RCTPromiseResolveBlock,
253
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
254
+ guard let mgr = manager() else { resolve(nil); return }
255
+ // mgr.trackScreen(_:properties:) (BillDogAnalytics.swift:1039)
256
+ mgr.trackScreen(screenName, properties: properties as? [String: Any] ?? [:])
257
+ resolve(nil)
258
+ }
259
+
260
+ @objc
261
+ func trackDeepLink(_ url: String,
262
+ resolver resolve: @escaping RCTPromiseResolveBlock,
263
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
264
+ guard let mgr = manager() else { resolve(nil); return }
265
+ // mgr.trackDeepLink(_:) (BillDogAnalytics.swift:1028) — takes URL, guard nil
266
+ if let parsed = URL(string: url) {
267
+ mgr.trackDeepLink(parsed)
268
+ }
269
+ resolve(nil)
270
+ }
271
+
272
+ @objc
273
+ func getDeviceId(_ resolve: @escaping RCTPromiseResolveBlock,
274
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
275
+ guard let mgr = manager() else { resolve(nil); return }
276
+ // mgr.getDeviceId() -> String (BillDogAnalytics.swift:1082)
277
+ resolve(mgr.getDeviceId())
278
+ }
279
+
280
+ @objc
281
+ func getDistinctId(_ resolve: @escaping RCTPromiseResolveBlock,
282
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
283
+ guard let mgr = manager() else { resolve(nil); return }
284
+ // mgr.getDistinctId() -> String (BillDogAnalytics.swift:1095)
285
+ resolve(mgr.getDistinctId())
286
+ }
287
+
288
+ @objc
289
+ func getSessionId(_ resolve: @escaping RCTPromiseResolveBlock,
290
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
291
+ guard let mgr = manager() else { resolve(nil); return }
292
+ // mgr.getSessionId() -> String (BillDogAnalytics.swift:1045)
293
+ resolve(mgr.getSessionId())
294
+ }
295
+
296
+ @objc
297
+ func registerSuperPropertiesOnce(_ properties: NSDictionary,
298
+ resolver resolve: @escaping RCTPromiseResolveBlock,
299
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
300
+ guard let mgr = manager() else { resolve(nil); return }
301
+ // mgr.registerSuperPropertiesOnce(_:) (BillDogAnalytics.swift:485)
302
+ mgr.registerSuperPropertiesOnce(properties as? [String: Any] ?? [:])
303
+ resolve(nil)
304
+ }
305
+
306
+ @objc
307
+ func unregisterSuperProperty(_ key: String,
308
+ resolver resolve: @escaping RCTPromiseResolveBlock,
309
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
310
+ guard let mgr = manager() else { resolve(nil); return }
311
+ // mgr.unregisterSuperProperty(_:) (BillDogAnalytics.swift:497)
312
+ mgr.unregisterSuperProperty(key)
313
+ resolve(nil)
314
+ }
315
+
316
+ @objc
317
+ func clearSuperProperties(_ resolve: @escaping RCTPromiseResolveBlock,
318
+ rejecter reject: @escaping RCTPromiseRejectBlock) {
319
+ guard let mgr = manager() else { resolve(nil); return }
320
+ // mgr.clearSuperProperties() (BillDogAnalytics.swift:503)
321
+ mgr.clearSuperProperties()
322
+ resolve(nil)
323
+ }
324
+ }
@@ -0,0 +1,222 @@
1
+ //
2
+ // BillDogBridge.m
3
+ // @billdog.io/react-native
4
+ //
5
+ // React Native bridge for the core BillDog module (JS: NativeModules.BillDog).
6
+ //
7
+ // RCT_EXTERN_MODULE / RCT_EXTERN_METHOD declarations only — the Swift file
8
+ // (BillDogBridge.swift, `@objc(BillDog) class BillDogBridge`) carries the
9
+ // implementations, delegating to `BillDog.shared` from the native iOS SDK.
10
+ //
11
+ // ⚠️ VERIFICATION: there is no iOS/CocoaPods/Xcode toolchain in the authoring
12
+ // environment. This file is written to be internally consistent and
13
+ // compile-ready against the verified native signatures (cited inline in the
14
+ // Swift file as `BillDog.swift:<line>` etc.), but it REQUIRES a `pod install`
15
+ // + Xcode build in a host RN app to actually compile and run.
16
+ //
17
+ // Method names + argument shapes are the AUTHORITATIVE contract from
18
+ // `../src/BillDog.ts` (every `native.<method>(...)` call). Do NOT rename.
19
+ //
20
+
21
+ #import <React/RCTBridgeModule.h>
22
+
23
+ @interface RCT_EXTERN_MODULE(BillDog, NSObject)
24
+
25
+ // ── Configuration ─────────────────────────────────────────────────────────────
26
+
27
+ // native.configure(apiKey, options) → BillDog.shared.configure(config:)
28
+ RCT_EXTERN_METHOD(configure:(NSString *)apiKey
29
+ options:(NSDictionary *)options
30
+ resolver:(RCTPromiseResolveBlock)resolve
31
+ rejecter:(RCTPromiseRejectBlock)reject)
32
+
33
+ // ── Purchases ───────────────────────────────────────────────────────────────
34
+
35
+ // BillDog.ts:221 — native.purchase({ ...PurchaseParams, source })
36
+ RCT_EXTERN_METHOD(purchase:(NSDictionary *)params
37
+ resolver:(RCTPromiseResolveBlock)resolve
38
+ rejecter:(RCTPromiseRejectBlock)reject)
39
+
40
+ // BillDog.ts:266 — native.setPurchaseControllerActive(bool). Fire-and-forget.
41
+ RCT_EXTERN_METHOD(setPurchaseControllerActive:(BOOL)active)
42
+
43
+ // BillDog.ts:296 — native.restore()
44
+ RCT_EXTERN_METHOD(restore:(RCTPromiseResolveBlock)resolve
45
+ rejecter:(RCTPromiseRejectBlock)reject)
46
+
47
+ // ── CustomerInfo ─────────────────────────────────────────────────────────────
48
+
49
+ // BillDog.ts:320 — native.getCustomerInfo(policy) — policy is a wire-name string.
50
+ RCT_EXTERN_METHOD(getCustomerInfo:(NSString *)policy
51
+ resolver:(RCTPromiseResolveBlock)resolve
52
+ rejecter:(RCTPromiseRejectBlock)reject)
53
+
54
+ // BillDog.ts:792 — native.invalidateCustomerInfoCache()
55
+ RCT_EXTERN_METHOD(invalidateCustomerInfoCache:(RCTPromiseResolveBlock)resolve
56
+ rejecter:(RCTPromiseRejectBlock)reject)
57
+
58
+ // ── Store capability surface ─────────────────────────────────────────────────
59
+
60
+ // BillDog.ts:350 — native.canMakePayments()
61
+ RCT_EXTERN_METHOD(canMakePayments:(RCTPromiseResolveBlock)resolve
62
+ rejecter:(RCTPromiseRejectBlock)reject)
63
+
64
+ // BillDog.ts:359 — native.presentCodeRedemptionSheet()
65
+ RCT_EXTERN_METHOD(presentCodeRedemptionSheet:(RCTPromiseResolveBlock)resolve
66
+ rejecter:(RCTPromiseRejectBlock)reject)
67
+
68
+ // BillDog.ts:375 — native.checkTrialOrIntroDiscountEligibility([productId])
69
+ RCT_EXTERN_METHOD(checkTrialOrIntroDiscountEligibility:(NSArray *)productIds
70
+ resolver:(RCTPromiseResolveBlock)resolve
71
+ rejecter:(RCTPromiseRejectBlock)reject)
72
+
73
+ // BillDog.ts:388 — native.subscribeStorefront(). Fire-and-forget.
74
+ RCT_EXTERN_METHOD(subscribeStorefront)
75
+
76
+ // ── Self-hosted proxy ────────────────────────────────────────────────────────
77
+
78
+ // BillDog.ts:404 — native.setProxyURL(url|null). Fire-and-forget.
79
+ RCT_EXTERN_METHOD(setProxyURL:(NSString *)url)
80
+
81
+ // BillDog.ts:453 — native.getProxyURL() — read SYNCHRONOUSLY by the JS facade.
82
+ RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(getProxyURL)
83
+
84
+ // ── Consent ──────────────────────────────────────────────────────────────────
85
+
86
+ // BillDog.ts:419 — native.setConsentRequired(bool). Fire-and-forget.
87
+ RCT_EXTERN_METHOD(setConsentRequired:(BOOL)required)
88
+
89
+ // BillDog.ts:428 — native.setConsent(purpose, granted). Fire-and-forget.
90
+ RCT_EXTERN_METHOD(setConsent:(NSString *)purpose
91
+ granted:(BOOL)granted)
92
+
93
+ // BillDog.ts:437 — native.setConsentGiven(bool). Fire-and-forget.
94
+ RCT_EXTERN_METHOD(setConsentGiven:(BOOL)given)
95
+
96
+ // BillDog.ts:446 — native.consentHeaderValue() (awaited)
97
+ RCT_EXTERN_METHOD(consentHeaderValue:(RCTPromiseResolveBlock)resolve
98
+ rejecter:(RCTPromiseRejectBlock)reject)
99
+
100
+ // ── Attribution ──────────────────────────────────────────────────────────────
101
+
102
+ // BillDog.ts:484 — native.collectDeviceIdentifiers(). Fire-and-forget.
103
+ RCT_EXTERN_METHOD(collectDeviceIdentifiers)
104
+
105
+ // native.setAttribution({ key: id, … }) → matching native provider setter.
106
+ RCT_EXTERN_METHOD(setAttribution:(NSDictionary *)data
107
+ resolver:(RCTPromiseResolveBlock)resolve
108
+ rejecter:(RCTPromiseRejectBlock)reject)
109
+
110
+ // ── Identity ─────────────────────────────────────────────────────────────────
111
+
112
+ // BillDog.ts:513 — native.logIn(appUserId)
113
+ RCT_EXTERN_METHOD(logIn:(NSString *)appUserId
114
+ resolver:(RCTPromiseResolveBlock)resolve
115
+ rejecter:(RCTPromiseRejectBlock)reject)
116
+
117
+ // BillDog.ts:536 — native.logOut()
118
+ RCT_EXTERN_METHOD(logOut:(RCTPromiseResolveBlock)resolve
119
+ rejecter:(RCTPromiseRejectBlock)reject)
120
+
121
+ // BillDog.ts:589 — native.setSandboxMode(bool). Fire-and-forget.
122
+ RCT_EXTERN_METHOD(setSandboxMode:(BOOL)enabled)
123
+
124
+ // ── Placements ───────────────────────────────────────────────────────────────
125
+
126
+ // BillDog.ts:634 — native.registerPlacement({ placementId, params })
127
+ RCT_EXTERN_METHOD(registerPlacement:(NSDictionary *)args
128
+ resolver:(RCTPromiseResolveBlock)resolve
129
+ rejecter:(RCTPromiseRejectBlock)reject)
130
+
131
+ // BillDog.ts:679 — native.hasAccessForPlacement(placementId) — read SYNCHRONOUSLY.
132
+ RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(hasAccessForPlacement:(NSString *)placementId)
133
+
134
+ // BillDog.ts:878 — native.getPresentationResult(placementId)
135
+ RCT_EXTERN_METHOD(getPresentationResult:(NSString *)placementId
136
+ resolver:(RCTPromiseResolveBlock)resolve
137
+ rejecter:(RCTPromiseRejectBlock)reject)
138
+
139
+ // Experiments & feature flags: the paywall-facade shim was removed. Use the
140
+ // standalone BillDogABTest module (bridged separately) instead.
141
+
142
+ // ── In-app messages ──────────────────────────────────────────────────────────
143
+
144
+ // BillDog.ts:722 — native.showInAppMessages(placementId|null)
145
+ RCT_EXTERN_METHOD(showInAppMessages:(NSString *)placementId
146
+ resolver:(RCTPromiseResolveBlock)resolve
147
+ rejecter:(RCTPromiseRejectBlock)reject)
148
+
149
+ // ── Deep linking ─────────────────────────────────────────────────────────────
150
+
151
+ // BillDog.ts:731 — native.handleDeepLink(uri)
152
+ RCT_EXTERN_METHOD(handleDeepLink:(NSString *)uri
153
+ resolver:(RCTPromiseResolveBlock)resolve
154
+ rejecter:(RCTPromiseRejectBlock)reject)
155
+
156
+ // ── Component selection state ─────────────────────────────────────────────────
157
+
158
+ // BillDog.ts:740 — native.getSelectedProductIndex(componentId) — read SYNCHRONOUSLY.
159
+ RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(getSelectedProductIndex:(NSString *)componentId)
160
+
161
+ // BillDog.ts:747 — native.setSelectedProductIndex(componentId, index). Fire-and-forget.
162
+ RCT_EXTERN_METHOD(setSelectedProductIndex:(NSString *)componentId
163
+ index:(nonnull NSNumber *)index)
164
+
165
+ // ── Theming ──────────────────────────────────────────────────────────────────
166
+
167
+ // BillDog.ts:755 — native.updateTheme(overrides). Fire-and-forget.
168
+ RCT_EXTERN_METHOD(updateTheme:(NSDictionary *)overrides)
169
+
170
+ // BillDog.ts:762 — native.setInterfaceStyle('light'|'dark'|null). Fire-and-forget.
171
+ RCT_EXTERN_METHOD(setInterfaceStyle:(NSString *)style)
172
+
173
+ // ── Subscription management ──────────────────────────────────────────────────
174
+
175
+ // BillDog.ts:776 — native.showManageSubscriptions(subscriptionId|null)
176
+ RCT_EXTERN_METHOD(showManageSubscriptions:(NSString *)subscriptionId
177
+ resolver:(RCTPromiseResolveBlock)resolve
178
+ rejecter:(RCTPromiseRejectBlock)reject)
179
+
180
+ // ── Cache control ────────────────────────────────────────────────────────────
181
+
182
+ // BillDog.ts:785 — native.clearCache()
183
+ RCT_EXTERN_METHOD(clearCache:(RCTPromiseResolveBlock)resolve
184
+ rejecter:(RCTPromiseRejectBlock)reject)
185
+
186
+ // ── User attributes ──────────────────────────────────────────────────────────
187
+
188
+ // BillDog.ts:801 — native.setUserAttributes(attributes)
189
+ RCT_EXTERN_METHOD(setUserAttributes:(NSDictionary *)attributes
190
+ resolver:(RCTPromiseResolveBlock)resolve
191
+ rejecter:(RCTPromiseRejectBlock)reject)
192
+
193
+ // BillDog.ts:812 — native.getUserAttributes() (awaited)
194
+ RCT_EXTERN_METHOD(getUserAttributes:(RCTPromiseResolveBlock)resolve
195
+ rejecter:(RCTPromiseRejectBlock)reject)
196
+
197
+ // ── External-purchase observation ────────────────────────────────────────────
198
+
199
+ // BillDog.ts:822 — native.observePurchaseStart(productId). Fire-and-forget.
200
+ RCT_EXTERN_METHOD(observePurchaseStart:(NSString *)productId)
201
+
202
+ // BillDog.ts:829 — native.observePurchaseResult(productId, orderId|null). Fire-and-forget.
203
+ RCT_EXTERN_METHOD(observePurchaseResult:(NSString *)productId
204
+ orderId:(NSString *)orderId)
205
+
206
+ // BillDog.ts:835 — native.observePurchaseError(productId, error). Fire-and-forget.
207
+ RCT_EXTERN_METHOD(observePurchaseError:(NSString *)productId
208
+ error:(NSString *)error)
209
+
210
+ // ── Server-side actions ──────────────────────────────────────────────────────
211
+
212
+ // BillDog.ts:900 — native.executeAction(paywallId|null, componentId, actionType,
213
+ // idempotencyKey|null, metadata?)
214
+ RCT_EXTERN_METHOD(executeAction:(NSString *)paywallId
215
+ componentId:(NSString *)componentId
216
+ actionType:(NSString *)actionType
217
+ idempotencyKey:(NSString *)idempotencyKey
218
+ metadata:(NSDictionary *)metadata
219
+ resolver:(RCTPromiseResolveBlock)resolve
220
+ rejecter:(RCTPromiseRejectBlock)reject)
221
+
222
+ @end