appambit 0.1.1 → 0.3.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 (49) hide show
  1. package/Appambit.podspec +1 -1
  2. package/README.md +1 -1
  3. package/android/build.gradle +1 -1
  4. package/android/src/main/java/com/appambit/AppambitCmsModule.kt +131 -0
  5. package/android/src/main/java/com/appambit/AppambitPackage.kt +4 -0
  6. package/android/src/main/java/com/appambit/AppambitRemoteConfigModule.kt +38 -0
  7. package/ios/AppAmbitCms.h +5 -0
  8. package/ios/AppAmbitCms.mm +185 -0
  9. package/ios/AppAmbitRemoteConfig.h +5 -0
  10. package/ios/AppAmbitRemoteConfig.mm +33 -0
  11. package/ios/AppAmbitSDKWrapper.swift +47 -1
  12. package/ios/Appambit.h +4 -0
  13. package/package.json +1 -1
  14. package/src/CmsQuery.ts +114 -0
  15. package/src/NativeAppambitCms.ts +9 -0
  16. package/src/NativeAppambitRemoteConfig.ts +11 -0
  17. package/src/index.tsx +58 -11
  18. package/lib/module/NativeAppambitAnalytics.js +0 -5
  19. package/lib/module/NativeAppambitAnalytics.js.map +0 -1
  20. package/lib/module/NativeAppambitCore.js +0 -5
  21. package/lib/module/NativeAppambitCore.js.map +0 -1
  22. package/lib/module/NativeAppambitCrashes.js +0 -5
  23. package/lib/module/NativeAppambitCrashes.js.map +0 -1
  24. package/lib/module/index.js +0 -126
  25. package/lib/module/index.js.map +0 -1
  26. package/lib/module/package.json +0 -1
  27. package/lib/typescript/appambit_test_app/src/App.d.ts +0 -2
  28. package/lib/typescript/appambit_test_app/src/App.d.ts.map +0 -1
  29. package/lib/typescript/appambit_test_app/src/components/CustomButton.d.ts +0 -8
  30. package/lib/typescript/appambit_test_app/src/components/CustomButton.d.ts.map +0 -1
  31. package/lib/typescript/appambit_test_app/src/components/CustomInput.d.ts +0 -10
  32. package/lib/typescript/appambit_test_app/src/components/CustomInput.d.ts.map +0 -1
  33. package/lib/typescript/appambit_test_app/src/screens/AnalyticsScreen.d.ts +0 -2
  34. package/lib/typescript/appambit_test_app/src/screens/AnalyticsScreen.d.ts.map +0 -1
  35. package/lib/typescript/appambit_test_app/src/screens/CrashesScreen.d.ts +0 -2
  36. package/lib/typescript/appambit_test_app/src/screens/CrashesScreen.d.ts.map +0 -1
  37. package/lib/typescript/appambit_test_app/src/screens/SecondScreen.d.ts +0 -9
  38. package/lib/typescript/appambit_test_app/src/screens/SecondScreen.d.ts.map +0 -1
  39. package/lib/typescript/appambit_test_app/src/utils/uuid.d.ts +0 -2
  40. package/lib/typescript/appambit_test_app/src/utils/uuid.d.ts.map +0 -1
  41. package/lib/typescript/package.json +0 -1
  42. package/lib/typescript/src/NativeAppambitAnalytics.d.ts +0 -14
  43. package/lib/typescript/src/NativeAppambitAnalytics.d.ts.map +0 -1
  44. package/lib/typescript/src/NativeAppambitCore.d.ts +0 -8
  45. package/lib/typescript/src/NativeAppambitCore.d.ts.map +0 -1
  46. package/lib/typescript/src/NativeAppambitCrashes.d.ts +0 -23
  47. package/lib/typescript/src/NativeAppambitCrashes.d.ts.map +0 -1
  48. package/lib/typescript/src/index.d.ts +0 -27
  49. package/lib/typescript/src/index.d.ts.map +0 -1
package/Appambit.podspec CHANGED
@@ -16,7 +16,7 @@ Pod::Spec.new do |s|
16
16
  s.source_files = "ios/**/*.{h,m,mm,cpp,swift}"
17
17
  s.private_header_files = "ios/**/*.h"
18
18
 
19
- s.dependency 'AppAmbitSdk', '~> 0.1.2'
19
+ s.dependency 'AppAmbitSdk', '~> 0.5.0'
20
20
 
21
21
  install_modules_dependencies(s)
22
22
  end
package/README.md CHANGED
@@ -63,7 +63,7 @@ Add the package to your React Native project:
63
63
  ```bash
64
64
  npm install appambit
65
65
  # or specify version
66
- npm install appambit@0.1.1
66
+ npm install appambit@0.3.0
67
67
  ```
68
68
  ---
69
69
 
@@ -74,5 +74,5 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
74
74
  dependencies {
75
75
  implementation "com.facebook.react:react-android"
76
76
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
77
- implementation "com.appambit:appambit:0.2.2"
77
+ implementation("com.appambit:appambit:0.5.0")
78
78
  }
