clevertap-react-native 3.0.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/android/build.gradle +3 -3
  3. package/android/gradle/wrapper/gradle-wrapper.properties +3 -3
  4. package/android/gradlew +0 -0
  5. package/android/src/main/java/com/clevertap/react/CleverTapCustomTemplates.kt +66 -0
  6. package/android/src/main/java/com/clevertap/react/CleverTapEvent.kt +9 -2
  7. package/android/src/main/java/com/clevertap/react/CleverTapModuleImpl.java +180 -0
  8. package/android/src/main/java/com/clevertap/react/CleverTapUtils.java +5 -7
  9. package/android/src/newarch/CleverTapModule.kt +92 -0
  10. package/android/src/oldarch/CleverTapModule.kt +108 -2
  11. package/clevertap-react-native.podspec +1 -1
  12. package/docs/CustomCodeTemplates.md +215 -0
  13. package/docs/Variables.md +55 -0
  14. package/docs/integration.md +42 -46
  15. package/ios/CleverTapReact/CleverTapReact.h +8 -1
  16. package/ios/CleverTapReact/CleverTapReact.mm +208 -23
  17. package/ios/CleverTapReact/CleverTapReactAppFunctionPresenter.h +20 -0
  18. package/ios/CleverTapReact/CleverTapReactAppFunctionPresenter.mm +21 -0
  19. package/ios/CleverTapReact/CleverTapReactCustomTemplates.h +42 -0
  20. package/ios/CleverTapReact/CleverTapReactCustomTemplates.mm +51 -0
  21. package/ios/CleverTapReact/CleverTapReactManager.h +0 -1
  22. package/ios/CleverTapReact/CleverTapReactManager.mm +0 -17
  23. package/ios/CleverTapReact/CleverTapReactTemplatePresenter.h +22 -0
  24. package/ios/CleverTapReact/CleverTapReactTemplatePresenter.mm +21 -0
  25. package/ios/CleverTapReact.xcodeproj/project.pbxproj +24 -0
  26. package/package.json +3 -3
  27. package/src/NativeCleverTapModule.ts +24 -1
  28. package/src/index.d.ts +150 -10
  29. package/src/index.js +187 -3
  30. package/android/.gradle/8.2/checksums/checksums.lock +0 -0
  31. package/android/.gradle/8.2/checksums/md5-checksums.bin +0 -0
  32. package/android/.gradle/8.2/checksums/sha1-checksums.bin +0 -0
  33. package/android/.gradle/8.2/dependencies-accessors/dependencies-accessors.lock +0 -0
  34. package/android/.gradle/8.2/dependencies-accessors/gc.properties +0 -0
  35. package/android/.gradle/8.2/executionHistory/executionHistory.bin +0 -0
  36. package/android/.gradle/8.2/executionHistory/executionHistory.lock +0 -0
  37. package/android/.gradle/8.2/fileChanges/last-build.bin +0 -0
  38. package/android/.gradle/8.2/fileHashes/fileHashes.bin +0 -0
  39. package/android/.gradle/8.2/fileHashes/fileHashes.lock +0 -0
  40. package/android/.gradle/8.2/fileHashes/resourceHashesCache.bin +0 -0
  41. package/android/.gradle/8.2/gc.properties +0 -0
  42. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  43. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  44. package/android/.gradle/buildOutputCleanup/outputFiles.bin +0 -0
  45. package/android/.gradle/checksums/checksums.lock +0 -0
  46. package/android/.gradle/checksums/md5-checksums.bin +0 -0
  47. package/android/.gradle/checksums/sha1-checksums.bin +0 -0
  48. package/android/.gradle/config.properties +0 -2
  49. package/android/.gradle/file-system.probe +0 -0
  50. package/android/.gradle/vcs-1/gc.properties +0 -0
  51. package/android/.settings/org.eclipse.buildship.core.prefs +0 -2
  52. package/android/local.properties +0 -8
@@ -24,7 +24,7 @@ Pod::Spec.new do |s|
24
24
  s.dependency 'React-Core'
25
25
  end
26
26
 
27
- s.dependency 'CleverTap-iOS-SDK', '7.0.1'
27
+ s.dependency 'CleverTap-iOS-SDK', '7.0.2'
28
28
 
29
29
  if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
