clevertap-react-native 3.9.0 → 4.0.0

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 (321) hide show
  1. package/.claude/worktrees/ecstatic-goldberg/.claude/settings.local.json +12 -0
  2. package/.claude/worktrees/ecstatic-goldberg/.codebeatignore +1 -0
  3. package/.claude/worktrees/ecstatic-goldberg/.eslintrc.json +34 -0
  4. package/.claude/worktrees/ecstatic-goldberg/.vscode/settings.json +3 -0
  5. package/.claude/worktrees/ecstatic-goldberg/CHANGELOG.md +689 -0
  6. package/.claude/worktrees/ecstatic-goldberg/LICENSE +9 -0
  7. package/.claude/worktrees/ecstatic-goldberg/README.md +52 -0
  8. package/.claude/worktrees/ecstatic-goldberg/android/.gradle/8.5/checksums/checksums.lock +0 -0
  9. package/.claude/worktrees/ecstatic-goldberg/android/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock +0 -0
  10. package/.claude/worktrees/ecstatic-goldberg/android/.gradle/8.5/fileChanges/last-build.bin +0 -0
  11. package/.claude/worktrees/ecstatic-goldberg/android/.gradle/8.5/fileHashes/fileHashes.lock +0 -0
  12. package/.claude/worktrees/ecstatic-goldberg/android/.gradle/8.5/gc.properties +0 -0
  13. package/.claude/worktrees/ecstatic-goldberg/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  14. package/.claude/worktrees/ecstatic-goldberg/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  15. package/.claude/worktrees/ecstatic-goldberg/android/.gradle/vcs-1/gc.properties +0 -0
  16. package/.claude/worktrees/ecstatic-goldberg/android/build.gradle +63 -0
  17. package/.claude/worktrees/ecstatic-goldberg/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  18. package/.claude/worktrees/ecstatic-goldberg/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  19. package/.claude/worktrees/ecstatic-goldberg/android/gradle.properties +2 -0
  20. package/.claude/worktrees/ecstatic-goldberg/android/gradlew +160 -0
  21. package/.claude/worktrees/ecstatic-goldberg/android/gradlew.bat +90 -0
  22. package/{android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt → .claude/worktrees/ecstatic-goldberg/android/src/main}/AndroidManifest.xml +2 -7
  23. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/CleverTapApplication.kt +12 -0
  24. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/CleverTapCustomTemplates.kt +66 -0
  25. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/CleverTapEvent.kt +42 -0
  26. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/CleverTapEventEmitter.kt +128 -0
  27. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/CleverTapListenerProxy.kt +225 -0
  28. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/CleverTapModuleImpl.java +2112 -0
  29. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/CleverTapPackage.kt +36 -0
  30. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/CleverTapRnAPI.kt +35 -0
  31. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/CleverTapUtils.java +333 -0
  32. package/.claude/worktrees/ecstatic-goldberg/android/src/main/java/com/clevertap/react/Constants.kt +13 -0
  33. package/.claude/worktrees/ecstatic-goldberg/android/src/newarch/CleverTapModule.kt +622 -0
  34. package/.claude/worktrees/ecstatic-goldberg/android/src/oldarch/CleverTapModule.kt +716 -0
  35. package/.claude/worktrees/ecstatic-goldberg/clevertap-react-native.podspec +37 -0
  36. package/.claude/worktrees/ecstatic-goldberg/docs/CustomCodeTemplates.md +215 -0
  37. package/.claude/worktrees/ecstatic-goldberg/docs/Variables.md +191 -0
  38. package/.claude/worktrees/ecstatic-goldberg/docs/callbackPayloadFormat.md +26 -0
  39. package/.claude/worktrees/ecstatic-goldberg/docs/install.md +162 -0
  40. package/.claude/worktrees/ecstatic-goldberg/docs/integration.md +122 -0
  41. package/.claude/worktrees/ecstatic-goldberg/docs/iospushtemplates.md +582 -0
  42. package/.claude/worktrees/ecstatic-goldberg/docs/pushprimer.md +99 -0
  43. package/.claude/worktrees/ecstatic-goldberg/docs/usage.md +524 -0
  44. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReact.h +41 -0
  45. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReact.mm +1428 -0
  46. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactAppFunctionPresenter.h +20 -0
  47. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactAppFunctionPresenter.mm +21 -0
  48. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactCustomTemplates.h +42 -0
  49. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactCustomTemplates.mm +51 -0
  50. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactManager.h +14 -0
  51. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactManager.mm +168 -0
  52. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactPendingEvent.h +14 -0
  53. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactPendingEvent.mm +14 -0
  54. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactTemplatePresenter.h +22 -0
  55. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact/CleverTapReactTemplatePresenter.mm +21 -0
  56. package/.claude/worktrees/ecstatic-goldberg/ios/CleverTapReact.xcodeproj/project.pbxproj +371 -0
  57. package/.claude/worktrees/ecstatic-goldberg/package-lock.json +9891 -0
  58. package/.claude/worktrees/ecstatic-goldberg/package.json +57 -0
  59. package/.claude/worktrees/ecstatic-goldberg/src/NativeCleverTapModule.ts +252 -0
  60. package/.claude/worktrees/ecstatic-goldberg/src/index.d.ts +1031 -0
  61. package/.claude/worktrees/ecstatic-goldberg/src/index.js +1258 -0
  62. package/.claude/worktrees/ecstatic-goldberg/static/Finder.png +0 -0
  63. package/.claude/worktrees/ecstatic-goldberg/static/GenerateSpecs.png +0 -0
  64. package/.claude/worktrees/ecstatic-goldberg/static/NotificationContent.png +0 -0
  65. package/.claude/worktrees/ecstatic-goldberg/static/NotificationContentStoryboard.png +0 -0
  66. package/.claude/worktrees/ecstatic-goldberg/static/NotificationContentTarget.png +0 -0
  67. package/.claude/worktrees/ecstatic-goldberg/static/NotificationServiceTarget.png +0 -0
  68. package/.claude/worktrees/vigilant-davinci/.claude/settings.local.json +7 -0
  69. package/.claude/worktrees/vigilant-davinci/.codebeatignore +1 -0
  70. package/.claude/worktrees/vigilant-davinci/.eslintrc.json +34 -0
  71. package/.claude/worktrees/vigilant-davinci/.vscode/settings.json +3 -0
  72. package/.claude/worktrees/vigilant-davinci/CHANGELOG.md +702 -0
  73. package/.claude/worktrees/vigilant-davinci/LICENSE +9 -0
  74. package/.claude/worktrees/vigilant-davinci/README.md +52 -0
  75. package/.claude/worktrees/vigilant-davinci/android/.gradle/8.5/checksums/checksums.lock +0 -0
  76. package/.claude/worktrees/vigilant-davinci/android/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock +0 -0
  77. package/.claude/worktrees/vigilant-davinci/android/.gradle/8.5/dependencies-accessors/gc.properties +0 -0
  78. package/.claude/worktrees/vigilant-davinci/android/.gradle/8.5/fileChanges/last-build.bin +0 -0
  79. package/.claude/worktrees/vigilant-davinci/android/.gradle/8.5/fileHashes/fileHashes.lock +0 -0
  80. package/.claude/worktrees/vigilant-davinci/android/.gradle/8.5/gc.properties +0 -0
  81. package/.claude/worktrees/vigilant-davinci/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  82. package/.claude/worktrees/vigilant-davinci/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  83. package/.claude/worktrees/vigilant-davinci/android/.gradle/vcs-1/gc.properties +0 -0
  84. package/.claude/worktrees/vigilant-davinci/android/build.gradle +63 -0
  85. package/.claude/worktrees/vigilant-davinci/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  86. package/.claude/worktrees/vigilant-davinci/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  87. package/.claude/worktrees/vigilant-davinci/android/gradle.properties +2 -0
  88. package/.claude/worktrees/vigilant-davinci/android/gradlew +160 -0
  89. package/.claude/worktrees/vigilant-davinci/android/gradlew.bat +90 -0
  90. package/{android/build/intermediates/merged_manifest/debug → .claude/worktrees/vigilant-davinci/android/src/main}/AndroidManifest.xml +2 -7
  91. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/CleverTapApplication.kt +12 -0
  92. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/CleverTapCustomTemplates.kt +66 -0
  93. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/CleverTapEvent.kt +42 -0
  94. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/CleverTapEventEmitter.kt +128 -0
  95. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/CleverTapListenerProxy.kt +225 -0
  96. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/CleverTapModuleImpl.java +2139 -0
  97. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/CleverTapPackage.kt +36 -0
  98. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/CleverTapRnAPI.kt +35 -0
  99. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/CleverTapUtils.java +333 -0
  100. package/.claude/worktrees/vigilant-davinci/android/src/main/java/com/clevertap/react/Constants.kt +13 -0
  101. package/.claude/worktrees/vigilant-davinci/android/src/newarch/CleverTapModule.kt +622 -0
  102. package/.claude/worktrees/vigilant-davinci/android/src/oldarch/CleverTapModule.kt +716 -0
  103. package/.claude/worktrees/vigilant-davinci/clevertap-react-native.podspec +37 -0
  104. package/.claude/worktrees/vigilant-davinci/docs/CustomCodeTemplates.md +215 -0
  105. package/.claude/worktrees/vigilant-davinci/docs/Variables.md +191 -0
  106. package/.claude/worktrees/vigilant-davinci/docs/callbackPayloadFormat.md +26 -0
  107. package/.claude/worktrees/vigilant-davinci/docs/install.md +162 -0
  108. package/.claude/worktrees/vigilant-davinci/docs/integration.md +122 -0
  109. package/.claude/worktrees/vigilant-davinci/docs/iospushtemplates.md +582 -0
  110. package/.claude/worktrees/vigilant-davinci/docs/pushprimer.md +99 -0
  111. package/.claude/worktrees/vigilant-davinci/docs/usage.md +524 -0
  112. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReact.h +41 -0
  113. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReact.mm +1428 -0
  114. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactAppFunctionPresenter.h +20 -0
  115. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactAppFunctionPresenter.mm +21 -0
  116. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactCustomTemplates.h +42 -0
  117. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactCustomTemplates.mm +51 -0
  118. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactManager.h +14 -0
  119. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactManager.mm +168 -0
  120. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactPendingEvent.h +14 -0
  121. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactPendingEvent.mm +14 -0
  122. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactTemplatePresenter.h +22 -0
  123. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact/CleverTapReactTemplatePresenter.mm +21 -0
  124. package/.claude/worktrees/vigilant-davinci/ios/CleverTapReact.xcodeproj/project.pbxproj +371 -0
  125. package/.claude/worktrees/vigilant-davinci/package-lock.json +9891 -0
  126. package/.claude/worktrees/vigilant-davinci/package.json +57 -0
  127. package/.claude/worktrees/vigilant-davinci/src/NativeCleverTapModule.ts +252 -0
  128. package/.claude/worktrees/vigilant-davinci/src/index.d.ts +1031 -0
  129. package/.claude/worktrees/vigilant-davinci/src/index.js +1270 -0
  130. package/.claude/worktrees/vigilant-davinci/static/Finder.png +0 -0
  131. package/.claude/worktrees/vigilant-davinci/static/GenerateSpecs.png +0 -0
  132. package/.claude/worktrees/vigilant-davinci/static/NotificationContent.png +0 -0
  133. package/.claude/worktrees/vigilant-davinci/static/NotificationContentStoryboard.png +0 -0
  134. package/.claude/worktrees/vigilant-davinci/static/NotificationContentTarget.png +0 -0
  135. package/.claude/worktrees/vigilant-davinci/static/NotificationServiceTarget.png +0 -0
  136. package/CHANGELOG.md +13 -0
  137. package/android/.gradle/8.5/checksums/checksums.lock +0 -0
  138. package/android/{build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i → .gradle/8.5/checksums/sha1-checksums.bin} +0 -0
  139. package/android/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock +0 -0
  140. package/android/.gradle/8.5/fileHashes/fileHashes.lock +0 -0
  141. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  142. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  143. package/android/build.gradle +3 -3
  144. package/clevertap-react-native.podspec +1 -1
  145. package/docs/install.md +1 -1
  146. package/ios/CleverTapReact/CleverTapReactManager.mm +8 -0
  147. package/package.json +1 -1
  148. package/src/index.js +1 -1
  149. package/android/.settings/org.eclipse.buildship.core.prefs +0 -13
  150. package/android/build/generated/source/buildConfig/debug/com/clevertap/react/BuildConfig.java +0 -12
  151. package/android/build/generated/source/codegen/java/com/clevertap/react/NativeCleverTapModuleSpec.java +0 -582
  152. package/android/build/generated/source/codegen/jni/CMakeLists.txt +0 -49
  153. package/android/build/generated/source/codegen/jni/CTTurboModuleSpec-generated.cpp +0 -764
  154. package/android/build/generated/source/codegen/jni/CTTurboModuleSpec.h +0 -31
  155. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/CTTurboModuleSpecJSI-generated.cpp +0 -1035
  156. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/CTTurboModuleSpecJSI.h +0 -1161
  157. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/ComponentDescriptors.cpp +0 -22
  158. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/ComponentDescriptors.h +0 -24
  159. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/EventEmitters.cpp +0 -16
  160. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/EventEmitters.h +0 -17
  161. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/Props.cpp +0 -19
  162. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/Props.h +0 -18
  163. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/ShadowNodes.cpp +0 -17
  164. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/ShadowNodes.h +0 -23
  165. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/States.cpp +0 -16
  166. package/android/build/generated/source/codegen/jni/react/renderer/components/CTTurboModuleSpec/States.h +0 -21
  167. package/android/build/generated/source/codegen/schema.json +0 -3695
  168. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +0 -18
  169. package/android/build/intermediates/aar_main_jar/debug/classes.jar +0 -0
  170. package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +0 -6
  171. package/android/build/intermediates/annotation_processor_list/debug/annotationProcessors.json +0 -1
  172. package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
  173. package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
  174. package/android/build/intermediates/compile_symbol_list/debug/R.txt +0 -7705
  175. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -1
  176. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  177. package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
  178. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  179. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  180. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +0 -2
  181. package/android/build/intermediates/java_res/debug/out/META-INF/clevertap-react-native_debug.kotlin_module +0 -0
  182. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/BuildConfig.class +0 -0
  183. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$1.class +0 -0
  184. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$10.class +0 -0
  185. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$2.class +0 -0
  186. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$3.class +0 -0
  187. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$4.class +0 -0
  188. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$5.class +0 -0
  189. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$6.class +0 -0
  190. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$7.class +0 -0
  191. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$8.class +0 -0
  192. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$9.class +0 -0
  193. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$InBoxMessages.class +0 -0
  194. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl$TemplateContextAction.class +0 -0
  195. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapModuleImpl.class +0 -0
  196. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapUtils$1.class +0 -0
  197. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapUtils$MapUtil$ArrayUtil.class +0 -0
  198. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapUtils$MapUtil.class +0 -0
  199. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/CleverTapUtils.class +0 -0
  200. package/android/build/intermediates/javac/debug/classes/com/clevertap/react/NativeCleverTapModuleSpec.class +0 -0
  201. package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +0 -2
  202. package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +0 -14
  203. package/android/build/intermediates/merged_java_res/debug/feature-clevertap-react-native.jar +0 -0
  204. package/android/build/intermediates/navigation_json/debug/navigation.json +0 -1
  205. package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
  206. package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +0 -5786
  207. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  208. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  209. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  210. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  211. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  212. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  213. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  214. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  215. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  216. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  217. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  218. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  219. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  220. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  221. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  222. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  223. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  224. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  225. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  226. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  227. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  228. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  229. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  230. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  231. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  232. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  233. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  234. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
  235. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  236. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  237. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  238. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  239. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  240. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  241. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  242. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab +0 -0
  243. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream +0 -0
  244. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream.len +0 -0
  245. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.len +0 -0
  246. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values.at +0 -0
  247. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i +0 -0
  248. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i.len +0 -0
  249. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  250. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  251. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  252. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  253. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  254. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  255. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  256. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  257. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  258. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  259. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  260. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  261. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  262. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  263. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  264. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  265. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  266. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  267. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  268. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  269. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  270. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  271. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  272. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  273. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  274. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  275. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  276. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +0 -2
  277. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  278. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  279. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  280. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  281. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  282. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  283. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  284. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  285. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  286. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  287. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  288. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  289. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  290. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  291. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  292. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  293. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  294. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  295. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  296. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  297. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  298. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  299. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  300. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  301. package/android/build/outputs/aar/clevertap-react-native-debug.aar +0 -0
  302. package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  303. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  304. package/android/build/tmp/kotlin-classes/debug/META-INF/clevertap-react-native_debug.kotlin_module +0 -0
  305. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapApplication.class +0 -0
  306. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapCustomTemplates$templatePresenter$1.class +0 -0
  307. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapCustomTemplates.class +0 -0
  308. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapEvent$Companion.class +0 -0
  309. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapEvent.class +0 -0
  310. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapEventEmitter$Buffer$items$2.class +0 -0
  311. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapEventEmitter$Buffer.class +0 -0
  312. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapEventEmitter.class +0 -0
  313. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapListenerProxy.class +0 -0
  314. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapModule$Companion.class +0 -0
  315. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapModule.class +0 -0
  316. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapPackage.class +0 -0
  317. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/CleverTapRnAPI.class +0 -0
  318. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/Constants.class +0 -0
  319. package/android/build/tmp/kotlin-classes/debug/com/clevertap/react/ErrorMessages.class +0 -0
  320. package/android/local.properties +0 -8
  321. /package/{android/build/intermediates/annotations_typedef_file/debug/typedefs.txt → .claude/worktrees/ecstatic-goldberg/android/.gradle/8.5/dependencies-accessors/gc.properties} +0 -0