@@ -0,0 +1,131 @@
1
+ package com.appambit
2
+
3
+ import com.appambit.sdk.Cms
4
+ import com.appambit.sdk.services.interfaces.ICmsQuery
5
+ import com.facebook.react.bridge.*
6
+ import org.json.JSONArray
7
+ import org.json.JSONObject
8
+
9
+ class AppambitCmsModule(reactContext: ReactApplicationContext) : NativeAppambitCmsSpec(reactContext) {
10
+
11
+ override fun getName(): String {
12
+ return NAME
13
+ }
14
+
15
+ override fun getList(contentType: String, filters: ReadableArray, promise: Promise) {
16
+ try {
17
+ val query: ICmsQuery<JSONObject> = Cms.content(contentType, java.lang.Object::class.java as Class<JSONObject>)
18
+
19
+ for (i in 0 until filters.size()) {
20
+ val filter = filters.getMap(i) ?: continue
21
+
22
+ if (filter.hasKey("method")) {
23
+ val method = filter.getString("method")
24
+ val args = filter.getArray("args")
25
+ if (method != null && args != null) {
26
+ when (method) {
27
+ "search" -> query.search(args.getString(0))
28
+ "startsWith" -> query.startsWith(args.getString(0), args.getString(1))
29
+ "inList" -> {
30
+ val listArgs = args.getArray(1)
31
+ val list = mutableListOf<String>()
32
+ if (listArgs != null) {
33
+ for (j in 0 until listArgs.size()) list.add(listArgs.getString(j) ?: "")
34
+ }
35
+ query.inList(args.getString(0) ?: "", list)
36
+ }
37
+ "notInList" -> {
38
+ val listArgs = args.getArray(1)
39
+ val list = mutableListOf<String>()
40
+ if (listArgs != null) {
41
+ for (j in 0 until listArgs.size()) list.add(listArgs.getString(j) ?: "")
42
+ }
43
+ query.notInList(args.getString(0) ?: "", list)
44
+ }
45
+ "orderByAscending" -> query.orderByAscending(args.getString(0))
46
+ "orderByDescending" -> query.orderByDescending(args.getString(0))
47
+ "getPage" -> query.getPage(args.getInt(0))
48
+ "getPerPage" -> query.getPerPage(args.getInt(0))
49
+ }
50
+ }
51
+ } else if (filter.hasKey("field") && filter.hasKey("operator")) {
52
+ val field = filter.getString("field") ?: continue
53
+ val op = filter.getString("operator") ?: "="
54
+
55
+ if (filter.getType("value") == ReadableType.Number) {
56
+ val value = filter.getDouble("value")
57
+ when (op) {
58
+ ">" -> query.greaterThan(field, value)
59
+ ">=" -> query.greaterThanOrEqual(field, value)
60
+ "<" -> query.lessThan(field, value)
61
+ "<=" -> query.lessThanOrEqual(field, value)
62
+ "=" -> query.equals(field, value.toString())
63
+ "!=" -> query.notEquals(field, value.toString())
64
+ }
65
+ } else if (filter.getType("value") == ReadableType.String) {
66
+ val value = filter.getString("value") ?: ""
67
+ when (op) {
68
+ "=" -> query.equals(field, value)
69
+ "!=" -> query.notEquals(field, value)
70
+ "LIKE" -> query.contains(field, value)
71
+ }
72
+ }
73
+ }
74
+ }
75
+
76
+ query.list.then { items ->
77
+ val result = Arguments.createArray()
78
+ if (items != null) {
79
+ for (item in items) {
80
+ result.pushMap(convertJsonToMap(item))
81
+ }
82
+ }
83
+ promise.resolve(result)
84
+ }
85
+ } catch (e: Exception) {
86
+ promise.reject("CMS_GET_LIST_ERROR", e.message, e)
87
+ }
88
+ }
89
+
90
+ override fun clearCache(contentType: String) {
91
+ Cms.clearCache(contentType)
92
+ }
93
+
94
+ override fun clearAllCache() {
95
+ Cms.clearAllCache()
96
+ }
97
+
98
+ private fun convertJsonToMap(jsonObject: JSONObject): WritableMap {
99
+ val map = Arguments.createMap()
100
+ val iterator = jsonObject.keys()
101
+ while (iterator.hasNext()) {
102
+ val key = iterator.next()
103
+ val value = jsonObject.get(key)
104
+ if (value is String) map.putString(key, value)
105
+ else if (value is Int) map.putInt(key, value)
106
+ else if (value is Double) map.putDouble(key, value)
107
+ else if (value is Boolean) map.putBoolean(key, value)
108
+ else if (value is JSONObject) map.putMap(key, convertJsonToMap(value))
109
+ else if (value is JSONArray) map.putArray(key, convertJsonToArray(value))
110
+ }
111
+ return map
112
+ }
113
+
114
+ private fun convertJsonToArray(jsonArray: JSONArray): WritableArray {
115
+ val array = Arguments.createArray()
116
+ for (i in 0 until jsonArray.length()) {
117
+ val value = jsonArray.get(i)
118
+ if (value is String) array.pushString(value)
119
+ else if (value is Int) array.pushInt(value)
120
+ else if (value is Double) array.pushDouble(value)
121
+ else if (value is Boolean) array.pushBoolean(value)
122
+ else if (value is JSONObject) array.pushMap(convertJsonToMap(value))
123
+ else if (value is JSONArray) array.pushArray(convertJsonToArray(value))
124
+ }
125
+ return array
126
+ }
127
+
128
+ companion object {
129
+ const val NAME = "AppAmbitCms"
130
+ }
131
+ }
@@ -13,6 +13,8 @@ class AppambitPackage : BaseReactPackage() {
13
13
  AppambitModule.NAME -> AppambitModule(reactContext)
14
14
  AppambitCrashesModule.NAME -> AppambitCrashesModule(reactContext)
15
15
  AppambitAnalyticsModule.NAME -> AppambitAnalyticsModule(reactContext)
16
+ AppambitRemoteConfigModule.NAME -> AppambitRemoteConfigModule(reactContext)
17
+ AppambitCmsModule.NAME -> AppambitCmsModule(reactContext)
16
18
  else -> null
17
19
  }
18
20
  }
@@ -35,6 +37,8 @@ class AppambitPackage : BaseReactPackage() {
35
37
  addInfo(AppambitModule.NAME)
36
38
  addInfo(AppambitCrashesModule.NAME)
37
39
  addInfo(AppambitAnalyticsModule.NAME)
40
+ addInfo(AppambitRemoteConfigModule.NAME)
41
+ addInfo(AppambitCmsModule.NAME)
38
42
 
39
43
  moduleInfos
40
44
  }