30
30
  s.pod_target_xcconfig = {
@@ -0,0 +1,215 @@
1
+ # Custom Code Templates
2
+
3
+ CleverTap React Native SDK 3.1.0 and above supports a custom presentation of in-app messages. This allows for utilizing the in-app notifications functionality with custom configuration and presentation logic. Two types of templates can be defined through the SDK: Templates and Functions. Templates can contain action arguments while Functions cannot and Functions can be used as actions while Templates cannot. Functions can be either "visual" or "non-visual". "Visual" functions can contain UI logic and will be part of the [In-App queue](#in-App-queue), while "non-visual" functions will be triggered directly when invoked and should not contain UI logic.
4
+
5
+ ## Creating templates and functions
6
+ Templates consist of a name, type, and arguments (and isVisual for Functions). Type and arguments (and isVisual for Functions) are required and names must be unique across the application. The template definitions are validated for correctness and will throw `CustomTemplateException` when an invalid template is created on launching the application. Those exceptions should generally not be caught and template definitions must be valid to be triggered correctly.
7
+
8
+ The templates are defined in а JSON format with the following scheme:
9
+ ```json
10
+ {
11
+ "TemplateName": {
12
+ "type": "template",
13
+ "arguments": {
14
+ "Argument1": {
15
+ "type": "string|number|boolean|file|action|object",
16
+ "value": "val"
17
+ },
18
+ "Argument2": {
19
+ "type": "object",
20
+ "value": {
21
+ "Nested1": {
22
+ "type": "string|number|boolean|object",
23
+ "value": "val"
24
+ },
25
+ "Nested2": {
26
+ "type": "string|number|boolean|object",
27
+ "value": "val"
28
+ }
29
+ }
30
+ }
31
+ }
32
+ },
33
+ "functionName": {
34
+ "type": "function",
35
+ "isVisual": true|false,
36
+ "arguments": {
37
+ "a": {
38
+ "type": "string|number|boolean|file|object",
39
+ "value": "val"
40
+ }
41
+ }
42
+ }
43
+ }
44
+ ```
45
+ The JSON definitions should be placed in one or more files in the following locations:
46
+ - Android: in `assets` directory
47
+ - iOS: in any directory linked to the project
48
+
49
+ For a working example, see the Example project: `Example/assets/templates.json` and `Example/android/app/src/main/assets/custom/templates.json`.
50
+
51
+ Optionally the `react-native-assets` package can be utilized to keep both files in sync.
52
+
53
+ ### Arguments
54
+ An `argument` is a structure that represents the configuration of the custom code templates. It consists of a `type` and a `value`.
55
+ The supported argument types are:
56
+ - Primitives - `boolean`, `number`, and `string`. They must have a default value which would be used if no other value is configured for the notification.
57
+ - `object` - An `Object` where keys are the argument names and values are ```Arguments``` with supported primitive values.
58
+ - `file` - a file argument that will be downloaded when the template is triggered. Files don't have default values.
59
+ - `action` - an action argument that could be a function template or a built-in action like ‘close’ or ‘open url’. Actions don't have default values.
60
+
61
+ #### Hierarchical arguments
62
+ You can group arguments by either using an `object` argument or indicating the group in the argument's name by using a "." symbol. Both definitions are treated the same. `file` and `action` type arguments can only be added to a group by specifying the group in the argument's name.
63
+
64
+ The following code snippets define identical arguments:
65
+ ```json
66
+ "arguments": {
67
+ "map": {
68
+ "type": "object",
69
+ "value": {
70
+ "a": {
71
+ "type": "number",
72
+ "value": 5
73
+ },
74
+ "b": {
75
+ "type": "number",
76
+ "value": 6
77
+ }
78
+ }
79
+ }
80
+ }
81
+ ```
82
+ and
83
+ ```json
84
+ "arguments": {
85
+ "map.a": {
86
+ "type": "number",
87
+ "value": 5
88
+ },
89
+ "map.b": {
90
+ "type": "number",
91
+ "value": 6
92
+ }
93
+ }
94
+ ```
95
+
96
+ ### Template definition example
97
+ ```json
98
+ "Example template": {
99
+ "type": "template",
100
+ "arguments": {
101
+ "boolArg": {
102
+ "type": "boolean",
103
+ "value": false
104
+ },
105
+ "stringArg": {
106
+ "type": "string",
107
+ "value": "Default"
108
+ },
109
+ "mapArg": {
110
+ "type": "object",
111
+ "value": {
112
+ "int": {
113
+ "type": "number",
114
+ "value": 0
115
+ },
116
+ "string": {
117
+ "type": "string",
118
+ "value": "Default"
119
+ }
120
+ }
121
+ },
122
+ "actionArg": {
123
+ "type": "action"
124
+ },
125
+ "fileArg": {
126
+ "type": "file"
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ ## Registering custom templates
133
+
134
+ Templates must be registered within the native applications:
135
+
136
+ ### For Android
137
+ Call `CleverTapCustomTemplates.registerCustomTemplates` in your `Application.onCreate` method.
138
+ - If you are extending `CleverTapApplication` add this line before calling `super.onCreate()`:
139
+ ```java
140
+ public class MainApplication extends CleverTapApplication {
141
+ @Override
142
+ public void onCreate() {
143
+ CleverTapCustomTemplates.registerCustomTemplates(this, "templateDefinitionsFileInAssets.json");
144
+ super.onCreate();
145
+ }
146
+ }
147
+ ```
148
+ - Otherwise add the line before calling `CleverTapRnAPI.initReactNativeIntegration(this)`:
149
+ ```java
150
+ public class MainApplication extends Application {
151
+ @Override
152
+ public void onCreate() {
153
+ ActivityLifecycleCallback.register(this);
154
+ super.onCreate();
155
+ CleverTapCustomTemplates.registerCustomTemplates(this, "templateDefinitionsFileInAssets.json");
156
+ CleverTapRnAPI.initReactNativeIntegration(this);
157
+ }
158
+ }
159
+ ```
160
+
161
+ ### For iOS
162
+ Call `[CleverTapReactCustomTemplates registerCustomTemplates]` in your `AppDelegate.didFinishLaunchingWithOptions` before calling `[CleverTap autoIntegrate]`:
163
+ ```objc
164
+ @implementation AppDelegate
165
+ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
166
+ [CleverTapReactCustomTemplates registerCustomTemplates:@"templates", nil];
167
+ [CleverTap autoIntegrate];
168
+ [[CleverTapReactManager sharedInstance] applicationDidLaunchWithOptions:launchOptions];
169
+
170
+ return [super application:application didFinishLaunchingWithOptions:launchOptions];
171
+ }
172
+ ```
173
+
174
+ ## Syncing in-app templates to the dashboard
175
+
176
+ For the templates to be usable in campaigns they must be synced with the dashboard. When all templates and functions are defined and registered in the SDK, they can be synced by calling `CleverTap.syncCustomTemplates()` or `CleverTap.syncCustomTemplatesInProd()` in your React application. The syncing can only be done in debug builds and with an SDK user marked as a "test user". We recommend only calling this function while developing the templates and deleting the invocation in release builds.
177
+
178
+ ## Presenting templates
179
+
180
+ When a custom template is triggered, the corresponding event `CleverTap.CleverTapCustomTemplatePresent` or `CleverTap.CleverTapCustomFunctionPresent` will be raised. Applications with custom templates or functions must subscribe to those events through `CleverTap.addListener` where the event data will be the template's name. When the event handler is invoked, this template will be considered "active" until `CleverTap.customTemplateSetDismissed(templateName)` is called. While a template is "active" the following functions can be used:
181
+
182
+ - Obtain argument values by using the appropriate `customTemplateGet*Arg(templateName: string, argName: string)` methods.
183
+ - Trigger actions by their name through `CleverTap.customTemplateRunAction(templateName: string, argName: string)`.
184
+ - Set the state of the template invocation. `CleverTap.customTemplateSetPresented(templateName: string)` and `CleverTap.customTemplateSetDismissed(templateName: string)` notify the SDK of the state of the current template invocation. The presented state is when an in-app is displayed to the user and the dismissed state is when the in-app is no longer displayed.
185
+
186
+ Only one visual template or other InApp message can be displayed at a time by the SDK and no new messages can be shown until the current one is dismissed.
187
+
188
+ Applications should also subscribe to `CleverTap.CleverTapCustomTemplateClose` which will be raised when a template should be closed (this could occur when an action of type "close" is triggered). Use this listener to remove the UI associated with the template and call `CleverTap.customTemplateSetDismissed(templateName)` to close it.
189
+
190
+ ### Example
191
+
192
+ ```js
193
+ CleverTap.addListener(CleverTap.CleverTapCustomTemplatePresent, templateName => {
194
+ // show the UI for the template and call customTemplateSetDismissed when it is closed
195
+ showTemplateUi({
196
+ template: templateName,
197
+ onClose: ()=> {
198
+ CleverTap.customTemplateSetDismissed(templateName);
199
+ }
200
+ });
201
+ // call customTemplateSetPresented when the UI has become visible to the user
202
+ CleverTap.customTemplateSetPresented(templateName);
203
+ });
204
+
205
+ CleverTap.addListener(CleverTap.CleverTapCustomTemplateClose, templateName => {
206
+ // close the corresponding UI before calling customTemplateSetDismissed
207
+ CleverTap.customTemplateSetDismissed(templateName);
208
+ });
209
+ ```
210
+
211
+ ### In-App queue
212
+ When an in-app needs to be shown it is added to a queue (depending on its priority) and is displayed when all messages before it have been dismissed. The queue is saved in the storage and kept across app launches to ensure all messages are displayed when possible. The custom code in-apps behave in the same way. They will be triggered once their corresponding notification is the next one in the queue to be shown. However since the control of the dismissal is left to the application's code, the next in-app message will not be displayed until the current code template has called `CleverTap.customTemplateSetDismissed(templateName)`
213
+
214
+ ### File downloading and caching
215
+ File arguments are automatically downloaded and are ready for use when an in-app template is presented. The files are downloaded when a file argument has changed and this file is not already cached. For client-side in-apps, this happens at App Launch and is retried if needed when an in-app should be presented. For server-side in-apps, the file downloading happens only before presenting the in-app. If any of the file arguments of an in-app fails to be downloaded, the whole in-app is skipped and the custom template will not be triggered.
package/docs/Variables.md CHANGED
@@ -27,6 +27,14 @@ let variables = {
27
27
  CleverTap.defineVariables(variables);
28
28
  ```
29
29
 
30
+ # Define File Variables
31
+
32
+ CleverTap React Native SDK supports file types for variables from version `3.1.0`. Supported file types include but are not limited to images (jpg, jpeg, png, gif), text files, and PDFs.
33
+
34
+ ```javascript
35
+ CleverTap.defineFileVariable("fileVariable");
36
+ ```
37
+
30
38
  # Setup Callbacks
31
39
 
32
40
  CleverTap React Native SDK provides several callbacks for the developer to receive feedback from the SDK. You can use them as per your requirement, using all of them is not mandatory. They are as follows:
@@ -35,6 +43,13 @@ CleverTap React Native SDK provides several callbacks for the developer to recei
35
43
  - `onVariablesChanged`
36
44
  - `onValueChanged`
37
45
 
46
+ From version `3.1.0` onwards, the following callbacks are also supported:
47
+
48
+ - `onOneTimeVariablesChanged`
49
+ - `onVariablesChangedAndNoDownloadsPending`
50
+ - `onceVariablesChangedAndNoDownloadsPending`
51
+ - `onFileValueChanged`
52
+
38
53
  ## Status of Variables Fetch Request
39
54
 
40
55
  This method provides a boolean flag to ensure that the variables are successfully fetched from the server.
@@ -55,6 +70,16 @@ CleverTap.onVariablesChanged((variables) => {
55
70
  });
56
71
  ```
57
72
 
73
+ ## `onOneTimeVariablesChanged`
74
+
75
+ This callback is invoked once when variables are initialized with a value or changed with a new server value. Callback is triggered only once on app start, or when added if server values are already received
76
+
77
+ ```javascript
78
+ CleverTap.onOneTimeVariablesChanged((variables) => {
79
+ console.log('onOneTimeVariablesChanged: ', variables);
80
+ });
81
+ ```
82
+
58
83
  ## `onValueChanged`
59
84
 
60
85
  This callback is invoked when the value of the variable changes. You must provide the name of the variable whose value needs to be observed.
@@ -65,6 +90,36 @@ CleverTap.onValueChanged('reactnative_var_string', (variable) => {
65
90
  });
66
91
  ```
67
92
 
93
+ ## `onVariablesChangedAndNoDownloadsPending`
94
+
95
+ This callback is invoked when variable values are changed and the files associated with it are downloaded and ready to be used. Callback is triggered each time new values are fetched and downloaded.
96
+
97
+ ```javascript
98
+ CleverTap.onVariablesChangedAndNoDownloadsPending((variables) => {
99
+ console.log('onVariablesChangedAndNoDownloadsPending', variables);
100
+ });
101
+ ```
102
+
103
+ ## `onceVariablesChangedAndNoDownloadsPending`
104
+
105
+ This callback is invoked only once when variable values are changed and the files associated with it are downloaded and ready to be used. Callback is triggered only once for when new values are fetched and downloaded
106
+
107
+ ```javascript
108
+ CleverTap.onceVariablesChangedAndNoDownloadsPending((variables) => {
109
+ console.log('onceVariablesChangedAndNoDownloadsPending', variables);
110
+ });
111
+ ```
112
+
113
+ ## `onFileValueChanged`
114
+
115
+ This callback is registered per file variable. It is called when the file associated with the file variable is downloaded and ready to be used.
116
+
117
+ ```javascript
118
+ CleverTap.onFileValueChanged('fileVariable', (variable) => {
119
+ console.log('onFileValueChanged: ', variable);
120
+ });
121
+ ```
122
+
68
123
  # Sync Defined Variables
69
124
 
70
125
  After defining your variables in the code, you must send/sync variables to the server. To do so, the app must be in DEBUG mode and mark a particular CleverTap user profile as a test profile from the CleverTap dashboard. [Learn how to mark a profile as **Test Profile**](https://developer.clevertap.com/docs/concepts-user-profiles#mark-a-user-profile-as-a-test-profile)
@@ -30,25 +30,21 @@ Note: Need to use **@import CleverTapSDK;** instead of **#import <CleverTap-iOS-
30
30
  2. Add CleverTapPackage to the packages list in MainApplication.java (`android/app/src/[...]/MainApplication.java`)
31
31
  ```java
32
32
  // ...
33
-
33
+
34
34
  // CleverTap imports
35
- import com.clevertap.android.sdk.ActivityLifecycleCallback;
36
35
  import com.clevertap.react.CleverTapPackage;
37
- import com.clevertap.react.CleverTapRnAPI;
38
-
39
-
36
+
40
37
  //...
41
-
38
+
42
39
  // add CleverTapPackage to react-native package list
43
- @Override
44
- protected List<ReactPackage> getPackages() {
45
- List<ReactPackage> packages = new PackageList(this).getPackages();
46
- // Packages that cannot be autolinked yet can be added manually here, for
47
- // example:
48
- packages.add(new CleverTapPackage());// only needed when not auto-linking
49
- return packages;
50
-
51
- }
40
+ @Override
41
+ protected List<ReactPackage> getPackages() {
42
+ List<ReactPackage> packages = new PackageList(this).getPackages();
43
+ // Packages that cannot be autolinked yet can be added manually here, for
44
+ // example:
45
+ packages.add(new CleverTapPackage());// only needed when not auto-linking
46
+ return packages;
47
+ }
52
48
  ```
53
49
 
54
50
  3. Initialise Clevertap ReactNative Integration - This adds support for `ClevertapPushNotiificationClicked` from killed state and registers the `ActivityLifecycleCallback`
@@ -60,52 +56,52 @@ Note: Need to use **@import CleverTapSDK;** instead of **#import <CleverTap-iOS-
60
56
  import com.clevertap.android.sdk.CleverTapAPI;
61
57
  import com.clevertap.android.sdk.CleverTapAPI.LogLevel;
62
58
  // ...
63
-
64
- public class MainApplication implements ReactApplication {
65
- // ...
66
-
67
- @Override
68
- public void onCreate() {
69
- CleverTapAPI.setDebugLevel(LogLevel.VERBOSE);
70
- ActivityLifecycleCallback.register(this);
71
- CleverTapRnAPI.initReactNativeIntegration(this);
72
- super.onCreate();
73
- // ...
74
- }
75
-
59
+
60
+ public class MainApplication implements ReactApplication
61
+ {
76
62
  // ...
63
+
64
+ @Override
65
+ public void onCreate() {
66
+ CleverTapAPI.setDebugLevel(LogLevel.VERBOSE);
67
+ ActivityLifecycleCallback.register(this);
68
+ CleverTapRnAPI.initReactNativeIntegration(this);
69
+ super.onCreate();
70
+ // ...
77
71
  }
72
+
73
+ // ...
74
+ }
78
75
  ```
79
76
 
80
77
  <div style="text-align:center; font-size: larger; font-weight: bold;">OR</div>
81
78
  <br>
82
79
 
83
-
84
80
  - From clevertap-react-native **v3.0.0** onwards developers can make their `Application` class extend `CleverTapApplication` to support out of the box integration. Before **v3.0.0** developers were forced to register activity lifecycle in their `Application` class manually which is being abstract out in `CleverTapApplication` class.
85
81
 
86
82
  ```java
87
- import com.clevertap.react.CleverTapApplication;
88
- import com.clevertap.android.sdk.ActivityLifecycleCallback;
89
- import com.clevertap.android.sdk.CleverTapAPI;
90
- import com.clevertap.android.sdk.CleverTapAPI.LogLevel;
91
- // other imports
92
-
93
- public class MainApplication extends CleverTapApplication
83
+ import com.clevertap.react.CleverTapApplication;
84
+ import com.clevertap.android.sdk.ActivityLifecycleCallback;
85
+ import com.clevertap.android.sdk.CleverTapAPI;
86
+ import com.clevertap.android.sdk.CleverTapAPI.LogLevel;
87
+ // other imports
88
+
89
+ public class MainApplication extends CleverTapApplication
94
90
  implements ActivityLifecycleCallbacks, ReactApplication
95
- {
91
+ {
96
92
  // ...
97
93
  @Override
98
- public void onCreate() {
99
- CleverTapAPI.setDebugLevel(LogLevel.VERBOSE);
100
- ActivityLifecycleCallback.register(this); // Not required for v3.0.0+
101
- super.onCreate();
102
- // ...
103
- }
104
- }
94
+ public void onCreate() {
95
+ CleverTapAPI.setDebugLevel(LogLevel.VERBOSE);
96
+ ActivityLifecycleCallback.register(this); // Not required for v3.0.0+
97
+ super.onCreate();
98
+ // ...
99
+ }
100
+ }
105
101
  ```
106
102
  4. <a name="step4"></a> Optionally override onCreate in MainActivity.java to notify CleverTap of a launch deep link (`android/app/src/[...]/MainActivity.java`)
107
103
  ```java
108
- import com.clevertap.react.CleverTapModule;
104
+ import com.clevertap.react.CleverTapRnAPI;
109
105
  import android.os.Bundle;
110
106
 
111
107
 
@@ -115,7 +111,7 @@ Note: Need to use **@import CleverTapSDK;** instead of **#import <CleverTap-iOS-
115
111
  @Override
116
112
  protected void onCreate(Bundle savedInstanceState) {
117
113
  super.onCreate(savedInstanceState);
118
- CleverTapRnAPI.setInitialUri(getIntent().getData());
114
+ CleverTapRnAPI.setInitialUri(getIntent().getData()); // From v3.0.0+
119
115
  }
120
116
 
121
117
  // ...
@@ -18,7 +18,14 @@ static NSString *const kCleverTapPushNotificationClicked = @"CleverTapPushNotifi
18
18
  static NSString *const kCleverTapPushPermissionResponseReceived = @"CleverTapPushPermissionResponseReceived";
19
19
  static NSString *const kCleverTapInAppNotificationShowed = @"CleverTapInAppNotificationShowed";
20
20
  static NSString *const kCleverTapOnVariablesChanged = @"CleverTapOnVariablesChanged";
21
+ static NSString *const kCleverTapOnOneTimeVariablesChanged = @"CleverTapOnOneTimeVariablesChanged";
21
22
  static NSString *const kCleverTapOnValueChanged = @"CleverTapOnValueChanged";
23
+ static NSString *const kCleverTapOnVariablesChangedAndNoDownloadsPending = @"CleverTapOnVariablesChangedAndNoDownloadsPending";
24
+ static NSString *const kCleverTapOnceVariablesChangedAndNoDownloadsPending = @"CleverTapOnceVariablesChangedAndNoDownloadsPending";
25
+ static NSString *const kCleverTapOnFileValueChanged = @"CleverTapOnFileValueChanged";
26
+ static NSString *const kCleverTapCustomTemplatePresent = @"CleverTapCustomTemplatePresent";
27
+ static NSString *const kCleverTapCustomFunctionPresent = @"CleverTapCustomFunctionPresent";
28
+ static NSString *const kCleverTapCustomTemplateClose = @"CleverTapCustomTemplateClose";
22
29
  static NSString *const kXPS = @"XPS";
23
30
 
24
31
  #ifdef RCT_NEW_ARCH_ENABLED
@@ -31,4 +38,4 @@ static NSString *const kXPS = @"XPS";
31
38
 
32
39
  + (void)sendEventOnObserving:(NSString *)name body:(id)body;
33
40
 
34
- @end
41
+ @end