@@ -0,0 +1,1428 @@
1
+ #import "CleverTapReact.h"
2
+ #import "CleverTapReactManager.h"
3
+
4
+ #import <UserNotifications/UserNotifications.h>
5
+ #import <CoreLocation/CoreLocation.h>
6
+
7
+ #import <React/RCTLog.h>
8
+
9
+ #import "CleverTap.h"
10
+ #import "CleverTap+Inbox.h"
11
+ #import "CleverTapEventDetail.h"
12
+ #import "CleverTapUTMDetail.h"
13
+ #import "CleverTap+DisplayUnit.h"
14
+ #import "CleverTap+FeatureFlags.h"
15
+ #import "CleverTap+ProductConfig.h"
16
+ #import "CleverTap+InAppNotifications.h"
17
+ #import "CleverTapInstanceConfig.h"
18
+ #import "CTLocalInApp.h"
19
+ #import "Clevertap+PushPermission.h"
20
+ #import "CleverTap+CTVar.h"
21
+ #import "CTVar.h"
22
+ #import "CleverTapReactPendingEvent.h"
23
+ #import "CTTemplateContext.h"
24
+
25
+ #ifdef RCT_NEW_ARCH_ENABLED
26
+ #import <CTTurboModuleSpec/CTTurboModuleSpec.h>
27
+ #endif
28
+
29
+ static NSDateFormatter *dateFormatter;
30
+
31
+ @interface CleverTapReact()
32
+ @property CleverTap *cleverTapInstance;
33
+ @property(nonatomic, strong) NSMutableDictionary *allVariables;
34
+ @end
35
+
36
+ @implementation CleverTapReact
37
+
38
+ @synthesize cleverTapInstance = _cleverTapInstance;
39
+
40
+ RCT_EXPORT_MODULE();
41
+
42
+ + (BOOL)requiresMainQueueSetup {
43
+ return NO;
44
+ }
45
+
46
+ - (NSDictionary *)constantsToExport {
47
+ return @{
48
+ kCleverTapProfileDidInitialize : kCleverTapProfileDidInitialize,
49
+ kCleverTapProfileSync : kCleverTapProfileSync,
50
+ kCleverTapInAppNotificationDismissed: kCleverTapInAppNotificationDismissed,
51
+ kCleverTapInboxDidInitialize: kCleverTapInboxDidInitialize,
52
+ kCleverTapInboxMessagesDidUpdate: kCleverTapInboxMessagesDidUpdate,
53
+ kCleverTapInboxMessageButtonTapped: kCleverTapInboxMessageButtonTapped,
54
+ kCleverTapInboxMessageTapped: kCleverTapInboxMessageTapped,
55
+ kCleverTapInAppNotificationButtonTapped: kCleverTapInAppNotificationButtonTapped,
56
+ kCleverTapDisplayUnitsLoaded: kCleverTapDisplayUnitsLoaded,
57
+ kCleverTapFeatureFlagsDidUpdate: kCleverTapFeatureFlagsDidUpdate,
58
+ kCleverTapProductConfigDidFetch: kCleverTapProductConfigDidFetch,
59
+ kCleverTapProductConfigDidActivate: kCleverTapProductConfigDidActivate,
60
+ kCleverTapProductConfigDidInitialize: kCleverTapProductConfigDidInitialize,
61
+ kCleverTapPushNotificationClicked: kCleverTapPushNotificationClicked,
62
+ kCleverTapPushPermissionResponseReceived: kCleverTapPushPermissionResponseReceived,
63
+ kCleverTapInAppNotificationShowed: kCleverTapInAppNotificationShowed,
64
+ kCleverTapOnVariablesChanged: kCleverTapOnVariablesChanged,
65
+ kCleverTapOnOneTimeVariablesChanged: kCleverTapOnOneTimeVariablesChanged,
66
+ kCleverTapOnValueChanged: kCleverTapOnValueChanged,
67
+ kCleverTapOnVariablesChangedAndNoDownloadsPending: kCleverTapOnVariablesChangedAndNoDownloadsPending,
68
+ kCleverTapOnceVariablesChangedAndNoDownloadsPending: kCleverTapOnceVariablesChangedAndNoDownloadsPending,
69
+ kCleverTapOnFileValueChanged: kCleverTapOnFileValueChanged,
70
+ kCleverTapCustomTemplatePresent: kCleverTapCustomTemplatePresent,
71
+ kCleverTapCustomFunctionPresent: kCleverTapCustomFunctionPresent,
72
+ kCleverTapCustomTemplateClose: kCleverTapCustomTemplateClose,
73
+ kXPS: kXPS
74
+ };
75
+ }
76
+
77
+ - (NSDictionary *)getConstants {
78
+ return [self constantsToExport];
79
+ }
80
+
81
+ - (dispatch_queue_t)methodQueue {
82
+ return dispatch_get_main_queue();
83
+ }
84
+
85
+
86
+ # pragma mark - Launch
87
+
88
+ - (instancetype)init
89
+ {
90
+ self = [super init];
91
+ if (self) {
92
+ self.allVariables = [NSMutableDictionary dictionary];
93
+ }
94
+ return self;
95
+ }
96
+
97
+ - (CleverTap *)cleverTapInstance {
98
+ if (_cleverTapInstance != nil) {
99
+ return _cleverTapInstance;
100
+ }
101
+ return [CleverTap sharedInstance];
102
+ }
103
+
104
+ - (void)setCleverTapInstance:(CleverTap *)instance {
105
+ _cleverTapInstance = instance;
106
+ }
107
+
108
+ RCT_EXPORT_METHOD(setInstanceWithAccountId:(NSString*)accountId) {
109
+ RCTLogInfo(@"[CleverTap setInstanceWithAccountId]");
110
+
111
+ CleverTap *instance = [CleverTap getGlobalInstance:accountId];
112
+ if (instance == nil) {
113
+ RCTLogWarn(@"CleverTapInstance not found for accountId: %@", accountId);
114
+ return;
115
+ }
116
+
117
+ [self setCleverTapInstance:instance];
118
+ [[CleverTapReactManager sharedInstance] setDelegates:instance];
119
+ }
120
+
121
+ RCT_EXPORT_METHOD(getInitialUrl:(RCTResponseSenderBlock)callback) {
122
+ RCTLogInfo(@"[CleverTap getInitialUrl]");
123
+ NSString *launchDeepLink = [CleverTapReactManager sharedInstance].launchDeepLink;
124
+ if (launchDeepLink != nil) {
125
+ [self returnResult:launchDeepLink withCallback:callback andError:nil];
126
+ } else {
127
+ [self returnResult:nil withCallback:callback andError:@"CleverTap initialUrl is nil"];
128
+ }
129
+ }
130
+
131
+ RCT_EXPORT_METHOD(setLibrary:(NSString*)name andVersion:(double)version) {
132
+ int libVersion = (int)version;
133
+ RCTLogInfo(@"[CleverTap setLibrary:%@ andVersion:%d]", name, libVersion);
134
+ [[self cleverTapInstance] setLibrary:name];
135
+ [[self cleverTapInstance] setCustomSdkVersion:name version:libVersion];
136
+ }
137
+
138
+ RCT_EXPORT_METHOD(setLocale:(NSString*)locale) {
139
+ RCTLogInfo(@"[CleverTap setLocale:%@]", locale);
140
+ NSLocale *userLocale = [NSLocale localeWithLocaleIdentifier:locale];
141
+ [[self cleverTapInstance] setLocale:userLocale];
142
+ }
143
+
144
+ #pragma mark - Push Notifications
145
+
146
+ RCT_EXPORT_METHOD(registerForPush) {
147
+ RCTLogInfo(@"[CleverTap registerForPush]");
148
+ if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) {
149
+ UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
150
+ [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge)
151
+ completionHandler:^(BOOL granted, NSError * _Nullable error) {
152
+ if (granted) {
153
+ dispatch_async(dispatch_get_main_queue(), ^(void) {
154
+ [[UIApplication sharedApplication] registerForRemoteNotifications];
155
+ });
156
+ }
157
+ }];
158
+
159
+ }
160
+ else {
161
+ UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound) categories:nil];
162
+ [[UIApplication sharedApplication] registerForRemoteNotifications];
163
+ [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
164
+ }
165
+ }
166
+
167
+ RCT_EXPORT_METHOD(setFCMPushTokenAsString:(NSString*)token) {
168
+ RCTLogInfo(@"[CleverTap setPushTokenAsString: %@]", token);
169
+ [[self cleverTapInstance] setPushTokenAsString:token];
170
+ }
171
+
172
+ RCT_EXPORT_METHOD(pushRegistrationToken:(NSString*)token withPushType:(NSDictionary*)pushType) {
173
+ NSString *type = pushType[@"type"];
174
+ if ([type isEqualToString:@"fcm"]) {
175
+ [self setFCMPushTokenAsString:token];
176
+ } else {
177
+ RCTLogInfo(@"[CleverTap pushRegistrationToken for types other than FCM is no-op in iOS]");
178
+ }
179
+ }
180
+
181
+ // setPushTokenAsStringWithRegion is a no-op in iOS
182
+ RCT_EXPORT_METHOD(setPushTokenAsStringWithRegion:(NSString*)token withType:(NSString *)type withRegion:(NSString *)region){
183
+ RCTLogInfo(@"[CleverTap setPushTokenAsStringWithRegion is no-op in iOS]");
184
+ }
185
+
186
+ #pragma mark - Personalization
187
+
188
+ RCT_EXPORT_METHOD(enablePersonalization) {
189
+ RCTLogInfo(@"[CleverTap enablePersonalization]");
190
+ [CleverTap enablePersonalization];
191
+ }
192
+
193
+ RCT_EXPORT_METHOD(disablePersonalization) {
194
+ RCTLogInfo(@"[CleverTap disablePersonalization]");
195
+ [CleverTap disablePersonalization];
196
+ }
197
+
198
+
199
+ #pragma mark - Offline API
200
+
201
+ RCT_EXPORT_METHOD(setOffline:(BOOL)enabled) {
202
+ RCTLogInfo(@"[CleverTap setOffline: %i]", enabled);
203
+ [[self cleverTapInstance] setOffline:enabled];
204
+ }
205
+
206
+
207
+ #pragma mark - OptOut API
208
+
209
+ RCT_EXPORT_METHOD(setOptOut:(BOOL)userOptOut allowSystemEvents:(BOOL)allowSystemEvents) {
210
+ RCTLogInfo(@"[CleverTap setOptOut and allowSystemEvents: %d, %d]", userOptOut, allowSystemEvents);
211
+ if (allowSystemEvents) {
212
+ [[self cleverTapInstance] setOptOut:userOptOut allowSystemEvents:allowSystemEvents];
213
+ } else {
214
+ [[self cleverTapInstance] setOptOut:userOptOut];
215
+ }
216
+ }
217
+
218
+ RCT_EXPORT_METHOD(enableDeviceNetworkInfoReporting:(BOOL)enabled) {
219
+ RCTLogInfo(@"[CleverTap enableDeviceNetworkInfoReporting: %i]", enabled);
220
+ [[self cleverTapInstance] enableDeviceNetworkInfoReporting:enabled];
221
+ }
222
+
223
+
224
+ #pragma mark - Event API
225
+
226
+ RCT_EXPORT_METHOD(recordScreenView:(NSString*)screenName) {
227
+ RCTLogInfo(@"[CleverTap recordScreenView]");
228
+ [[self cleverTapInstance] recordScreenView:screenName];
229
+ }
230
+
231
+ RCT_EXPORT_METHOD(recordEvent:(NSString*)eventName withProps:(NSDictionary*)props) {
232
+ RCTLogInfo(@"[CleverTap recordEvent:withProps]");
233
+ [[self cleverTapInstance] recordEvent:eventName withProps:props];
234
+ }
235
+
236
+ RCT_EXPORT_METHOD(recordChargedEvent:(NSDictionary*)details andItems:(NSArray*)items) {
237
+ RCTLogInfo(@"[CleverTap recordChargedEventWithDetails:andItems:]");
238
+ [[self cleverTapInstance] recordChargedEventWithDetails:details andItems:items];
239
+ }
240
+
241
+ RCT_EXPORT_METHOD(eventGetFirstTime:(NSString*)eventName callback:(RCTResponseSenderBlock)callback) {
242
+ RCTLogInfo(@"[CleverTap eventGetFirstTime: %@]", eventName);
243
+ NSTimeInterval result = [[self cleverTapInstance] eventGetFirstTime:eventName];
244
+ [self returnResult:@(result) withCallback:callback andError:nil];
245
+ }
246
+
247
+ RCT_EXPORT_METHOD(eventGetLastTime:(NSString*)eventName callback:(RCTResponseSenderBlock)callback) {
248
+ RCTLogInfo(@"[CleverTap eventGetLastTime: %@]", eventName);
249
+ NSTimeInterval result = [[self cleverTapInstance] eventGetLastTime:eventName];
250
+ [self returnResult:@(result) withCallback:callback andError:nil];
251
+ }
252
+
253
+ RCT_EXPORT_METHOD(eventGetOccurrences:(NSString*)eventName callback:(RCTResponseSenderBlock)callback) {
254
+ RCTLogInfo(@"[CleverTap eventGetOccurrences: %@]", eventName);
255
+ int result = [[self cleverTapInstance] eventGetOccurrences:eventName];
256
+ [self returnResult:@(result) withCallback:callback andError:nil];
257
+ }
258
+
259
+ RCT_EXPORT_METHOD(eventGetDetail:(NSString*)eventName callback:(RCTResponseSenderBlock)callback) {
260
+ RCTLogInfo(@"[CleverTap eventGetDetail: %@]", eventName);
261
+ CleverTapEventDetail *detail = [[self cleverTapInstance] eventGetDetail:eventName];
262
+ NSDictionary *result = [self _eventDetailToDict:detail];
263
+ [self returnResult:result withCallback:callback andError:nil];
264
+ }
265
+
266
+ RCT_EXPORT_METHOD(getEventHistory:(RCTResponseSenderBlock)callback) {
267
+ RCTLogInfo(@"[CleverTap getEventHistory]");
268
+ NSDictionary *history = [[self cleverTapInstance] userGetEventHistory];
269
+ NSMutableDictionary *result = [NSMutableDictionary new];
270
+
271
+ for (NSString *eventName in [history keyEnumerator]) {
272
+ CleverTapEventDetail *detail = history[eventName];
273
+ NSDictionary * _inner = [self _eventDetailToDict:detail];
274
+ result[eventName] = _inner;
275
+ }
276
+ [self returnResult:result withCallback:callback andError:nil];
277
+ }
278
+
279
+ RCT_EXPORT_METHOD(getUserEventLog:(NSString*)eventName callback:(RCTResponseSenderBlock)callback) {
280
+ RCTLogInfo(@"[CleverTap getUserEventLog: %@]", eventName);
281
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
282
+ CleverTapEventDetail *detail = [[self cleverTapInstance] getUserEventLog:eventName];
283
+ NSDictionary *result = [self _eventDetailToDict:detail];
284
+ dispatch_async(dispatch_get_main_queue(), ^{
285
+ [self returnResult:result withCallback:callback andError:nil];
286
+ });
287
+ });
288
+ }
289
+
290
+ RCT_EXPORT_METHOD(getUserEventLogCount:(NSString*)eventName callback:(RCTResponseSenderBlock)callback) {
291
+ RCTLogInfo(@"[CleverTap getUserEventLogCount: %@]", eventName);
292
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
293
+ int result = [[self cleverTapInstance] getUserEventLogCount:eventName];
294
+ dispatch_async(dispatch_get_main_queue(), ^{
295
+ [self returnResult:@(result) withCallback:callback andError:nil];
296
+ });
297
+ });
298
+ }
299
+
300
+ RCT_EXPORT_METHOD(getUserEventLogHistory:(RCTResponseSenderBlock)callback) {
301
+ RCTLogInfo(@"[CleverTap getUserEventLogHistory]");
302
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
303
+ NSDictionary *history = [[self cleverTapInstance] getUserEventLogHistory];
304
+ NSMutableDictionary *result = [NSMutableDictionary new];
305
+
306
+ for (NSString *eventName in [history keyEnumerator]) {
307
+ CleverTapEventDetail *detail = history[eventName];
308
+ NSDictionary * _inner = [self _eventDetailToDict:detail];
309
+ result[eventName] = _inner;
310
+ }
311
+ dispatch_async(dispatch_get_main_queue(), ^{
312
+ [self returnResult:result withCallback:callback andError:nil];
313
+ });
314
+ });
315
+ }
316
+
317
+ #pragma mark - Profile API
318
+
319
+ RCT_EXPORT_METHOD(setLocation:(double)latitude longitude:(double)longitude) {
320
+ RCTLogInfo(@"[CleverTap setLocation: %f %f]", latitude, longitude);
321
+ CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
322
+ [CleverTap setLocation:coordinate];
323
+ }
324
+
325
+ RCT_EXPORT_METHOD(profileGetCleverTapAttributionIdentifier:(RCTResponseSenderBlock)callback) {
326
+ RCTLogInfo(@"[CleverTap profileGetCleverTapAttributionIdentifier]");
327
+ NSString *result = [[self cleverTapInstance] profileGetCleverTapAttributionIdentifier];
328
+ [self returnResult:result withCallback:callback andError:nil];
329
+ }
330
+
331
+ RCT_EXPORT_METHOD(profileGetCleverTapID:(RCTResponseSenderBlock)callback) {
332
+ RCTLogInfo(@"[CleverTap profileGetCleverTapID]");
333
+ NSString *result = [[self cleverTapInstance] profileGetCleverTapID];
334
+ [self returnResult:result withCallback:callback andError:nil];
335
+ }
336
+
337
+ RCT_EXPORT_METHOD(getCleverTapID:(RCTResponseSenderBlock)callback) {
338
+ RCTLogInfo(@"[CleverTap getCleverTapID]");
339
+ NSString *result = [[self cleverTapInstance] profileGetCleverTapID];
340
+ [self returnResult:result withCallback:callback andError:nil];
341
+ }
342
+
343
+ RCT_EXPORT_METHOD(onUserLogin:(NSDictionary*)profile) {
344
+ RCTLogInfo(@"[CleverTap onUserLogin: %@]", profile);
345
+ NSDictionary *_profile = [self formatProfile:profile];
346
+ [[self cleverTapInstance] onUserLogin:_profile];
347
+ }
348
+
349
+ RCT_EXPORT_METHOD(profileSet:(NSDictionary*)profile) {
350
+ RCTLogInfo(@"[CleverTap profileSet: %@]", profile);
351
+ NSDictionary *_profile = [self formatProfile:profile];
352
+ [[self cleverTapInstance] profilePush:_profile];
353
+ }
354
+
355
+ RCT_EXPORT_METHOD(profileGetProperty:(NSString*)propertyName callback:(RCTResponseSenderBlock)callback) {
356
+ RCTLogInfo(@"[CleverTap profileGetProperty: %@]", propertyName);
357
+ id result = [[self cleverTapInstance] profileGet:propertyName];
358
+ [self returnResult:result withCallback:callback andError:nil];
359
+ }
360
+
361
+ RCT_EXPORT_METHOD(profileRemoveValueForKey:(NSString*)key) {
362
+ RCTLogInfo(@"[CleverTap profileRemoveValueForKey: %@]", key);
363
+ [[self cleverTapInstance] profileRemoveValueForKey:key];
364
+ }
365
+
366
+ RCT_EXPORT_METHOD(profileSetMultiValues:(NSArray<NSString*>*)values forKey:(NSString*)key) {
367
+ RCTLogInfo(@"[CleverTap profileSetMultiValues: %@ forKey: %@]", values, key);
368
+ [[self cleverTapInstance] profileSetMultiValues:values forKey:key];
369
+ }
370
+
371
+ RCT_EXPORT_METHOD(profileAddMultiValue:(NSString*)value forKey:(NSString*)key) {
372
+ RCTLogInfo(@"[CleverTap profileAddMultiValue: %@ forKey: %@]", value, key);
373
+ [[self cleverTapInstance] profileAddMultiValue:value forKey:key];
374
+ }
375
+
376
+ RCT_EXPORT_METHOD(profileAddMultiValues:(NSArray<NSString*>*)values forKey:(NSString*)key) {
377
+ RCTLogInfo(@"[CleverTap profileAddMultiValues: %@ forKey: %@]", values, key);
378
+ [[self cleverTapInstance] profileAddMultiValues:values forKey:key];
379
+ }
380
+
381
+ RCT_EXPORT_METHOD(profileRemoveMultiValue:(NSString*)value forKey:(NSString*)key) {
382
+ RCTLogInfo(@"[CleverTap profileRemoveMultiValue: %@ forKey: %@]", value, key);
383
+ [[self cleverTapInstance] profileRemoveMultiValue:value forKey:key];
384
+ }
385
+
386
+ RCT_EXPORT_METHOD(profileRemoveMultiValues:(NSArray<NSString*>*)values forKey:(NSString*)key) {
387
+ RCTLogInfo(@"[CleverTap profileRemoveMultiValues: %@ forKey: %@]", values, key);
388
+ [[self cleverTapInstance] profileRemoveMultiValues:values forKey:key];
389
+ }
390
+
391
+ RCT_EXPORT_METHOD(profileIncrementValueForKey:(NSNumber* _Nonnull)value forKey:(NSString* _Nonnull)key) {
392
+ RCTLogInfo(@"[CleverTap profileIncrementValueBy: %@ forKey: %@]", value, key);
393
+ [[self cleverTapInstance] profileIncrementValueBy:value forKey:key];
394
+ }
395
+
396
+ RCT_EXPORT_METHOD(profileDecrementValueForKey:(NSNumber* _Nonnull)value forKey:(NSString* _Nonnull)key) {
397
+ RCTLogInfo(@"[CleverTap profileDecrementValueBy: %@ forKey: %@]", value, key);
398
+ [[self cleverTapInstance] profileDecrementValueBy:value forKey:key];
399
+ }
400
+
401
+ #pragma mark - Session API
402
+
403
+ RCT_EXPORT_METHOD(pushInstallReferrer:(NSString*)source medium:(NSString*)medium campaign:(NSString*)campaign) {
404
+ RCTLogInfo(@"[CleverTap pushInstallReferrer source: %@ medium: %@ campaign: %@]", source, medium, campaign);
405
+ [[self cleverTapInstance] pushInstallReferrerSource:source medium:medium campaign:campaign];
406
+ }
407
+
408
+ RCT_EXPORT_METHOD(sessionGetTimeElapsed:(RCTResponseSenderBlock)callback) {
409
+ RCTLogInfo(@"[CleverTap sessionGetTimeElapsed]");
410
+ NSTimeInterval result = [[self cleverTapInstance] sessionGetTimeElapsed];
411
+ [self returnResult:@(result) withCallback:callback andError:nil];
412
+ }
413
+
414
+ RCT_EXPORT_METHOD(sessionGetTotalVisits:(RCTResponseSenderBlock)callback) {
415
+ RCTLogInfo(@"[CleverTap sessionGetTotalVisits]");
416
+ int result = [[self cleverTapInstance] userGetTotalVisits];
417
+ [self returnResult:@(result) withCallback:callback andError:nil];
418
+ }
419
+
420
+ RCT_EXPORT_METHOD(sessionGetScreenCount:(RCTResponseSenderBlock)callback) {
421
+ RCTLogInfo(@"[CleverTap sessionGetScreenCount]");
422
+ int result = [[self cleverTapInstance] userGetScreenCount];
423
+ [self returnResult:@(result) withCallback:callback andError:nil];
424
+ }
425
+
426
+ RCT_EXPORT_METHOD(sessionGetPreviousVisitTime:(RCTResponseSenderBlock)callback) {
427
+ RCTLogInfo(@"[CleverTap sessionGetPreviousVisitTime]");
428
+ NSTimeInterval result = [[self cleverTapInstance] userGetPreviousVisitTime];
429
+ [self returnResult:@(result) withCallback:callback andError:nil];
430
+ }
431
+
432
+ RCT_EXPORT_METHOD(sessionGetUTMDetails:(RCTResponseSenderBlock)callback) {
433
+ RCTLogInfo(@"[CleverTap sessionGetUTMDetails]");
434
+ CleverTapUTMDetail *detail = [[self cleverTapInstance] sessionGetUTMDetails];
435
+ NSDictionary *result = [self _utmDetailToDict:detail];
436
+ [self returnResult:result withCallback:callback andError:nil];
437
+ }
438
+
439
+ RCT_EXPORT_METHOD(getUserLastVisitTs:(RCTResponseSenderBlock)callback) {
440
+ RCTLogInfo(@"[CleverTap getUserLastVisitTs]");
441
+ NSTimeInterval result = [[self cleverTapInstance] getUserLastVisitTs];
442
+ [self returnResult:@(result) withCallback:callback andError:nil];
443
+ }
444
+
445
+ RCT_EXPORT_METHOD(getUserAppLaunchCount:(RCTResponseSenderBlock)callback) {
446
+ RCTLogInfo(@"[CleverTap getUserAppLaunchCount]");
447
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
448
+ int result = [[self cleverTapInstance] getUserAppLaunchCount];
449
+ dispatch_async(dispatch_get_main_queue(), ^{
450
+ [self returnResult:@(result) withCallback:callback andError:nil];
451
+ });
452
+ });
453
+ }
454
+
455
+ #pragma mark - no-op Android O methods
456
+
457
+ RCT_EXPORT_METHOD(createNotificationChannel:(NSString*)channelId withChannelName:(NSString*)channelName withChannelDescription:(NSString*)channelDescription withImportance:(NSInteger)importance withShowBadge:(BOOL)showBadge){
458
+ RCTLogInfo(@"[CleverTap createNotificationChannel is no-op in iOS]");
459
+ }
460
+
461
+ RCT_EXPORT_METHOD(createNotificationChannelWithSound:(NSString*)channelId withChannelName:(NSString*)channelName withChannelDescription:(NSString*)channelDescription withImportance:(NSInteger)importance withShowBadge:(BOOL)showBadge withSound:(NSString*)sound){
462
+ RCTLogInfo(@"[CleverTap createNotificationChannelWithSound is no-op in iOS]");
463
+ }
464
+
465
+ RCT_EXPORT_METHOD(createNotificationChannelWithGroupId:(NSString*)channelId withChannelName:(NSString*)channelName withChannelDescription:(NSString*)channelDescription withImportance:(NSInteger)importance withGroupId:(NSString*)groupId withShowBadge:(BOOL)showBadge){
466
+ RCTLogInfo(@"[CleverTap createNotificationChannelWithGroupId is no-op in iOS]");
467
+ }
468
+
469
+ RCT_EXPORT_METHOD(createNotificationChannelWithGroupIdAndSound:(NSString*)channelId withChannelName:(NSString*)channelName withChannelDescription:(NSString*)channelDescription withImportance:(NSInteger)importance withGroupId:(NSString*)groupId withShowBadge:(BOOL)showBadge withSound:(NSString*)sound){
470
+ RCTLogInfo(@"[CleverTap createNotificationChannelWithGroupIdAndSound is no-op in iOS]");
471
+ }
472
+
473
+ RCT_EXPORT_METHOD(createNotificationChannelGroup:(NSString*)groupId withGroupName:(NSString*)groupName){
474
+ RCTLogInfo(@"[CleverTap createNotificationChannelGroup is no-op in iOS]");
475
+ }
476
+
477
+ RCT_EXPORT_METHOD(deleteNotificationChannel:(NSString*)channelId){
478
+ RCTLogInfo(@"[CleverTap deleteNotificationChannel is no-op in iOS]");
479
+ }
480
+
481
+ RCT_EXPORT_METHOD(deleteNotificationChannelGroup:(NSString*)groupId){
482
+ RCTLogInfo(@"[CleverTap deleteNotificationChannelGroup is no-op in iOS]");
483
+ }
484
+
485
+ RCT_EXPORT_METHOD(createNotification:(NSDictionary*)extras) {
486
+ RCTLogInfo(@"[CleverTap createNotification is no-op in iOS]");
487
+ }
488
+
489
+
490
+ #pragma mark - Developer Options
491
+
492
+ RCT_EXPORT_METHOD(setDebugLevel:(double)level) {
493
+ int debugLevel = (int)level;
494
+ RCTLogInfo(@"[CleverTap setDebugLevel: %i]", debugLevel);
495
+ [CleverTap setDebugLevel:debugLevel];
496
+ }
497
+
498
+ #pragma mark - Private/Helpers
499
+
500
+ - (void)returnResult:(id)result withCallback:(RCTResponseSenderBlock)callback andError:(NSString *)error {
501
+ if (callback == nil) {
502
+ RCTLogInfo(@"CleverTap callback was nil");
503
+ return;
504
+ }
505
+ id e = error != nil ? error : [NSNull null];
506
+ id r = result != nil ? result : [NSNull null];
507
+ callback(@[e,r]);
508
+ }
509
+
510
+ - (NSDictionary *)_eventDetailToDict:(CleverTapEventDetail*)detail {
511
+ NSMutableDictionary *_dict = [NSMutableDictionary new];
512
+
513
+ if(detail) {
514
+ if(detail.eventName) {
515
+ [_dict setObject:detail.eventName forKey:@"eventName"];
516
+ }
517
+
518
+ if(detail.normalizedEventName){
519
+ [_dict setObject:detail.normalizedEventName forKey:@"normalizedEventName"];
520
+ }
521
+
522
+ if(detail.firstTime){
523
+ [_dict setObject:@(detail.firstTime) forKey:@"firstTime"];
524
+ }
525
+
526
+ if(detail.lastTime){
527
+ [_dict setObject:@(detail.lastTime) forKey:@"lastTime"];
528
+ }
529
+
530
+ if(detail.count){
531
+ [_dict setObject:@(detail.count) forKey:@"count"];
532
+ }
533
+
534
+ if(detail.deviceID){
535
+ [_dict setObject:detail.deviceID forKey:@"deviceID"];
536
+ }
537
+ }
538
+
539
+ return _dict;
540
+ }
541
+
542
+ - (NSDictionary *)_utmDetailToDict:(CleverTapUTMDetail*)detail {
543
+ NSMutableDictionary *_dict = [NSMutableDictionary new];
544
+
545
+ if(detail) {
546
+ if(detail.source) {
547
+ [_dict setObject:detail.source forKey:@"source"];
548
+ }
549
+
550
+ if(detail.medium) {
551
+ [_dict setObject:detail.medium forKey:@"medium"];
552
+ }
553
+
554
+ if(detail.campaign) {
555
+ [_dict setObject:detail.campaign forKey:@"campaign"];
556
+ }
557
+ }
558
+
559
+ return _dict;
560
+ }
561
+
562
+ - (NSDictionary *)formatProfile:(NSDictionary *)profile {
563
+ NSMutableDictionary *_profile = [NSMutableDictionary new];
564
+
565
+ for (NSString *key in [profile keyEnumerator]) {
566
+ id value = [profile objectForKey:key];
567
+
568
+ if([key isEqualToString:@"DOB"]) {
569
+
570
+ NSDate *dob = nil;
571
+
572
+ if([value isKindOfClass:[NSString class]] && ![value hasPrefix:@"$D_"]) {
573
+ if(!dateFormatter) {
574
+ dateFormatter = [[NSDateFormatter alloc] init];
575
+ [dateFormatter setDateFormat:@"yyyy-MM-dd"];
576
+ }
577
+
578
+ dob = [dateFormatter dateFromString:value];
579
+
580
+ }
581
+ else if ([value isKindOfClass:[NSNumber class]]) {
582
+ dob = [NSDate dateWithTimeIntervalSince1970:[value doubleValue]];
583
+ }
584
+
585
+ if(dob) {
586
+ value = dob;
587
+ }
588
+ }
589
+
590
+ [_profile setObject:value forKey:key];
591
+ }
592
+
593
+ return _profile;
594
+ }
595
+
596
+ - (CTVar *)createVarForName:(NSString *)name andValue:(id)value {
597
+
598
+ if ([value isKindOfClass:[NSString class]]) {
599
+ return [[self cleverTapInstance]defineVar:name withString:value];
600
+ }
601
+ if ([value isKindOfClass:[NSDictionary class]]) {
602
+ return [[self cleverTapInstance]defineVar:name withDictionary:value];
603
+ }
604
+ if ([value isKindOfClass:[NSNumber class]]) {
605
+ if ([self isBoolNumber:value]) {
606
+ return [[self cleverTapInstance]defineVar:name withBool:value];
607
+ }
608
+ return [[self cleverTapInstance]defineVar:name withNumber:value];
609
+ }
610
+ return nil;
611
+ }
612
+
613
+ - (BOOL)isBoolNumber:(NSNumber *)number {
614
+ CFTypeID boolID = CFBooleanGetTypeID();
615
+ CFTypeID numID = CFGetTypeID(CFBridgingRetain(number));
616
+ return (numID == boolID);
617
+ }
618
+
619
+ - (NSMutableDictionary *)getVariableValues {
620
+ NSMutableDictionary *varValues = [NSMutableDictionary dictionary];
621
+ [self.allVariables enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, CTVar* _Nonnull var, BOOL * _Nonnull stop) {
622
+ varValues[key] = var.value;
623
+ }];
624
+ return varValues;
625
+ }
626
+
627
+ #pragma mark - App Inbox
628
+
629
+ RCT_EXPORT_METHOD(getInboxMessageCount:(RCTResponseSenderBlock)callback) {
630
+ RCTLogInfo(@"[CleverTap inboxMessageCount]");
631
+ int result = (int)[[self cleverTapInstance] getInboxMessageCount];
632
+ [self returnResult:@(result) withCallback:callback andError:nil];
633
+ }
634
+
635
+ RCT_EXPORT_METHOD(getInboxMessageUnreadCount:(RCTResponseSenderBlock)callback) {
636
+ RCTLogInfo(@"[CleverTap inboxMessageUnreadCount]");
637
+ int result = (int)[[self cleverTapInstance] getInboxMessageUnreadCount];
638
+ [self returnResult:@(result) withCallback:callback andError:nil];
639
+ }
640
+
641
+ RCT_EXPORT_METHOD(getAllInboxMessages:(RCTResponseSenderBlock)callback) {
642
+ RCTLogInfo(@"[CleverTap getAllInboxMessages]");
643
+ NSArray<CleverTapInboxMessage *> *messageList = [[self cleverTapInstance] getAllInboxMessages];
644
+ NSMutableArray *allMessages = [NSMutableArray new];
645
+ for (CleverTapInboxMessage *message in messageList) {
646
+ [allMessages addObject:message.json];
647
+ }
648
+ NSArray *result = [allMessages mutableCopy];
649
+ [self returnResult:result withCallback:callback andError:nil];
650
+ }
651
+
652
+ RCT_EXPORT_METHOD(getUnreadInboxMessages:(RCTResponseSenderBlock)callback) {
653
+ RCTLogInfo(@"[CleverTap getUnreadInboxMessages]");
654
+ NSArray<CleverTapInboxMessage *> *messageList = [[self cleverTapInstance] getUnreadInboxMessages];
655
+ NSMutableArray *unreadMessages = [NSMutableArray new];
656
+ for (CleverTapInboxMessage *message in messageList) {
657
+ [unreadMessages addObject:message.json];
658
+ }
659
+ NSArray *result = [unreadMessages mutableCopy];
660
+ [self returnResult:result withCallback:callback andError:nil];
661
+ }
662
+
663
+ RCT_EXPORT_METHOD(getInboxMessageForId:(NSString*)messageId callback:(RCTResponseSenderBlock)callback) {
664
+ RCTLogInfo(@"[CleverTap getInboxMessageForId]");
665
+ CleverTapInboxMessage * message = [[self cleverTapInstance] getInboxMessageForId:messageId];
666
+ NSDictionary *result = message.json;
667
+ [self returnResult:result withCallback:callback andError:nil];
668
+ }
669
+
670
+ RCT_EXPORT_METHOD(pushInboxNotificationViewedEventForId:(NSString*)messageId) {
671
+ RCTLogInfo(@"[CleverTap pushInboxNotificationViewedEventForId]");
672
+ [[self cleverTapInstance] recordInboxNotificationViewedEventForID:messageId];
673
+ }
674
+
675
+ RCT_EXPORT_METHOD(pushInboxNotificationClickedEventForId:(NSString*)messageId) {
676
+ RCTLogInfo(@"[CleverTap pushInboxNotificationClickedEventForId]");
677
+ [[self cleverTapInstance] recordInboxNotificationClickedEventForID:messageId];
678
+ }
679
+
680
+ RCT_EXPORT_METHOD(markReadInboxMessageForId:(NSString*)messageId) {
681
+ RCTLogInfo(@"[CleverTap markReadInboxMessageForId]");
682
+ [[self cleverTapInstance] markReadInboxMessageForID:messageId];
683
+ }
684
+
685
+ RCT_EXPORT_METHOD(deleteInboxMessageForId:(NSString*)messageId) {
686
+ RCTLogInfo(@"[CleverTap deleteInboxMessageForId]");
687
+ [[self cleverTapInstance] deleteInboxMessageForID:messageId];
688
+ }
689
+
690
+ RCT_EXPORT_METHOD(markReadInboxMessagesForIDs:(NSArray*)messageIds) {
691
+ if (!messageIds) return;
692
+ RCTLogInfo(@"[CleverTap markReadInboxMessagesForIDs]");
693
+ [[self cleverTapInstance] markReadInboxMessagesForIDs:messageIds];
694
+ }
695
+
696
+ RCT_EXPORT_METHOD(deleteInboxMessagesForIDs:(NSArray*)messageIds) {
697
+ if (!messageIds) return;
698
+ RCTLogInfo(@"[CleverTap deleteInboxMessagesForIDs]");
699
+ [[self cleverTapInstance] deleteInboxMessagesForIDs:messageIds];
700
+ }
701
+
702
+ RCT_EXPORT_METHOD(dismissInbox) {
703
+ RCTLogInfo(@"[CleverTap dismissAppInbox]");
704
+ [[self cleverTapInstance] dismissAppInbox];
705
+ }
706
+
707
+ RCT_EXPORT_METHOD(initializeInbox) {
708
+ RCTLogInfo(@"[CleverTap Inbox Initialize]");
709
+ [[self cleverTapInstance] initializeInboxWithCallback:^(BOOL success) {
710
+ if (success) {
711
+ RCTLogInfo(@"[Inbox initialized]");
712
+ NSMutableDictionary *body = [NSMutableDictionary new];
713
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapInboxDidInitialize object:nil userInfo:body];
714
+ [[self cleverTapInstance] registerInboxUpdatedBlock:^{
715
+ RCTLogInfo(@"[Inbox updated]");
716
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapInboxMessagesDidUpdate object:nil userInfo:body];
717
+ }];
718
+ }
719
+ }];
720
+ }
721
+
722
+ RCT_EXPORT_METHOD(showInbox:(NSDictionary*)styleConfig) {
723
+ RCTLogInfo(@"[CleverTap Show Inbox]");
724
+ UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
725
+ UIViewController *mainViewController = keyWindow.rootViewController;
726
+ if (mainViewController.presentedViewController) {
727
+ RCTLogInfo(@"CleverTap : Could not present App Inbox because a view controller is already being presented.");
728
+ return;
729
+ }
730
+
731
+ CleverTapInboxViewController *inboxController = [[self cleverTapInstance] newInboxViewControllerWithConfig:[self _dictToInboxStyleConfig:styleConfig? styleConfig : nil] andDelegate:(id <CleverTapInboxViewControllerDelegate>)self];
732
+ if (inboxController) {
733
+ UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:inboxController];
734
+ [mainViewController presentViewController:navigationController animated:YES completion:nil];
735
+ }
736
+ }
737
+
738
+ - (CleverTapInboxStyleConfig*)_dictToInboxStyleConfig: (NSDictionary *)dict {
739
+ CleverTapInboxStyleConfig *_config = [CleverTapInboxStyleConfig new];
740
+ NSString *title = [dict valueForKey:@"navBarTitle"];
741
+ if (title) {
742
+ _config.title = title;
743
+ }
744
+ NSArray *messageTags = [dict valueForKey:@"tabs"];
745
+ if (messageTags) {
746
+ _config.messageTags = messageTags;
747
+ }
748
+ NSString *backgroundColor = [dict valueForKey:@"inboxBackgroundColor"];
749
+ if (backgroundColor) {
750
+ _config.backgroundColor = [self ct_colorWithHexString:backgroundColor alpha:1.0];
751
+ }
752
+ NSString *navigationBarTintColor = [dict valueForKey:@"navBarColor"];
753
+ if (navigationBarTintColor) {
754
+ _config.navigationBarTintColor = [self ct_colorWithHexString:navigationBarTintColor alpha:1.0];
755
+ }
756
+ NSString *navigationTintColor = [dict valueForKey:@"navBarTitleColor"];
757
+ if (navigationTintColor) {
758
+ _config.navigationTintColor = [self ct_colorWithHexString:navigationTintColor alpha:1.0];
759
+ }
760
+ NSString *tabBackgroundColor = [dict valueForKey:@"tabBackgroundColor"];
761
+ if (tabBackgroundColor) {
762
+ _config.navigationBarTintColor = [self ct_colorWithHexString:tabBackgroundColor alpha:1.0];
763
+ }
764
+ NSString *tabSelectedBgColor = [dict valueForKey:@"tabSelectedBgColor"];
765
+ if (tabSelectedBgColor) {
766
+ _config.tabSelectedBgColor = [self ct_colorWithHexString:tabSelectedBgColor alpha:1.0];
767
+ }
768
+ NSString *tabSelectedTextColor = [dict valueForKey:@"tabSelectedTextColor"];
769
+ if (tabSelectedTextColor) {
770
+ _config.tabSelectedTextColor = [self ct_colorWithHexString:tabSelectedTextColor alpha:1.0];
771
+ }
772
+ NSString *tabUnSelectedTextColor = [dict valueForKey:@"tabUnSelectedTextColor"];
773
+ if (tabUnSelectedTextColor) {
774
+ _config.tabUnSelectedTextColor = [self ct_colorWithHexString:tabUnSelectedTextColor alpha:1.0];
775
+ }
776
+ NSString *noMessageTextColor = [dict valueForKey:@"noMessageTextColor"];
777
+ if (noMessageTextColor) {
778
+ _config.noMessageViewTextColor = [self ct_colorWithHexString:noMessageTextColor alpha:1.0];
779
+ }
780
+ NSString *noMessageText = [dict valueForKey:@"noMessageText"];
781
+ if (noMessageText) {
782
+ _config.noMessageViewText = noMessageText;
783
+ }
784
+ NSString *firstTabTitle = [dict valueForKey:@"firstTabTitle"];
785
+ if (firstTabTitle) {
786
+ _config.firstTabTitle = firstTabTitle;
787
+ }
788
+ return _config;
789
+ }
790
+ - (UIColor *)ct_colorWithHexString:(NSString *)string alpha:(CGFloat)alpha{
791
+ if (![string isKindOfClass:[NSString class]] || [string length] == 0) {
792
+ return [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f];
793
+ }
794
+ unsigned int hexint = 0;
795
+ NSScanner *scanner = [NSScanner scannerWithString:string];
796
+ [scanner setCharactersToBeSkipped:[NSCharacterSet
797
+ characterSetWithCharactersInString:@"#"]];
798
+ [scanner scanHexInt:&hexint];
799
+ UIColor *color =
800
+ [UIColor colorWithRed:((CGFloat) ((hexint & 0xFF0000) >> 16))/255
801
+ green:((CGFloat) ((hexint & 0xFF00) >> 8))/255
802
+ blue:((CGFloat) (hexint & 0xFF))/255
803
+ alpha:alpha];
804
+ return color;
805
+ }
806
+
807
+ - (void)messageButtonTappedWithCustomExtras:(NSDictionary *)customExtras {
808
+ NSMutableDictionary *body = [NSMutableDictionary new];
809
+ if (customExtras != nil) {
810
+ body = [NSMutableDictionary dictionaryWithDictionary:customExtras];
811
+ }
812
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapInboxMessageButtonTapped object:nil userInfo:body];
813
+ }
814
+
815
+ - (void)messageDidSelect:(CleverTapInboxMessage *_Nonnull)message atIndex:(int)index withButtonIndex:(int)buttonIndex {
816
+ NSMutableDictionary *body = [NSMutableDictionary new];
817
+ if ([message json] != nil) {
818
+ body[@"data"] = [NSMutableDictionary dictionaryWithDictionary:[message json]];
819
+ } else {
820
+ body[@"data"] = [NSMutableDictionary new];
821
+ }
822
+ body[@"contentPageIndex"] = @(index);
823
+ body[@"buttonIndex"] = @(buttonIndex);
824
+
825
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapInboxMessageTapped object:nil userInfo:body];
826
+ }
827
+
828
+
829
+ #pragma mark - Display Units
830
+
831
+ RCT_EXPORT_METHOD(getAllDisplayUnits:(RCTResponseSenderBlock)callback) {
832
+ RCTLogInfo(@"[CleverTap getAllDisplayUnits]");
833
+ NSArray <CleverTapDisplayUnit*> *units = [[self cleverTapInstance] getAllDisplayUnits];
834
+ NSMutableArray *displayUnits = [NSMutableArray new];
835
+ for (CleverTapDisplayUnit *unit in units) {
836
+ [displayUnits addObject:unit.json];
837
+ }
838
+ NSArray *result = [displayUnits mutableCopy];
839
+ [self returnResult:result withCallback:callback andError:nil];
840
+ }
841
+
842
+ RCT_EXPORT_METHOD(getDisplayUnitForId:(NSString*)unitId callback:(RCTResponseSenderBlock)callback) {
843
+ RCTLogInfo(@"[CleverTap getDisplayUnitForId]");
844
+ CleverTapDisplayUnit * displayUnit = [[self cleverTapInstance] getDisplayUnitForID:unitId];
845
+ NSDictionary *result = displayUnit.json;
846
+ [self returnResult:result withCallback:callback andError:nil];
847
+ }
848
+
849
+ RCT_EXPORT_METHOD(pushDisplayUnitViewedEventForID:(NSString*)unitId) {
850
+ RCTLogInfo(@"[CleverTap pushDisplayUnitViewedEventForID]");
851
+ [[self cleverTapInstance] recordDisplayUnitViewedEventForID:unitId];
852
+ }
853
+
854
+ RCT_EXPORT_METHOD(pushDisplayUnitClickedEventForID:(NSString*)unitId) {
855
+ RCTLogInfo(@"[CleverTap pushDisplayUnitClickedEventForID]");
856
+ [[self cleverTapInstance] recordDisplayUnitClickedEventForID:unitId];
857
+ }
858
+
859
+
860
+ # pragma mark - Feature Flag
861
+
862
+ RCT_EXPORT_METHOD(getFeatureFlag:(NSString*)flag withdefaultValue:(BOOL)defaultValue callback:(RCTResponseSenderBlock)callback) {
863
+ RCTLogInfo(@"[CleverTap getFeatureFlag]");
864
+ BOOL result = [[[self cleverTapInstance] featureFlags] get:flag withDefaultValue:defaultValue];
865
+ [self returnResult:@(result) withCallback:callback andError:nil];
866
+ }
867
+
868
+
869
+ #pragma mark - Product Config
870
+
871
+ RCT_EXPORT_METHOD(setDefaultsMap:(NSDictionary*)jsonDict) {
872
+ RCTLogInfo(@"[CleverTap setDefaultsMap]");
873
+ [[[self cleverTapInstance] productConfig] setDefaults:jsonDict];
874
+ }
875
+
876
+ RCT_EXPORT_METHOD(fetch) {
877
+ RCTLogInfo(@"[CleverTap ProductConfig Fetch]");
878
+ [[[self cleverTapInstance] productConfig] fetch];
879
+ }
880
+
881
+ RCT_EXPORT_METHOD(fetchWithMinimumFetchIntervalInSeconds:(double)time) {
882
+ RCTLogInfo(@"[CleverTap ProductConfig Fetch with minimum Interval]");
883
+ [[[self cleverTapInstance] productConfig] fetchWithMinimumInterval: time];
884
+ }
885
+
886
+ RCT_EXPORT_METHOD(activate) {
887
+ RCTLogInfo(@"[CleverTap ProductConfig Activate]");
888
+ [[[self cleverTapInstance] productConfig] activate];
889
+ }
890
+
891
+ RCT_EXPORT_METHOD(fetchAndActivate) {
892
+ RCTLogInfo(@"[CleverTap ProductConfig Fetch and Activate]");
893
+ [[[self cleverTapInstance] productConfig] fetchAndActivate];
894
+ }
895
+
896
+ RCT_EXPORT_METHOD(setMinimumFetchIntervalInSeconds:(double)time) {
897
+ RCTLogInfo(@"[CleverTap ProductConfig Minimum Time Interval Setup]");
898
+ [[[self cleverTapInstance] productConfig] setMinimumFetchInterval: time];
899
+ }
900
+
901
+ RCT_EXPORT_METHOD(getLastFetchTimeStampInMillis:(RCTResponseSenderBlock)callback) {
902
+ RCTLogInfo(@"[CleverTap Last Fetch Config time]");
903
+ NSTimeInterval result = [[[[self cleverTapInstance] productConfig] getLastFetchTimeStamp] timeIntervalSince1970] * 1000;
904
+ [self returnResult: @(result) withCallback: callback andError:nil];
905
+ }
906
+
907
+ RCT_EXPORT_METHOD(getString:(NSString*)key callback:(RCTResponseSenderBlock)callback) {
908
+ RCTLogInfo(@"[CleverTap fetch String value for Key]");
909
+ NSString *result = [[[self cleverTapInstance] productConfig] get:key].stringValue;
910
+ [self returnResult: result withCallback: callback andError:nil];
911
+ }
912
+
913
+ RCT_EXPORT_METHOD(getBoolean:(NSString*)key callback:(RCTResponseSenderBlock)callback) {
914
+ RCTLogInfo(@"[CleverTap fetch Bool value for Key]");
915
+ BOOL result = [[[self cleverTapInstance] productConfig] get:key].boolValue;
916
+ [self returnResult: @(result) withCallback: callback andError:nil];
917
+ }
918
+
919
+ RCT_EXPORT_METHOD(getDouble:(NSString*)key callback:(RCTResponseSenderBlock)callback) {
920
+ RCTLogInfo(@"[CleverTap fetch Double value for Key]");
921
+ long result = [[[self cleverTapInstance] productConfig] get:key].numberValue.doubleValue;
922
+ [self returnResult: @(result) withCallback: callback andError:nil];
923
+ }
924
+
925
+ RCT_EXPORT_METHOD(reset) {
926
+ RCTLogInfo(@"[CleverTap ProductConfig Reset]");
927
+ [[[self cleverTapInstance] productConfig] reset];
928
+ }
929
+
930
+ #pragma mark - InApp Notification Controls
931
+
932
+ RCT_EXPORT_METHOD(suspendInAppNotifications) {
933
+ RCTLogInfo(@"[CleverTap suspendInAppNotifications");
934
+ [[self cleverTapInstance] suspendInAppNotifications];
935
+ }
936
+
937
+ RCT_EXPORT_METHOD(discardInAppNotifications:(BOOL)dismissInAppIfVisible) {
938
+ RCTLogInfo(@"[CleverTap discardInAppNotifications: %d]", dismissInAppIfVisible);
939
+ [[self cleverTapInstance] discardInAppNotifications:dismissInAppIfVisible];
940
+ }
941
+
942
+ RCT_EXPORT_METHOD(resumeInAppNotifications) {
943
+ RCTLogInfo(@"[CleverTap resumeInAppNotifications");
944
+ [[self cleverTapInstance] resumeInAppNotifications];
945
+ }
946
+
947
+ #pragma mark - InApp Controls
948
+
949
+ RCT_EXPORT_METHOD(fetchInApps:(RCTResponseSenderBlock)callback) {
950
+ RCTLogInfo(@"[CleverTap fetchInApps]");
951
+ [[self cleverTapInstance] fetchInApps:^(BOOL success) {
952
+ [self returnResult:@(success) withCallback:callback andError:nil];
953
+ }];
954
+ }
955
+
956
+ RCT_EXPORT_METHOD(clearInAppResources:(BOOL)expiredOnly) {
957
+ RCTLogInfo(@"[CleverTap clearInAppResources");
958
+ [[self cleverTapInstance] clearInAppResources: expiredOnly];
959
+ }
960
+
961
+ #pragma mark - Push Permission
962
+
963
+ - (CTLocalInApp*)_localInAppConfigFromReadableMap: (NSDictionary *)json {
964
+ CTLocalInApp *inAppBuilder;
965
+ CTLocalInAppType inAppType = HALF_INTERSTITIAL;
966
+ //Required parameters
967
+ NSString *titleText = nil, *messageText = nil, *followDeviceOrientation = nil, *positiveBtnText = nil, *negativeBtnText = nil;
968
+ //Additional parameters
969
+ NSString *fallbackToSettings = nil, *backgroundColor = nil, *btnBorderColor = nil, *titleTextColor = nil, *messageTextColor = nil, *btnTextColor = nil, *imageUrl = nil, *btnBackgroundColor = nil, *btnBorderRadius = nil, *altText = nil;
970
+
971
+ if ([json[@"inAppType"] isEqual: @"half-interstitial"]){
972
+ inAppType = HALF_INTERSTITIAL;
973
+ }
974
+ else {
975
+ inAppType = ALERT;
976
+ }
977
+ if (json[@"titleText"]) {
978
+ titleText = [json valueForKey:@"titleText"];
979
+ }
980
+ if (json[@"messageText"]) {
981
+ messageText = [json valueForKey:@"messageText"];
982
+ }
983
+ if (json[@"followDeviceOrientation"]) {
984
+ followDeviceOrientation = [json valueForKey:@"followDeviceOrientation"];
985
+ }
986
+ if (json[@"positiveBtnText"]) {
987
+ positiveBtnText = [json valueForKey:@"positiveBtnText"];
988
+ }
989
+
990
+ if (json[@"negativeBtnText"]) {
991
+ negativeBtnText = [json valueForKey:@"negativeBtnText"];
992
+ }
993
+
994
+ //creates the builder instance with all the required parameters
995
+ inAppBuilder = [[CTLocalInApp alloc] initWithInAppType:inAppType
996
+ titleText:titleText
997
+ messageText:messageText
998
+ followDeviceOrientation:followDeviceOrientation
999
+ positiveBtnText:positiveBtnText
1000
+ negativeBtnText:negativeBtnText];
1001
+
1002
+ //adds optional parameters to the builder instance
1003
+ if (json[@"fallbackToSettings"]) {
1004
+ fallbackToSettings = [json valueForKey:@"fallbackToSettings"];
1005
+ [inAppBuilder setFallbackToSettings:fallbackToSettings];
1006
+ }
1007
+ if (json[@"backgroundColor"]) {
1008
+ backgroundColor = [json valueForKey:@"backgroundColor"];
1009
+ [inAppBuilder setBackgroundColor:backgroundColor];
1010
+ }
1011
+ if (json[@"btnBorderColor"]) {
1012
+ btnBorderColor = [json valueForKey:@"btnBorderColor"];
1013
+ [inAppBuilder setBtnBorderColor:btnBorderColor];
1014
+ }
1015
+ if (json[@"titleTextColor"]) {
1016
+ titleTextColor = [json valueForKey:@"titleTextColor"];
1017
+ [inAppBuilder setTitleTextColor:titleTextColor];
1018
+ }
1019
+ if (json[@"messageTextColor"]) {
1020
+ messageTextColor = [json valueForKey:@"messageTextColor"];
1021
+ [inAppBuilder setMessageTextColor:messageTextColor];
1022
+ }
1023
+ if (json[@"btnTextColor"]) {
1024
+ btnTextColor = [json valueForKey:@"btnTextColor"];
1025
+ [inAppBuilder setBtnTextColor:btnTextColor];
1026
+ }
1027
+
1028
+ if (json[@"altText"]) {
1029
+ altText = [json valueForKey:@"altText"];
1030
+ }
1031
+
1032
+ if (json[@"imageUrl"]) {
1033
+ imageUrl = [json valueForKey:@"imageUrl"];
1034
+ [inAppBuilder setImageUrl:imageUrl contentDescription:altText];
1035
+ }
1036
+
1037
+ if (json[@"btnBackgroundColor"]) {
1038
+ btnBackgroundColor = [json valueForKey:@"btnBackgroundColor"];
1039
+ [inAppBuilder setBtnBackgroundColor:btnBackgroundColor];
1040
+ }
1041
+ if (json[@"btnBorderRadius"]) {
1042
+ btnBorderRadius = [json valueForKey:@"btnBorderRadius"];
1043
+ [inAppBuilder setBtnBorderRadius:btnBorderRadius];
1044
+ }
1045
+ return inAppBuilder;
1046
+ }
1047
+
1048
+ RCT_EXPORT_METHOD(promptForPushPermission:(BOOL)showFallbackSettings){
1049
+ RCTLogInfo(@"[CleverTap promptForPushPermission: %i]", showFallbackSettings);
1050
+ [[self cleverTapInstance] promptForPushPermission:showFallbackSettings];
1051
+ }
1052
+
1053
+ RCT_EXPORT_METHOD(promptPushPrimer:(NSDictionary *_Nonnull)json){
1054
+ RCTLogInfo(@"[CleverTap promptPushPrimer]");
1055
+ CTLocalInApp *localInAppBuilder = [self _localInAppConfigFromReadableMap:json];
1056
+ [[self cleverTapInstance] promptPushPrimer:localInAppBuilder.getLocalInAppSettings];
1057
+ }
1058
+
1059
+ RCT_EXPORT_METHOD(isPushPermissionGranted:(RCTResponseSenderBlock)callback){
1060
+ if (@available(iOS 10.0, *)) {
1061
+ [[self cleverTapInstance] getNotificationPermissionStatusWithCompletionHandler:^(UNAuthorizationStatus status) {
1062
+ BOOL result = (status == UNAuthorizationStatusAuthorized);
1063
+ RCTLogInfo(@"[CleverTap isPushPermissionGranted: %i]", result);
1064
+ [self returnResult:@(result) withCallback:callback andError:nil];
1065
+ }];
1066
+ } else {
1067
+ // Fallback on earlier versions
1068
+ RCTLogInfo(@"Push Notification is available from iOS v10.0 or later");
1069
+ }
1070
+ }
1071
+
1072
+ #pragma mark - Product Experiences: Vars
1073
+
1074
+ RCT_EXPORT_METHOD(syncVariables) {
1075
+ RCTLogInfo(@"[CleverTap syncVariables]");
1076
+ [[self cleverTapInstance]syncVariables];
1077
+ }
1078
+
1079
+ RCT_EXPORT_METHOD(syncVariablesinProd:(BOOL)isProduction) {
1080
+ RCTLogInfo(@"[CleverTap syncVariables:isProduction]");
1081
+ [[self cleverTapInstance]syncVariables:isProduction];
1082
+ }
1083
+
1084
+ RCT_EXPORT_METHOD(getVariable:(NSString * _Nonnull)name callback:(RCTResponseSenderBlock)callback) {
1085
+ RCTLogInfo(@"[CleverTap getVariable:name]");
1086
+ CTVar *var = self.allVariables[name];
1087
+ [self returnResult:var.value withCallback:callback andError:nil];
1088
+ }
1089
+
1090
+ RCT_EXPORT_METHOD(getVariables:(RCTResponseSenderBlock)callback) {
1091
+ RCTLogInfo(@"[CleverTap getVariables]");
1092
+
1093
+ NSMutableDictionary *varValues = [self getVariableValues];
1094
+ [self returnResult:varValues withCallback:callback andError:nil];
1095
+ }
1096
+
1097
+ RCT_EXPORT_METHOD(variants:(RCTResponseSenderBlock)callback) {
1098
+ RCTLogInfo(@"[CleverTap variants]");
1099
+
1100
+ NSArray<NSDictionary<NSString*,id>*> *variants = [[self cleverTapInstance]variants];
1101
+ [self returnResult:variants withCallback:callback andError:nil];
1102
+ }
1103
+
1104
+ RCT_EXPORT_METHOD(fetchVariables:(RCTResponseSenderBlock)callback) {
1105
+ RCTLogInfo(@"[CleverTap fetchVariables]");
1106
+ [[self cleverTapInstance]fetchVariables:^(BOOL success) {
1107
+ [self returnResult:@(success) withCallback:callback andError:nil];
1108
+ }];
1109
+ }
1110
+
1111
+ RCT_EXPORT_METHOD(defineVariables:(NSDictionary*)variables) {
1112
+ RCTLogInfo(@"[CleverTap defineVariables]");
1113
+
1114
+ if (!variables) return;
1115
+
1116
+ [variables enumerateKeysAndObjectsUsingBlock:^(NSString* _Nonnull key, id _Nonnull value, BOOL * _Nonnull stop) {
1117
+ CTVar *var = [self createVarForName:key andValue:value];
1118
+
1119
+ if (var) {
1120
+ self.allVariables[key] = var;
1121
+ }
1122
+ }];
1123
+ }
1124
+
1125
+ RCT_EXPORT_METHOD(defineFileVariable:(NSString*)fileVariable) {
1126
+ RCTLogInfo(@"[CleverTap defineFileVariable]");
1127
+ if (!fileVariable) return;
1128
+ CTVar *fileVar = [[self cleverTapInstance] defineFileVar:fileVariable];
1129
+ if (fileVar) {
1130
+ self.allVariables[fileVariable] = fileVar;
1131
+ }
1132
+ }
1133
+
1134
+ RCT_EXPORT_METHOD(onVariablesChanged) {
1135
+ RCTLogInfo(@"[CleverTap onVariablesChanged]");
1136
+ [[self cleverTapInstance]onVariablesChanged:^{
1137
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapOnVariablesChanged object:nil userInfo:[self getVariableValues]];
1138
+ }];
1139
+ }
1140
+
1141
+ RCT_EXPORT_METHOD(onOneTimeVariablesChanged) {
1142
+ RCTLogInfo(@"[CleverTap onOneTimeVariablesChanged]");
1143
+ [[self cleverTapInstance] onceVariablesChanged:^{
1144
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapOnOneTimeVariablesChanged object:nil userInfo:[self getVariableValues]];
1145
+ }];
1146
+ }
1147
+
1148
+ RCT_EXPORT_METHOD(onValueChanged:(NSString*)name) {
1149
+ RCTLogInfo(@"[CleverTap onValueChanged]");
1150
+ CTVar *var = self.allVariables[name];
1151
+ if (var) {
1152
+ [var onValueChanged:^{
1153
+ NSDictionary *varResult = @{
1154
+ var.name: var.value
1155
+ };
1156
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapOnValueChanged object:nil userInfo:varResult];
1157
+ }];
1158
+ }
1159
+ }
1160
+
1161
+ RCT_EXPORT_METHOD(onVariablesChangedAndNoDownloadsPending) {
1162
+ RCTLogInfo(@"[CleverTap onVariablesChangedAndNoDownloadsPending]");
1163
+ [[self cleverTapInstance]onVariablesChangedAndNoDownloadsPending:^{
1164
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapOnVariablesChangedAndNoDownloadsPending object:nil userInfo:[self getVariableValues]];
1165
+ }];
1166
+ }
1167
+
1168
+ RCT_EXPORT_METHOD(onceVariablesChangedAndNoDownloadsPending) {
1169
+ RCTLogInfo(@"[CleverTap onceVariablesChangedAndNoDownloadsPending]");
1170
+ [[self cleverTapInstance] onceVariablesChangedAndNoDownloadsPending:^{
1171
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapOnceVariablesChangedAndNoDownloadsPending object:nil userInfo:[self getVariableValues]];
1172
+ }];
1173
+ }
1174
+
1175
+ RCT_EXPORT_METHOD(onFileValueChanged:(NSString*)name) {
1176
+ RCTLogInfo(@"[CleverTap onFileChanged]");
1177
+ CTVar *var = self.allVariables[name];
1178
+ if (var) {
1179
+ [var onFileIsReady:^{
1180
+ NSDictionary *varFileResult = @{
1181
+ var.name: var.value
1182
+ };
1183
+ [[NSNotificationCenter defaultCenter] postNotificationName:kCleverTapOnFileValueChanged object:nil userInfo:varFileResult];
1184
+ }];
1185
+ }
1186
+ }
1187
+
1188
+ # pragma mark - Custom Code Templates
1189
+
1190
+ RCT_EXPORT_METHOD(syncCustomTemplates) {
1191
+ RCTLogInfo(@"[CleverTap syncCustomTemplates]");
1192
+ [[self cleverTapInstance] syncCustomTemplates];
1193
+ }
1194
+
1195
+ RCT_EXPORT_METHOD(syncCustomTemplatesInProd:(BOOL)isProduction) {
1196
+ RCTLogInfo(@"[CleverTap syncCustomTemplates:isProduction]");
1197
+ [[self cleverTapInstance] syncCustomTemplates:isProduction];
1198
+ }
1199
+
1200
+ RCT_EXPORT_METHOD(customTemplateGetBooleanArg:(NSString *)templateName argName:(NSString *)argName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
1201
+ [self resolveWithTemplateContext:templateName resolve:resolve reject:reject block:^id(CTTemplateContext *context) {
1202
+ NSNumber *number = [context numberNamed:argName];
1203
+ return number ? number : [NSNull null];
1204
+ }];
1205
+ }
1206
+
1207
+ RCT_EXPORT_METHOD(customTemplateGetFileArg:(NSString *)templateName argName:(NSString *)argName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
1208
+ [self resolveWithTemplateContext:templateName resolve:resolve reject:reject block:^id(CTTemplateContext *context) {
1209
+ NSString *filePath = [context fileNamed:argName];
1210
+ return filePath ? filePath : [NSNull null];
1211
+ }];
1212
+ }
1213
+
1214
+ RCT_EXPORT_METHOD(customTemplateGetNumberArg:(NSString *)templateName argName:(NSString *)argName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
1215
+ [self resolveWithTemplateContext:templateName resolve:resolve reject:reject block:^id(CTTemplateContext *context) {
1216
+ NSNumber *number = [context numberNamed:argName];
1217
+ return number ? number : [NSNull null];
1218
+ }];
1219
+ }
1220
+
1221
+ RCT_EXPORT_METHOD(customTemplateGetObjectArg:(NSString *)templateName argName:(NSString *)argName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
1222
+ [self resolveWithTemplateContext:templateName resolve:resolve reject:reject block:^id(CTTemplateContext *context) {
1223
+ NSDictionary *dictionary = [context dictionaryNamed:argName];
1224
+ return dictionary ? dictionary : [NSNull null];
1225
+ }];
1226
+ }
1227
+
1228
+ RCT_EXPORT_METHOD(customTemplateGetStringArg:(NSString *)templateName argName:(NSString *)argName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
1229
+ [self resolveWithTemplateContext:templateName resolve:resolve reject:reject block:^id(CTTemplateContext *context) {
1230
+ NSString *str = [context stringNamed:argName];
1231
+ return str ? str : [NSNull null];
1232
+ }];
1233
+ }
1234
+
1235
+ RCT_EXPORT_METHOD(customTemplateRunAction:(NSString *)templateName argName:(NSString *)argName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
1236
+ [self resolveWithTemplateContext:templateName resolve:resolve reject:reject block:^id(CTTemplateContext *context) {
1237
+ [context triggerActionNamed:argName];
1238
+ return nil;
1239
+ }];
1240
+ }
1241
+
1242
+ RCT_EXPORT_METHOD(customTemplateSetDismissed:(NSString *)templateName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
1243
+ [self resolveWithTemplateContext:templateName resolve:resolve reject:reject block:^id(CTTemplateContext *context) {
1244
+ [context dismissed];
1245
+ return nil;
1246
+ }];
1247
+ }
1248
+
1249
+ RCT_EXPORT_METHOD(customTemplateSetPresented:(NSString *)templateName
1250
+ resolve:(RCTPromiseResolveBlock)resolve
1251
+ reject:(RCTPromiseRejectBlock)reject) {
1252
+ [self resolveWithTemplateContext:templateName resolve:resolve reject:reject block:^id(CTTemplateContext *context) {
1253
+ [context presented];
1254
+ return nil;
1255
+ }];
1256
+ }
1257
+
1258
+ RCT_EXPORT_METHOD(customTemplateContextToString:(NSString *)templateName
1259
+ resolve:(RCTPromiseResolveBlock)resolve
1260
+ reject:(RCTPromiseRejectBlock)reject) {
1261
+ [self resolveWithTemplateContext:templateName resolve:resolve reject:reject block:^id(CTTemplateContext *context) {
1262
+ return [context debugDescription];
1263
+ }];
1264
+ }
1265
+
1266
+ - (void)resolveWithTemplateContext:(NSString *)templateName
1267
+ resolve:(RCTPromiseResolveBlock)resolve
1268
+ reject:(RCTPromiseRejectBlock)reject
1269
+ block: (id (^)(CTTemplateContext *context))blockName {
1270
+ if (![self cleverTapInstance]) {
1271
+ reject(@"CustomTemplateError", @"CleverTap is not initialized", nil);
1272
+ return;
1273
+ }
1274
+
1275
+ CTTemplateContext *context = [[self cleverTapInstance] activeContextForTemplate:templateName];
1276
+ if (!context) {
1277
+ reject(@"CustomTemplateError",
1278
+ [NSString stringWithFormat:@"Custom template: %@ is not currently being presented", templateName],
1279
+ nil);
1280
+ return;
1281
+ }
1282
+
1283
+ resolve(blockName(context));
1284
+ }
1285
+
1286
+ # pragma mark - Event emitter
1287
+
1288
+ /// A collection of events sent before ReactNative has started observing events.
1289
+ static NSMutableDictionary<NSString *, NSMutableArray<CleverTapReactPendingEvent *> *> *pendingEvents = [NSMutableDictionary dictionary];
1290
+
1291
+ /// Indicates if ``startObserving`` has been called which means a listener/observer has been added.
1292
+ static BOOL isObserving;
1293
+
1294
+ /// A set of event names that a listener/observer has been added for.
1295
+ static NSMutableSet<NSString *> *observedEvents = [NSMutableSet set];
1296
+
1297
+ /// A set of event names that needs to be observed since they can be sent before ReactNative has started observing events.
1298
+ static NSMutableSet<NSString *> *observableEvents = [NSMutableSet setWithObjects:
1299
+ kCleverTapPushNotificationClicked,
1300
+ kCleverTapProfileDidInitialize,
1301
+ kCleverTapDisplayUnitsLoaded,
1302
+ kCleverTapInAppNotificationShowed,
1303
+ kCleverTapInAppNotificationDismissed,
1304
+ kCleverTapInAppNotificationButtonTapped,
1305
+ kCleverTapProductConfigDidInitialize,
1306
+ kCleverTapCustomTemplatePresent,
1307
+ kCleverTapCustomFunctionPresent,
1308
+ kCleverTapCustomTemplateClose,
1309
+ kCleverTapFeatureFlagsDidUpdate, nil];
1310
+
1311
+ /// Time out in seconds, after which pending events are cleared.
1312
+ /// See ``startObserving`` for details.
1313
+ const int PENDING_EVENTS_TIME_OUT = 5;
1314
+
1315
+ /// Called when a observer/listener is added for the event.
1316
+ /// Post the pending events for the event name.
1317
+ ///
1318
+ /// @param name The name of the observed event.
1319
+ RCT_EXPORT_METHOD(onEventListenerAdded:(NSString*)name) {
1320
+ [observedEvents addObject:name];
1321
+ NSArray *pendingEventsForName = pendingEvents[name];
1322
+ if (pendingEventsForName) {
1323
+ RCTLogInfo(@"[CleverTap: Posting pending events for event: %@]", name);
1324
+ for (CleverTapReactPendingEvent *event in pendingEventsForName) {
1325
+ RCTLogInfo(@"[CleverTap: posting pending event: %@ with body: %@]", event.name, event.body);
1326
+ [[NSNotificationCenter defaultCenter] postNotificationName:event.name object:nil userInfo:event.body];
1327
+ }
1328
+ }
1329
+ }
1330
+
1331
+ /// Send event when ReactNative has started observing events.
1332
+ /// This happens when the first observer/listener is added in ReactNative.
1333
+ /// If events are sent before that, the events are queued.
1334
+ /// Events expected to be queued are specified in ``observableEvents``.
1335
+ /// If ReactNative has started observing and the event is observed, see ``observedEvents``, the events are emitted directly.
1336
+ ///
1337
+ /// @param name The event name.
1338
+ /// @param body The event body parameters.
1339
+ + (void)sendEventOnObserving:(NSString *)name body:(id)body {
1340
+ if (!isObserving && ![observableEvents containsObject:name]) {
1341
+ RCTLogWarn(@"[CleverTap: %@ is sent before observing and is not part of the observable events]", name);
1342
+ [observableEvents addObject:name];
1343
+ }
1344
+
1345
+ if ([observableEvents containsObject:name] && ![observedEvents containsObject:name]) {
1346
+ if (!pendingEvents[name]) {
1347
+ pendingEvents[name] = [NSMutableArray array];
1348
+ }
1349
+
1350
+ CleverTapReactPendingEvent *event = [[CleverTapReactPendingEvent alloc] initWithName:name body:body];
1351
+ [pendingEvents[name] addObject:event];
1352
+ return;
1353
+ }
1354
+
1355
+ [[NSNotificationCenter defaultCenter] postNotificationName:name object:nil userInfo:body];
1356
+ }
1357
+
1358
+ - (NSArray<NSString *> *)supportedEvents {
1359
+ return @[kCleverTapProfileDidInitialize,
1360
+ kCleverTapProfileSync,
1361
+ kCleverTapInAppNotificationShowed,
1362
+ kCleverTapInAppNotificationDismissed,
1363
+ kCleverTapInAppNotificationButtonTapped,
1364
+ kCleverTapInboxDidInitialize,
1365
+ kCleverTapInboxMessagesDidUpdate,
1366
+ kCleverTapInboxMessageButtonTapped,
1367
+ kCleverTapInboxMessageTapped,
1368
+ kCleverTapDisplayUnitsLoaded,
1369
+ kCleverTapFeatureFlagsDidUpdate,
1370
+ kCleverTapProductConfigDidFetch,
1371
+ kCleverTapProductConfigDidActivate,
1372
+ kCleverTapProductConfigDidInitialize,
1373
+ kCleverTapPushNotificationClicked,
1374
+ kCleverTapPushPermissionResponseReceived,
1375
+ kCleverTapOnVariablesChanged,
1376
+ kCleverTapOnOneTimeVariablesChanged,
1377
+ kCleverTapOnValueChanged,
1378
+ kCleverTapOnVariablesChangedAndNoDownloadsPending,
1379
+ kCleverTapOnceVariablesChangedAndNoDownloadsPending,
1380
+ kCleverTapOnFileValueChanged,
1381
+ kCleverTapCustomTemplatePresent,
1382
+ kCleverTapCustomFunctionPresent,
1383
+ kCleverTapCustomTemplateClose];
1384
+ }
1385
+
1386
+ - (void)startObserving {
1387
+ RCTLogInfo(@"[CleverTap startObserving]");
1388
+ NSArray *eventNames = [self supportedEvents];
1389
+ for (NSString *eventName in eventNames) {
1390
+ [[NSNotificationCenter defaultCenter] addObserver:self
1391
+ selector:@selector(emitEventInternal:)
1392
+ name:eventName
1393
+ object:nil];
1394
+ }
1395
+
1396
+ isObserving = YES;
1397
+
1398
+ // Clear the pending events that no listeners were added for.
1399
+ // Clear the events after PENDING_EVENTS_TIME_OUT of when the first observer is added.
1400
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(PENDING_EVENTS_TIME_OUT * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
1401
+ RCTLogInfo(@"[CleverTap: Removing pending events which were not observed]");
1402
+ [CleverTapReact clearPendingEvents];
1403
+ });
1404
+ }
1405
+
1406
+ + (void)clearPendingEvents {
1407
+ pendingEvents = [NSMutableDictionary dictionary];
1408
+ observableEvents = [NSMutableSet set];
1409
+ observedEvents = [NSMutableSet set];
1410
+ }
1411
+
1412
+ - (void)stopObserving {
1413
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
1414
+ }
1415
+
1416
+ - (void)emitEventInternal:(NSNotification *)notification {
1417
+ [self sendEventWithName:notification.name body:notification.userInfo];
1418
+ }
1419
+
1420
+ # pragma mark - Turbo Module
1421
+
1422
+ #ifdef RCT_NEW_ARCH_ENABLED
1423
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const facebook::react::ObjCTurboModule::InitParams &)params {
1424
+ return std::make_shared<facebook::react::NativeCleverTapModuleSpecJSI>(params);
1425
+ }
1426
+ #endif
1427
+
1428
+ @end