@@ -0,0 +1,38 @@
1
+ package com.appambit
2
+
3
+ import com.facebook.react.bridge.ReactApplicationContext
4
+ import com.facebook.react.module.annotations.ReactModule
5
+ import com.appambit.sdk.RemoteConfig
6
+
7
+ @ReactModule(name = AppambitRemoteConfigModule.NAME)
8
+ class AppambitRemoteConfigModule(reactContext: ReactApplicationContext) :
9
+ NativeAppambitRemoteConfigSpec(reactContext) {
10
+
11
+ override fun getName(): String {
12
+ return NAME
13
+ }
14
+
15
+ override fun enable() {
16
+ RemoteConfig.enable()
17
+ }
18
+
19
+ override fun getString(key: String?): String {
20
+ return RemoteConfig.getString(key) ?: ""
21
+ }
22
+
23
+ override fun getBoolean(key: String?): Boolean {
24
+ return RemoteConfig.getBoolean(key)
25
+ }
26
+
27
+ override fun getLong(key: String?): Double {
28
+ return RemoteConfig.getLong(key).toDouble()
29
+ }
30
+
31
+ override fun getDouble(key: String?): Double {
32
+ return RemoteConfig.getDouble(key)
33
+ }
34
+
35
+ companion object {
36
+ const val NAME = "AppAmbitRemoteConfig"
37
+ }
38
+ }
@@ -0,0 +1,5 @@
1
+ #import <AppambitSpec/AppambitSpec.h>
2
+
3
+ @interface AppAmbitCms : NSObject <NativeAppambitCmsSpec>
4
+
5
+ @end
@@ -0,0 +1,185 @@
1
+ #import "AppAmbitCms.h"
2
+ #import "Appambit.h"
3
+ #import <Appambit-Swift.h>
4
+ #import <Foundation/Foundation.h>
5
+ @class CmsQueryObjC;
6
+ @interface CmsQueryObjC : NSObject
7
+ - (instancetype)search:(NSString *)query;
8
+ - (instancetype)equals:(NSString *)field value:(NSString *)value;
9
+ - (instancetype)notEquals:(NSString *)field value:(NSString *)value;
10
+ - (instancetype)contains:(NSString *)field value:(NSString *)value;
11
+ - (instancetype)startsWith:(NSString *)field value:(NSString *)value;
12
+ - (instancetype)greaterThan:(NSString *)field value:(id)value;
13
+ - (instancetype)greaterThanOrEqual:(NSString *)field value:(id)value;
14
+ - (instancetype)lessThan:(NSString *)field value:(id)value;
15
+ - (instancetype)lessThanOrEqual:(NSString *)field value:(id)value;
16
+ - (instancetype)inList:(NSString *)field values:(NSArray<NSString *> *)values;
17
+ - (instancetype)notInList:(NSString *)field values:(NSArray<NSString *> *)values;
18
+ - (instancetype)orderByAscending:(NSString *)field;
19
+ - (instancetype)orderByDescending:(NSString *)field;
20
+ - (instancetype)getPage:(NSInteger)page;
21
+ - (instancetype)getPerPage:(NSInteger)perPage;
22
+ - (void)getListWithCompletion:(void (^)(NSArray<id> *))completion;
23
+ @end
24
+
25
+ @implementation AppAmbitCms
26
+ RCT_EXPORT_MODULE(AppAmbitCms);
27
+
28
+ static NSMutableDictionary<NSString *, NSMutableArray<RCTPromiseResolveBlock> *> *pendingResolves = nil;
29
+ static NSLock *pendingLock = nil;
30
+ static NSMutableDictionary<NSString *, NSArray<id> *> *cmsCache = nil;
31
+
32
+ + (void)initialize {
33
+ if (self == [AppAmbitCms class]) {
34
+ pendingResolves = [NSMutableDictionary new];
35
+ pendingLock = [[NSLock alloc] init];
36
+ cmsCache = [NSMutableDictionary new];
37
+ }
38
+ }
39
+
40
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
41
+ (const facebook::react::ObjCTurboModule::InitParams &)params
42
+ {
43
+ return std::make_shared<facebook::react::NativeAppambitCmsSpecJSI>(params);
44
+ }
45
+
46
+ - (void)getList:(NSString *)contentType
47
+ filters:(NSArray *)filters
48
+ resolve:(RCTPromiseResolveBlock)resolve
49
+ reject:(RCTPromiseRejectBlock)reject {
50
+
51
+ NSString *cacheKey = contentType;
52
+ if (filters && [filters isKindOfClass:[NSArray class]] && filters.count > 0) {
53
+ NSData *jsonData = [NSJSONSerialization dataWithJSONObject:filters options:0 error:nil];
54
+ if (jsonData) {
55
+ NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
56
+ cacheKey = [NSString stringWithFormat:@"%@_%@", contentType, jsonString];
57
+ }
58
+ }
59
+
60
+ [pendingLock lock];
61
+
62
+ if (cmsCache[cacheKey] != nil) {
63
+ [pendingLock unlock];
64
+ resolve(cmsCache[cacheKey]);
65
+ return;
66
+ }
67
+
68
+ if (pendingResolves[cacheKey] != nil) {
69
+ [pendingResolves[cacheKey] addObject:resolve];
70
+ [pendingLock unlock];
71
+ return;
72
+ }
73
+
74
+ pendingResolves[cacheKey] = [NSMutableArray arrayWithObject:resolve];
75
+ [pendingLock unlock];
76
+
77
+ CmsQueryObjC *query = [AppAmbitSdkWrapper getCmsQueryWithContentType:contentType];
78
+
79
+ if (filters && [filters isKindOfClass:[NSArray class]]) {
80
+ for (NSDictionary *filter in filters) {
81
+ if ([filter isKindOfClass:[NSDictionary class]]) {
82
+ if (filter[@"method"]) {
83
+ NSString *method = filter[@"method"];
84
+ NSArray *args = filter[@"args"];
85
+
86
+ if (args && [args isKindOfClass:[NSArray class]]) {
87
+ if ([method isEqualToString:@"search"] && args.count > 0) {
88
+ [query search:[NSString stringWithFormat:@"%@", args[0]]];
89
+ } else if ([method isEqualToString:@"startsWith"] && args.count > 1) {
90
+ [query startsWith:[NSString stringWithFormat:@"%@", args[0]] value:[NSString stringWithFormat:@"%@", args[1]]];
91
+ } else if ([method isEqualToString:@"inList"] && args.count > 1) {
92
+ if ([args[1] isKindOfClass:[NSArray class]]) {
93
+ [query inList:[NSString stringWithFormat:@"%@", args[0]] values:(NSArray<NSString *> *)args[1]];
94
+ }
95
+ } else if ([method isEqualToString:@"notInList"] && args.count > 1) {
96
+ if ([args[1] isKindOfClass:[NSArray class]]) {
97
+ [query notInList:[NSString stringWithFormat:@"%@", args[0]] values:(NSArray<NSString *> *)args[1]];
98
+ }
99
+ } else if ([method isEqualToString:@"orderByAscending"] && args.count > 0) {
100
+ [query orderByAscending:[NSString stringWithFormat:@"%@", args[0]]];
101
+ } else if ([method isEqualToString:@"orderByDescending"] && args.count > 0) {
102
+ [query orderByDescending:[NSString stringWithFormat:@"%@", args[0]]];
103
+ } else if ([method isEqualToString:@"getPage"] && args.count > 0) {
104
+ [query getPage:[args[0] intValue]];
105
+ } else if ([method isEqualToString:@"getPerPage"] && args.count > 0) {
106
+ [query getPerPage:[args[0] intValue]];
107
+ }
108
+ }
109
+ } else if (filter[@"field"] && filter[@"operator"]) {
110
+ NSString *field = filter[@"field"];
111
+ NSString *op = filter[@"operator"];
112
+ id value = filter[@"value"];
113
+
114
+ if (value) {
115
+ if ([value isKindOfClass:[NSNumber class]]) {
116
+ NSNumber *numValue = (NSNumber *)value;
117
+ if ([op isEqualToString:@">"]) {
118
+ [query greaterThan:field value:numValue];
119
+ } else if ([op isEqualToString:@">="]) {
120
+ [query greaterThanOrEqual:field value:numValue];
121
+ } else if ([op isEqualToString:@"<"]) {
122
+ [query lessThan:field value:numValue];
123
+ } else if ([op isEqualToString:@"<="]) {
124
+ [query lessThanOrEqual:field value:numValue];
125
+ } else if ([op isEqualToString:@"="]) {
126
+ [query equals:field value:[numValue stringValue]];
127
+ } else if ([op isEqualToString:@"!="]) {
128
+ [query notEquals:field value:[numValue stringValue]];
129
+ }
130
+ } else {
131
+ NSString *strValue = [NSString stringWithFormat:@"%@", value];
132
+ if ([op isEqualToString:@"="]) {
133
+ [query equals:field value:strValue];
134
+ } else if ([op isEqualToString:@"!="]) {
135
+ [query notEquals:field value:strValue];
136
+ } else if ([op isEqualToString:@"LIKE"]) {
137
+ [query contains:field value:strValue];
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ [query getListWithCompletion:^(NSArray<id> * _Nonnull items) {
147
+ [pendingLock lock];
148
+
149
+ if (items) {
150
+ cmsCache[cacheKey] = items;
151
+ }
152
+
153
+ NSArray<RCTPromiseResolveBlock> *resolves = pendingResolves[cacheKey];
154
+ [pendingResolves removeObjectForKey:cacheKey];
155
+ [pendingLock unlock];
156
+
157
+ for (RCTPromiseResolveBlock res in resolves) {
158
+ res(items);
159
+ }
160
+ }];
161
+ }
162
+
163
+ - (void)clearCache:(NSString *)contentType {
164
+ [pendingLock lock];
165
+ NSMutableArray *keysToRemove = [NSMutableArray new];
166
+ for (NSString *key in cmsCache.allKeys) {
167
+ if ([key isEqualToString:contentType] || [key hasPrefix:[NSString stringWithFormat:@"%@_", contentType]]) {
168
+ [keysToRemove addObject:key];
169
+ }
170
+ }
171
+ [cmsCache removeObjectsForKeys:keysToRemove];
172
+ [pendingLock unlock];
173
+
174
+ [AppAmbitSdkWrapper clearCmsCacheWithContentType:contentType];
175
+ }
176
+
177
+ - (void)clearAllCache {
178
+ [pendingLock lock];
179
+ [cmsCache removeAllObjects];
180
+ [pendingLock unlock];
181
+
182
+ [AppAmbitSdkWrapper clearAllCmsCache];
183
+ }
184
+
185
+ @end
@@ -0,0 +1,5 @@
1
+ #import <AppambitSpec/AppambitSpec.h>
2
+
3
+ @interface AppAmbitRemoteConfig : NSObject <NativeAppambitRemoteConfigSpec>
4
+
5
+ @end
@@ -0,0 +1,33 @@
1
+ #import "AppAmbitRemoteConfig.h"
2
+ #import <Appambit-Swift.h>
3
+
4
+ @implementation AppAmbitRemoteConfig
5
+ RCT_EXPORT_MODULE(AppAmbitRemoteConfig);
6
+
7
+ - (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
8
+ (const facebook::react::ObjCTurboModule::InitParams &)params
9
+ {
10
+ return std::make_shared<facebook::react::NativeAppambitRemoteConfigSpecJSI>(params);
11
+ }
12
+
13
+ - (void)enable {
14
+ [AppAmbitSdkWrapper enableRemoteConfig];
15
+ }
16
+
17
+ - (nonnull NSString *)getString:(nonnull NSString *)key {
18
+ return [AppAmbitSdkWrapper getRemoteConfigStringWithKey:key];
19
+ }
20
+
21
+ - (NSNumber *)getBoolean:(NSString *)key {
22
+ return @([AppAmbitSdkWrapper getRemoteConfigBooleanWithKey:key]);
23
+ }
24
+
25
+ - (NSNumber *)getLong:(NSString *)key {
26
+ return @([AppAmbitSdkWrapper getRemoteConfigLongWithKey:key]);
27
+ }
28
+
29
+ - (NSNumber *)getDouble:(NSString *)key {
30
+ return @([AppAmbitSdkWrapper getRemoteConfigDoubleWithKey:key]);
31
+ }
32
+
33
+ @end
@@ -1,5 +1,5 @@
1
1
  import Foundation
2
- import AppAmbitSdk
2
+ import AppAmbit
3
3
 
4
4
  @objc(AppAmbitSdkWrapper)
5
5
  public class AppAmbitSDKWrapper: NSObject {
@@ -82,4 +82,50 @@ public class AppAmbitSDKWrapper: NSObject {
82
82
  Crashes.logError(exception: exception, properties: properties)
83
83
  }
84
84
 
85
+ // MARK: - RemoteConfig
86
+ @objc
87
+ public static func enableRemoteConfig() {
88
+ RemoteConfig.enable()
89
+ }
90
+
91
+ @objc
92
+ public static func getRemoteConfigString(key: String) -> String {
93
+ return RemoteConfig.getString(key)
94
+ }
95
+
96
+ @objc
97
+ public static func getRemoteConfigBoolean(key: String) -> Bool {
98
+ return RemoteConfig.getBoolean(key)
99
+ }
100
+
101
+ @objc
102
+ public static func getRemoteConfigLong(key: String) -> Int64 {
103
+ return RemoteConfig.getLong(key)
104
+ }
105
+
106
+ @objc
107
+ public static func getRemoteConfigDouble(key: String) -> Double {
108
+ return RemoteConfig.getDouble(key)
109
+ }
110
+
111
+ // MARK: - CMS
112
+ @objc
113
+ public static func clearCmsCache(contentType: String) {
114
+ Task {
115
+ await Cms.clearCache(contentType)
116
+ }
117
+ }
118
+
119
+ @objc
120
+ public static func clearAllCmsCache() {
121
+ Task {
122
+ await Cms.clearAllCache()
123
+ }
124
+ }
125
+
126
+ @objc
127
+ public static func getCmsQuery(contentType: String) -> CmsQueryObjC {
128
+ return Cms.contentTypelessObjC(contentType)
129
+ }
130
+
85
131
  }
package/ios/Appambit.h CHANGED
@@ -11,3 +11,7 @@
11
11
  @interface AppAmbitAnalytics : NSObject <NativeAppambitAnalyticsSpec>
12
12
 
13
13
  @end
14
+
15
+ @interface AppAmbitRemoteConfig : NSObject <NativeAppambitRemoteConfigSpec>
16
+
17
+ @end
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appambit",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Lightweight SDK for analytics, events, logging, crashes, and offline support. Simple setup, minimal overhead.",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -0,0 +1,114 @@
1
+ import NativeAppambitCms from './NativeAppambitCms';
2
+
3
+ export class CmsQuery {
4
+ private contentType: string;
5
+ private filters: any[] = [];
6
+
7
+ constructor(contentType: string) {
8
+ this.contentType = contentType;
9
+ }
10
+
11
+ private addFilter(field: string, operator: string, value: any) {
12
+ this.filters.push({ field, operator, value });
13
+ }
14
+
15
+ search(query: string): this {
16
+ this.filters.push({ method: 'search', args: [query] });
17
+ return this;
18
+ }
19
+
20
+ equals(field: string, value: string): this {
21
+ this.addFilter(field, '=', value);
22
+ return this;
23
+ }
24
+
25
+ notEquals(field: string, value: string): this {
26
+ this.addFilter(field, '!=', value);
27
+ return this;
28
+ }
29
+
30
+ contains(field: string, value: string): this {
31
+ this.addFilter(field, 'LIKE', value);
32
+ return this;
33
+ }
34
+
35
+ startsWith(field: string, value: string): this {
36
+ this.filters.push({ method: 'startsWith', args: [field, value] });
37
+ return this;
38
+ }
39
+
40
+ greaterThan(field: string, value: number): this {
41
+ this.addFilter(field, '>', value);
42
+ return this;
43
+ }
44
+
45
+ greaterThanOrEqual(field: string, value: number): this {
46
+ this.addFilter(field, '>=', value);
47
+ return this;
48
+ }
49
+
50
+ lessThan(field: string, value: number): this {
51
+ this.addFilter(field, '<', value);
52
+ return this;
53
+ }
54
+
55
+ lessThanOrEqual(field: string, value: number): this {
56
+ this.addFilter(field, '<=', value);
57
+ return this;
58
+ }
59
+
60
+ inList(field: string, values: string[]): this {
61
+ this.filters.push({ method: 'inList', args: [field, values] });
62
+ return this;
63
+ }
64
+
65
+ notInList(field: string, values: string[]): this {
66
+ this.filters.push({ method: 'notInList', args: [field, values] });
67
+ return this;
68
+ }
69
+
70
+ orderByAscending(field: string): this {
71
+ this.filters.push({ method: 'orderByAscending', args: [field] });
72
+ return this;
73
+ }
74
+
75
+ orderByDescending(field: string): this {
76
+ this.filters.push({ method: 'orderByDescending', args: [field] });
77
+ return this;
78
+ }
79
+
80
+ getPage(page: number): this {
81
+ this.filters.push({ method: 'getPage', args: [page] });
82
+ return this;
83
+ }
84
+
85
+ getPerPage(perPage: number): this {
86
+ this.filters.push({ method: 'getPerPage', args: [perPage] });
87
+ return this;
88
+ }
89
+
90
+ async getList(): Promise<any[]> {
91
+ const hasPagination = this.filters.some(f => f.method === 'getPage' || f.method === 'getPerPage');
92
+ const finalFilters = hasPagination
93
+ ? this.filters
94
+ : [...this.filters, { method: 'getPerPage', args: [-1] }];
95
+
96
+ return NativeAppambitCms.getList(this.contentType, finalFilters);
97
+ }
98
+ }
99
+
100
+ export class Cms {
101
+ content(contentType: string): CmsQuery {
102
+ return new CmsQuery(contentType);
103
+ }
104
+
105
+ clearCache(contentType: string): void {
106
+ NativeAppambitCms.clearCache(contentType);
107
+ }
108
+
109
+ clearAllCache(): void {
110
+ NativeAppambitCms.clearAllCache();
111
+ }
112
+ }
113
+
114
+ export const AppAmbitCms = new Cms();
@@ -0,0 +1,9 @@
1
+ import { TurboModuleRegistry, type TurboModule } from 'react-native';
2
+
3
+ export interface Spec extends TurboModule {
4
+ getList(contentType: string, filters: Object[]): Promise<any[]>;
5
+ clearCache(contentType: string): void;
6
+ clearAllCache(): void;
7
+ }
8
+
9
+ export default TurboModuleRegistry.getEnforcing<Spec>('AppAmbitCms');
@@ -0,0 +1,11 @@
1
+ import { TurboModuleRegistry, type TurboModule } from 'react-native';
2
+
3
+ export interface Spec extends TurboModule {
4
+ enable(): void;
5
+ getString(key: string): string;
6
+ getBoolean(key: string): boolean;
7
+ getLong(key: string): number;
8
+ getDouble(key: string): number;
9
+ }
10
+
11
+ export default TurboModuleRegistry.getEnforcing<Spec>('AppAmbitRemoteConfig');
package/src/index.tsx CHANGED
@@ -1,6 +1,8 @@
1
1
  import Appambit from './NativeAppambitCore';
2
2
  import AppambitAnalytics from './NativeAppambitAnalytics';
3
3
  import AppambitCrashes from './NativeAppambitCrashes';
4
+ import AppambitRemoteConfig from './NativeAppambitRemoteConfig';
5
+ import { AppAmbitCms } from './CmsQuery';
4
6
  import type { NavigationContainerRefWithCurrent } from '@react-navigation/native';
5
7
  import { Platform } from 'react-native';
6
8
 
@@ -23,6 +25,11 @@ export function registerNavigationTracking(
23
25
 
24
26
  let lastTrackedKey: string | null = null;
25
27
  let lastTrackedName: string | null = null;
28
+ let isInitializing = true;
29
+
30
+ setTimeout(() => {
31
+ isInitializing = false;
32
+ }, 2500);
26
33
 
27
34
  const onStateChange = () => {
28
35
  if (!navigationRef.isReady()) return;
@@ -30,16 +37,28 @@ export function registerNavigationTracking(
30
37
  const route = navigationRef.getCurrentRoute();
31
38
  if (!route || route.key === lastTrackedKey) return;
32
39
 
33
- if (lastTrackedName) {
34
- addBreadcrumb(`On disappear: ${lastTrackedName}`);
35
- }
36
-
37
- addBreadcrumb(`On appear: ${route.name}`);
40
+ const currentName = route.name;
41
+ const prevName = lastTrackedName;
38
42
 
39
43
  lastTrackedKey = route.key;
40
- lastTrackedName = route.name;
44
+ lastTrackedName = currentName;
45
+
46
+ const sendBreadcrumbs = () => {
47
+ if (prevName) {
48
+ addBreadcrumb(`On disappear: ${prevName}`);
49
+ }
50
+ addBreadcrumb(`On appear: ${currentName}`);
51
+ };
52
+
53
+ if (isInitializing) {
54
+ setTimeout(sendBreadcrumbs, 3000);
55
+ } else {
56
+ sendBreadcrumbs();
57
+ }
41
58
  };
42
59
 
60
+ onStateChange();
61
+
43
62
  return navigationRef.addListener("state", onStateChange);
44
63
  }
45
64
 
@@ -99,6 +118,34 @@ export function generateTestCrash(): void {
99
118
  AppambitCrashes.generateTestCrash();
100
119
  }
101
120
 
121
+ // RemoteConfig methods
122
+
123
+ export function enableConfig(): void {
124
+ AppambitRemoteConfig.enable();
125
+ }
126
+
127
+ export function getString(key: string): string {
128
+ return AppambitRemoteConfig.getString(key);
129
+ }
130
+
131
+ export function getBoolean(key: string): boolean {
132
+ return AppambitRemoteConfig.getBoolean(key);
133
+ }
134
+
135
+ export function getLong(key: string): number {
136
+ return AppambitRemoteConfig.getLong(key);
137
+ }
138
+
139
+ export function getDouble(key: string): number {
140
+ return AppambitRemoteConfig.getDouble(key);
141
+ }
142
+
143
+ export { AppAmbitCms };
144
+
145
+ export function cms() {
146
+ return AppAmbitCms;
147
+ }
148
+
102
149
  export function logErrorMessage(message: string, properties?: Record<string, string>): void {
103
150
  AppambitCrashes.logErrorMessage(message, properties);
104
151
  }
@@ -121,15 +168,15 @@ export async function logError({
121
168
  message && message.length > 0
122
169
  ? message
123
170
  : exception
124
- ? exception.message || JSON.stringify(exception)
125
- : "UnknownError";
171
+ ? exception.message || JSON.stringify(exception)
172
+ : "UnknownError";
126
173
 
127
174
  const stackStr =
128
175
  stack && stack.length > 0
129
176
  ? stack
130
177
  : exception?.stack
131
- ? exception.stack.toString()
132
- : new Error().stack?.toString();
178
+ ? exception.stack.toString()
179
+ : new Error().stack?.toString();
133
180
 
134
181
  const payload: Record<string, any> = {};
135
182
 
@@ -139,7 +186,7 @@ export async function logError({
139
186
  payload.properties = properties;
140
187
  if (classFqn) payload.classFqn = classFqn;
141
188
  if (fileName) payload.fileName = fileName;
142
-
189
+
143
190
  if (typeof lineNumber === 'number' && !isNaN(lineNumber) && isFinite(lineNumber)) {
144
191
  payload.lineNumber = lineNumber;
145
192
  }
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- import { TurboModuleRegistry } from 'react-native';
4
- export default TurboModuleRegistry.getEnforcing('AppAmbitAnalytics');
5
- //# sourceMappingURL=NativeAppambitAnalytics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeAppambitAnalytics.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAapE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,mBAAmB,CAAC","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- import { TurboModuleRegistry } from 'react-native';
4
- export default TurboModuleRegistry.getEnforcing('AppAmbitCore');
5
- //# sourceMappingURL=NativeAppambitCore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeAppambitCore.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAOpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,cAAc,CAAC","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- import { TurboModuleRegistry } from 'react-native';
4
- export default TurboModuleRegistry.getEnforcing('AppAmbitCrashes');
5
- //# sourceMappingURL=NativeAppambitCrashes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeAppambitCrashes.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAA0B,cAAc;AAsBpE,eAAeA,mBAAmB,CAACC,YAAY,CAAO,iBAAiB,CAAC","ignoreList":[]}
@@ -1,126 +0,0 @@
1
- "use strict";
2
-
3
- import Appambit from "./NativeAppambitCore.js";
4
- import AppambitAnalytics from "./NativeAppambitAnalytics.js";
5
- import AppambitCrashes from "./NativeAppambitCrashes.js";
6
- import { Platform } from 'react-native';
7
- export function registerNavigationTracking(navigationRef) {
8
- if (Platform.OS !== 'android') {
9
- return () => {};
10
- }
11
- let lastTrackedKey = null;
12
- let lastTrackedName = null;
13
- const onStateChange = () => {
14
- if (!navigationRef.isReady()) return;
15
- const route = navigationRef.getCurrentRoute();
16
- if (!route || route.key === lastTrackedKey) return;
17
- if (lastTrackedName) {
18
- addBreadcrumb(`On disappear: ${lastTrackedName}`);
19
- }
20
- addBreadcrumb(`On appear: ${route.name}`);
21
- lastTrackedKey = route.key;
22
- lastTrackedName = route.name;
23
- };
24
- return navigationRef.addListener("state", onStateChange);
25
- }
26
-
27
- // Start the Appambit SDK with the provided app key
28
-
29
- export function start(appkey) {
30
- Appambit.start(appkey);
31
- }
32
-
33
- // Breadcrumbs
34
-
35
- export function addBreadcrumb(name) {
36
- Appambit.addBreadcrumb(name);
37
- }
38
-
39
- // Analytics methods
40
-
41
- export function setUserId(userId) {
42
- AppambitAnalytics.setUserId(userId);
43
- }
44
- export function setUserEmail(userEmail) {
45
- AppambitAnalytics.setUserEmail(userEmail);
46
- }
47
- export function clearToken() {
48
- AppambitAnalytics.clearToken();
49
- }
50
- export function startSession() {
51
- AppambitAnalytics.startSession();
52
- }
53
- export function endSession() {
54
- AppambitAnalytics.endSession();
55
- }
56
- export function enableManualSession() {
57
- AppambitAnalytics.enableManualSession();
58
- }
59
- export function trackEvent(eventTitle, properties) {
60
- AppambitAnalytics.trackEvent(eventTitle, properties);
61
- }
62
- export function generateTestEvent() {
63
- AppambitAnalytics.generateTestEvent();
64
- }
65
-
66
- // Crashes methods
67
-
68
- export function didCrashInLastSession() {
69
- return AppambitCrashes.didCrashInLastSession();
70
- }
71
- export function generateTestCrash() {
72
- AppambitCrashes.generateTestCrash();
73
- }
74
- export function logErrorMessage(message, properties) {
75
- AppambitCrashes.logErrorMessage(message, properties);
76
- }
77
- export async function logError({
78
- message,
79
- exception,
80
- stack,
81
- classFqn,
82
- fileName,
83
- lineNumber,
84
- properties
85
- }) {
86
- if (!AppambitCrashes) {
87
- console.warn('AppAmbitCrashes not registered');
88
- return;
89
- }
90
- const messageStr = message && message.length > 0 ? message : exception ? exception.message || JSON.stringify(exception) : "UnknownError";
91
- const stackStr = stack && stack.length > 0 ? stack : exception?.stack ? exception.stack.toString() : new Error().stack?.toString();
92
- const payload = {};
93
- if (messageStr) payload.message = messageStr;
94
- if (stackStr) payload.stack = stackStr;
95
- if (properties && Object.keys(properties).length > 0) payload.properties = properties;
96
- if (classFqn) payload.classFqn = classFqn;
97
- if (fileName) payload.fileName = fileName;
98
- if (typeof lineNumber === 'number' && !isNaN(lineNumber) && isFinite(lineNumber)) {
99
- payload.lineNumber = lineNumber;
100
- }
101
- if (Object.keys(payload).length === 0) return;
102
- const userProvidedMessage = !!message && message.length > 0;
103
- if (userProvidedMessage) {
104
- AppambitCrashes.logErrorMessage(message, properties);
105
- } else if (exception || stackStr && stackStr.length > 0) {
106
- AppambitCrashes.logError(payload);
107
- }
108
- }
109
- ErrorUtils.setGlobalHandler(error => {
110
- const hasMessage = typeof error?.message === "string" && error.message.trim().length > 0;
111
- if (hasMessage) {
112
- logError({
113
- exception: error,
114
- message: error.message,
115
- stack: error.stack,
116
- classFqn: error.constructor?.name
117
- });
118
- } else {
119
- logError({
120
- exception: error,
121
- stack: error.stack,
122
- classFqn: error.constructor?.name
123
- });
124
- }
125
- });
126
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["Appambit","AppambitAnalytics","AppambitCrashes","Platform","registerNavigationTracking","navigationRef","OS","lastTrackedKey","lastTrackedName","onStateChange","isReady","route","getCurrentRoute","key","addBreadcrumb","name","addListener","start","appkey","setUserId","userId","setUserEmail","userEmail","clearToken","startSession","endSession","enableManualSession","trackEvent","eventTitle","properties","generateTestEvent","didCrashInLastSession","generateTestCrash","logErrorMessage","message","logError","exception","stack","classFqn","fileName","lineNumber","console","warn","messageStr","length","JSON","stringify","stackStr","toString","Error","payload","Object","keys","isNaN","isFinite","userProvidedMessage","ErrorUtils","setGlobalHandler","error","hasMessage","trim","constructor"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,QAAQ,MAAM,yBAAsB;AAC3C,OAAOC,iBAAiB,MAAM,8BAA2B;AACzD,OAAOC,eAAe,MAAM,4BAAyB;AAErD,SAASC,QAAQ,QAAQ,cAAc;AAYvC,OAAO,SAASC,0BAA0BA,CACxCC,aAAqD,EACrD;EACA,IAAIF,QAAQ,CAACG,EAAE,KAAK,SAAS,EAAE;IAC7B,OAAO,MAAM,CAAC,CAAC;EACjB;EAEA,IAAIC,cAA6B,GAAG,IAAI;EACxC,IAAIC,eAA8B,GAAG,IAAI;EAEzC,MAAMC,aAAa,GAAGA,CAAA,KAAM;IAC1B,IAAI,CAACJ,aAAa,CAACK,OAAO,CAAC,CAAC,EAAE;IAE9B,MAAMC,KAAK,GAAGN,aAAa,CAACO,eAAe,CAAC,CAAC;IAC7C,IAAI,CAACD,KAAK,IAAIA,KAAK,CAACE,GAAG,KAAKN,cAAc,EAAE;IAE5C,IAAIC,eAAe,EAAE;MACnBM,aAAa,CAAC,iBAAiBN,eAAe,EAAE,CAAC;IACnD;IAEAM,aAAa,CAAC,cAAcH,KAAK,CAACI,IAAI,EAAE,CAAC;IAEzCR,cAAc,GAAGI,KAAK,CAACE,GAAG;IAC1BL,eAAe,GAAGG,KAAK,CAACI,IAAI;EAC9B,CAAC;EAED,OAAOV,aAAa,CAACW,WAAW,CAAC,OAAO,EAAEP,aAAa,CAAC;AAC1D;;AAEA;;AAEA,OAAO,SAASQ,KAAKA,CAACC,MAAc,EAAQ;EAC1ClB,QAAQ,CAACiB,KAAK,CAACC,MAAM,CAAC;AACxB;;AAEA;;AAEA,OAAO,SAASJ,aAAaA,CAACC,IAAY,EAAQ;EAChDf,QAAQ,CAACc,aAAa,CAACC,IAAI,CAAC;AAC9B;;AAEA;;AAEA,OAAO,SAASI,SAASA,CAACC,MAAc,EAAQ;EAC9CnB,iBAAiB,CAACkB,SAAS,CAACC,MAAM,CAAC;AACrC;AAEA,OAAO,SAASC,YAAYA,CAACC,SAAiB,EAAQ;EACpDrB,iBAAiB,CAACoB,YAAY,CAACC,SAAS,CAAC;AAC3C;AAEA,OAAO,SAASC,UAAUA,CAAA,EAAS;EACjCtB,iBAAiB,CAACsB,UAAU,CAAC,CAAC;AAChC;AAEA,OAAO,SAASC,YAAYA,CAAA,EAAS;EACnCvB,iBAAiB,CAACuB,YAAY,CAAC,CAAC;AAClC;AAEA,OAAO,SAASC,UAAUA,CAAA,EAAS;EACjCxB,iBAAiB,CAACwB,UAAU,CAAC,CAAC;AAChC;AAEA,OAAO,SAASC,mBAAmBA,CAAA,EAAS;EAC1CzB,iBAAiB,CAACyB,mBAAmB,CAAC,CAAC;AACzC;AAEA,OAAO,SAASC,UAAUA,CAACC,UAAkB,EAAEC,UAAmC,EAAQ;EACxF5B,iBAAiB,CAAC0B,UAAU,CAACC,UAAU,EAAEC,UAAU,CAAC;AACtD;AAEA,OAAO,SAASC,iBAAiBA,CAAA,EAAS;EACxC7B,iBAAiB,CAAC6B,iBAAiB,CAAC,CAAC;AACvC;;AAEA;;AAEA,OAAO,SAASC,qBAAqBA,CAAA,EAAqB;EACxD,OAAO7B,eAAe,CAAC6B,qBAAqB,CAAC,CAAC;AAChD;AAEA,OAAO,SAASC,iBAAiBA,CAAA,EAAS;EACxC9B,eAAe,CAAC8B,iBAAiB,CAAC,CAAC;AACrC;AAEA,OAAO,SAASC,eAAeA,CAACC,OAAe,EAAEL,UAAmC,EAAQ;EAC1F3B,eAAe,CAAC+B,eAAe,CAACC,OAAO,EAAEL,UAAU,CAAC;AACtD;AAEA,OAAO,eAAeM,QAAQA,CAAC;EAC7BD,OAAO;EACPE,SAAS;EACTC,KAAK;EACLC,QAAQ;EACRC,QAAQ;EACRC,UAAU;EACVX;AACc,CAAC,EAAiB;EAChC,IAAI,CAAC3B,eAAe,EAAE;IACpBuC,OAAO,CAACC,IAAI,CAAC,gCAAgC,CAAC;IAC9C;EACF;EAEA,MAAMC,UAAU,GACdT,OAAO,IAAIA,OAAO,CAACU,MAAM,GAAG,CAAC,GACzBV,OAAO,GACPE,SAAS,GACTA,SAAS,CAACF,OAAO,IAAIW,IAAI,CAACC,SAAS,CAACV,SAAS,CAAC,GAC9C,cAAc;EAEpB,MAAMW,QAAQ,GACZV,KAAK,IAAIA,KAAK,CAACO,MAAM,GAAG,CAAC,GACrBP,KAAK,GACLD,SAAS,EAAEC,KAAK,GAChBD,SAAS,CAACC,KAAK,CAACW,QAAQ,CAAC,CAAC,GAC1B,IAAIC,KAAK,CAAC,CAAC,CAACZ,KAAK,EAAEW,QAAQ,CAAC,CAAC;EAEnC,MAAME,OAA4B,GAAG,CAAC,CAAC;EAEvC,IAAIP,UAAU,EAAEO,OAAO,CAAChB,OAAO,GAAGS,UAAU;EAC5C,IAAII,QAAQ,EAAEG,OAAO,CAACb,KAAK,GAAGU,QAAQ;EACtC,IAAIlB,UAAU,IAAIsB,MAAM,CAACC,IAAI,CAACvB,UAAU,CAAC,CAACe,MAAM,GAAG,CAAC,EAClDM,OAAO,CAACrB,UAAU,GAAGA,UAAU;EACjC,IAAIS,QAAQ,EAAEY,OAAO,CAACZ,QAAQ,GAAGA,QAAQ;EACzC,IAAIC,QAAQ,EAAEW,OAAO,CAACX,QAAQ,GAAGA,QAAQ;EAEzC,IAAI,OAAOC,UAAU,KAAK,QAAQ,IAAI,CAACa,KAAK,CAACb,UAAU,CAAC,IAAIc,QAAQ,CAACd,UAAU,CAAC,EAAE;IAChFU,OAAO,CAACV,UAAU,GAAGA,UAAU;EACjC;EAEA,IAAIW,MAAM,CAACC,IAAI,CAACF,OAAO,CAAC,CAACN,MAAM,KAAK,CAAC,EAAE;EAEvC,MAAMW,mBAAmB,GAAG,CAAC,CAACrB,OAAO,IAAIA,OAAO,CAACU,MAAM,GAAG,CAAC;EAE3D,IAAIW,mBAAmB,EAAE;IACvBrD,eAAe,CAAC+B,eAAe,CAACC,OAAO,EAAEL,UAAU,CAAC;EACtD,CAAC,MAAM,IAAIO,SAAS,IAAKW,QAAQ,IAAIA,QAAQ,CAACH,MAAM,GAAG,CAAE,EAAE;IACzD1C,eAAe,CAACiC,QAAQ,CAACe,OAAO,CAAC;EACnC;AACF;AAEAM,UAAU,CAACC,gBAAgB,CAAEC,KAAK,IAAK;EACrC,MAAMC,UAAU,GAAG,OAAOD,KAAK,EAAExB,OAAO,KAAK,QAAQ,IAAIwB,KAAK,CAACxB,OAAO,CAAC0B,IAAI,CAAC,CAAC,CAAChB,MAAM,GAAG,CAAC;EAExF,IAAIe,UAAU,EAAE;IACdxB,QAAQ,CAAC;MACPC,SAAS,EAAEsB,KAAK;MAChBxB,OAAO,EAAEwB,KAAK,CAACxB,OAAO;MACtBG,KAAK,EAAEqB,KAAK,CAACrB,KAAK;MAClBC,QAAQ,EAAEoB,KAAK,CAACG,WAAW,EAAE9C;IAC/B,CAAC,CAAC;EACJ,CAAC,MAAM;IACLoB,QAAQ,CAAC;MACPC,SAAS,EAAEsB,KAAK;MAChBrB,KAAK,EAAEqB,KAAK,CAACrB,KAAK;MAClBC,QAAQ,EAAEoB,KAAK,CAACG,WAAW,EAAE9C;IAC/B,CAAC,CAAC;EACJ;AACF,CAAC,CAAC","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"type":"module"}
@@ -1,2 +0,0 @@
1
- export default function App(): import("react/jsx-runtime").JSX.Element;
2
- //# sourceMappingURL=App.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../appambit_test_app/src/App.tsx"],"names":[],"mappings":"AA4CA,MAAM,CAAC,OAAO,UAAU,GAAG,4CAmB1B"}
@@ -1,8 +0,0 @@
1
- import { type GestureResponderEvent } from "react-native";
2
- interface Props {
3
- title: string;
4
- onPress: (event: GestureResponderEvent) => void;
5
- }
6
- export default function CustomButton({ title, onPress }: Props): import("react/jsx-runtime").JSX.Element;
7
- export {};
8
- //# sourceMappingURL=CustomButton.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CustomButton.d.ts","sourceRoot":"","sources":["../../../../../appambit_test_app/src/components/CustomButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAEvF,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,2CAM7D"}
@@ -1,10 +0,0 @@
1
- import React from 'react';
2
- interface CustomInputProps {
3
- placeholder: string;
4
- buttonLabel: string;
5
- defaultValue: string;
6
- onSubmit: (value: string) => void;
7
- }
8
- declare const CustomInput: React.FC<CustomInputProps>;
9
- export default CustomInput;
10
- //# sourceMappingURL=CustomInput.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CustomInput.d.ts","sourceRoot":"","sources":["../../../../../appambit_test_app/src/components/CustomInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAc3C,CAAC;AAmBF,eAAe,WAAW,CAAC"}
@@ -1,2 +0,0 @@
1
- export default function AnalyticsScreen(): import("react/jsx-runtime").JSX.Element;
2
- //# sourceMappingURL=AnalyticsScreen.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AnalyticsScreen.d.ts","sourceRoot":"","sources":["../../../../../appambit_test_app/src/screens/AnalyticsScreen.tsx"],"names":[],"mappings":"AAKA,MAAM,CAAC,OAAO,UAAU,eAAe,4CAgItC"}
@@ -1,2 +0,0 @@
1
- export default function CrashesScreen(): import("react/jsx-runtime").JSX.Element;
2
- //# sourceMappingURL=CrashesScreen.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CrashesScreen.d.ts","sourceRoot":"","sources":["../../../../../appambit_test_app/src/screens/CrashesScreen.tsx"],"names":[],"mappings":"AAeA,MAAM,CAAC,OAAO,UAAU,aAAa,4CAwEpC"}
@@ -1,9 +0,0 @@
1
- import { type NativeStackScreenProps } from "@react-navigation/native-stack";
2
- type RootStackParamList = {
3
- HomeScreen: undefined;
4
- SecondScreen: undefined;
5
- };
6
- type Props = NativeStackScreenProps<RootStackParamList, "SecondScreen">;
7
- export default function SecondScreen({ navigation }: Props): import("react/jsx-runtime").JSX.Element;
8
- export {};
9
- //# sourceMappingURL=SecondScreen.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SecondScreen.d.ts","sourceRoot":"","sources":["../../../../../appambit_test_app/src/screens/SecondScreen.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE7E,KAAK,kBAAkB,GAAG;IACxB,UAAU,EAAE,SAAS,CAAC;IACtB,YAAY,EAAE,SAAS,CAAC;CACzB,CAAC;AAEF,KAAK,KAAK,GAAG,sBAAsB,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;AAExE,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,UAAU,EAAE,EAAE,KAAK,2CAazD"}
@@ -1,2 +0,0 @@
1
- export declare function uuidv4(): string;
2
- //# sourceMappingURL=uuid.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../../../../appambit_test_app/src/utils/uuid.tsx"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,IAAI,MAAM,CAM/B"}
@@ -1 +0,0 @@
1
- {"type":"module"}
@@ -1,14 +0,0 @@
1
- import { type TurboModule } from 'react-native';
2
- export interface Spec extends TurboModule {
3
- setUserId(userId: string): void;
4
- setUserEmail(email: string): void;
5
- clearToken(): void;
6
- startSession(): void;
7
- endSession(): void;
8
- enableManualSession(): void;
9
- trackEvent(eventTitle: string, properties?: Object): void;
10
- generateTestEvent(): void;
11
- }
12
- declare const _default: Spec;
13
- export default _default;
14
- //# sourceMappingURL=NativeAppambitAnalytics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NativeAppambitAnalytics.d.ts","sourceRoot":"","sources":["../../../src/NativeAppambitAnalytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACrC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,IAAI,IAAI,CAAC;IACnB,YAAY,IAAI,IAAI,CAAC;IACrB,UAAU,IAAI,IAAI,CAAC;IACnB,mBAAmB,IAAI,IAAI,CAAC;IAC5B,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D,iBAAiB,IAAI,IAAI,CAAC;CAC7B;;AAED,wBAA2E"}
@@ -1,8 +0,0 @@
1
- import { type TurboModule } from 'react-native';
2
- export interface Spec extends TurboModule {
3
- start(appkey: string): void;
4
- addBreadcrumb(name: string): void;
5
- }
6
- declare const _default: Spec;
7
- export default _default;
8
- //# sourceMappingURL=NativeAppambitCore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NativeAppambitCore.d.ts","sourceRoot":"","sources":["../../../src/NativeAppambitCore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;;AAED,wBAAsE"}
@@ -1,23 +0,0 @@
1
- import { type TurboModule } from 'react-native';
2
- export interface Spec extends TurboModule {
3
- generateTestCrash(): void;
4
- didCrashInLastSession(): Promise<boolean>;
5
- logErrorMessage(message: string, properties?: {
6
- [key: string]: string;
7
- }): void;
8
- logError(payload: ErrorPayload): void;
9
- }
10
- interface ErrorPayload {
11
- exception?: Object;
12
- message?: string;
13
- stack?: string;
14
- classFqn?: string;
15
- fileName?: string;
16
- lineNumber?: number;
17
- properties?: {
18
- [key: string]: string;
19
- };
20
- }
21
- declare const _default: Spec;
22
- export default _default;
23
- //# sourceMappingURL=NativeAppambitCrashes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"NativeAppambitCrashes.d.ts","sourceRoot":"","sources":["../../../src/NativeAppambitCrashes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,WAAW,IAAK,SAAQ,WAAW;IACrC,iBAAiB,IAAI,IAAI,CAAC;IAC1B,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,eAAe,CACX,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GACvC,IAAI,CAAC;IACR,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CACzC;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACxC;;AAED,wBAAyE"}
@@ -1,27 +0,0 @@
1
- import type { NavigationContainerRefWithCurrent } from '@react-navigation/native';
2
- type LogErrorParams = {
3
- exception?: any;
4
- message?: string;
5
- stack?: string;
6
- classFqn?: string;
7
- fileName?: string;
8
- lineNumber?: number;
9
- properties?: Record<string, string>;
10
- };
11
- export declare function registerNavigationTracking(navigationRef: NavigationContainerRefWithCurrent<any>): () => void;
12
- export declare function start(appkey: string): void;
13
- export declare function addBreadcrumb(name: string): void;
14
- export declare function setUserId(userId: string): void;
15
- export declare function setUserEmail(userEmail: string): void;
16
- export declare function clearToken(): void;
17
- export declare function startSession(): void;
18
- export declare function endSession(): void;
19
- export declare function enableManualSession(): void;
20
- export declare function trackEvent(eventTitle: string, properties?: Record<string, string>): void;
21
- export declare function generateTestEvent(): void;
22
- export declare function didCrashInLastSession(): Promise<boolean>;
23
- export declare function generateTestCrash(): void;
24
- export declare function logErrorMessage(message: string, properties?: Record<string, string>): void;
25
- export declare function logError({ message, exception, stack, classFqn, fileName, lineNumber, properties, }: LogErrorParams): Promise<void>;
26
- export {};
27
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAGlF,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,iCAAiC,CAAC,GAAG,CAAC,cA0BtD;AAID,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE1C;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEhD;AAID,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAExF;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAID,wBAAgB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAExD;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAE1F;AAED,wBAAsB,QAAQ,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,UAAU,GACX,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ChC"}