appambit 0.1.0 → 0.2.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 (50) 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/AppambitModule.kt +4 -0
  6. package/android/src/main/java/com/appambit/AppambitPackage.kt +4 -0
  7. package/android/src/main/java/com/appambit/AppambitRemoteConfigModule.kt +38 -0
  8. package/ios/AppAmbitCms.h +5 -0
  9. package/ios/AppAmbitCms.mm +185 -0
  10. package/ios/AppAmbitRemoteConfig.h +5 -0
  11. package/ios/AppAmbitRemoteConfig.mm +33 -0
  12. package/ios/AppAmbitSDKWrapper.swift +53 -1
  13. package/ios/Appambit.h +4 -0
  14. package/ios/Appambit.mm +4 -0
  15. package/package.json +1 -1
  16. package/src/CmsQuery.ts +114 -0
  17. package/src/NativeAppambitCms.ts +9 -0
  18. package/src/NativeAppambitCore.ts +1 -0
  19. package/src/NativeAppambitRemoteConfig.ts +11 -0
  20. package/src/index.tsx +90 -6
  21. package/lib/module/NativeAppambitAnalytics.js +0 -5
  22. package/lib/module/NativeAppambitAnalytics.js.map +0 -1
  23. package/lib/module/NativeAppambitCore.js +0 -5
  24. package/lib/module/NativeAppambitCore.js.map +0 -1
  25. package/lib/module/NativeAppambitCrashes.js +0 -5
  26. package/lib/module/NativeAppambitCrashes.js.map +0 -1
  27. package/lib/module/index.js +0 -99
  28. package/lib/module/index.js.map +0 -1
  29. package/lib/module/package.json +0 -1
  30. package/lib/typescript/appambit_test_app/src/App.d.ts +0 -2
  31. package/lib/typescript/appambit_test_app/src/App.d.ts.map +0 -1
  32. package/lib/typescript/appambit_test_app/src/components/CustomButton.d.ts +0 -8
  33. package/lib/typescript/appambit_test_app/src/components/CustomButton.d.ts.map +0 -1
  34. package/lib/typescript/appambit_test_app/src/components/CustomInput.d.ts +0 -10
  35. package/lib/typescript/appambit_test_app/src/components/CustomInput.d.ts.map +0 -1
  36. package/lib/typescript/appambit_test_app/src/screens/AnalyticsScreen.d.ts +0 -2
  37. package/lib/typescript/appambit_test_app/src/screens/AnalyticsScreen.d.ts.map +0 -1
  38. package/lib/typescript/appambit_test_app/src/screens/CrashesScreen.d.ts +0 -2
  39. package/lib/typescript/appambit_test_app/src/screens/CrashesScreen.d.ts.map +0 -1
  40. package/lib/typescript/appambit_test_app/src/utils/uuid.d.ts +0 -2
  41. package/lib/typescript/appambit_test_app/src/utils/uuid.d.ts.map +0 -1
  42. package/lib/typescript/package.json +0 -1
  43. package/lib/typescript/src/NativeAppambitAnalytics.d.ts +0 -14
  44. package/lib/typescript/src/NativeAppambitAnalytics.d.ts.map +0 -1
  45. package/lib/typescript/src/NativeAppambitCore.d.ts +0 -7
  46. package/lib/typescript/src/NativeAppambitCore.d.ts.map +0 -1
  47. package/lib/typescript/src/NativeAppambitCrashes.d.ts +0 -23
  48. package/lib/typescript/src/NativeAppambitCrashes.d.ts.map +0 -1
  49. package/lib/typescript/src/index.d.ts +0 -24
  50. 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.0'
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.0
66
+ npm install appambit@0.2.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.1.0"
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
+ }
@@ -16,6 +16,10 @@ class AppambitModule(reactContext: ReactApplicationContext) :
16
16
  AppAmbit.start(reactApplicationContext, appkey)
17
17
  }
18
18
 
19
+ override fun addBreadcrumb(name: String) {
20
+ AppAmbit.addBreadcrumb(name)
21
+ }
22
+
19
23
  companion object {
20
24
  const val NAME = "AppAmbitCore"
21
25
  }
@@ -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 {
@@ -11,6 +11,12 @@ public class AppAmbitSDKWrapper: NSObject {
11
11
  public static func start(appKey: String) {
12
12
  AppAmbit.start(appKey: appKey)
13
13
  }
14
+
15
+ // MARK: Breadcrumbs
16
+ @objc
17
+ public static func addBreadcrumb(name: String) {
18
+ AppAmbit.addBreadcrumb(name: name)
19
+ }
14
20
 
15
21
  // MARK: - Analytics
16
22
  @objc
@@ -76,4 +82,50 @@ public class AppAmbitSDKWrapper: NSObject {
76
82
  Crashes.logError(exception: exception, properties: properties)
77
83
  }
78
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
+
79
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/ios/Appambit.mm CHANGED
@@ -14,4 +14,8 @@ RCT_EXPORT_MODULE(AppAmbitCore);
14
14
  [AppAmbitSdkWrapper startWithAppKey:appkey];
15
15
  }
16
16
 
17
+ - (void)addBreadcrumb:(nonnull NSString *)name {
18
+ [AppAmbitSdkWrapper addBreadcrumbWithName:name];
19
+ }
20
+
17
21
  @end
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appambit",
3
- "version": "0.1.0",
3
+ "version": "0.2.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');
@@ -2,6 +2,7 @@ import { TurboModuleRegistry, type TurboModule } from 'react-native';
2
2
 
3
3
  export interface Spec extends TurboModule {
4
4
  start(appkey: string): void;
5
+ addBreadcrumb(name: string): void;
5
6
  }
6
7
 
7
8
  export default TurboModuleRegistry.getEnforcing<Spec>('AppAmbitCore');
@@ -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,10 @@
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';
6
+ import type { NavigationContainerRefWithCurrent } from '@react-navigation/native';
7
+ import { Platform } from 'react-native';
4
8
 
5
9
  type LogErrorParams = {
6
10
  exception?: any;
@@ -12,12 +16,64 @@ type LogErrorParams = {
12
16
  properties?: Record<string, string>;
13
17
  };
14
18
 
19
+ export function registerNavigationTracking(
20
+ navigationRef: NavigationContainerRefWithCurrent<any>
21
+ ) {
22
+ if (Platform.OS !== 'android') {
23
+ return () => {};
24
+ }
25
+
26
+ let lastTrackedKey: string | null = null;
27
+ let lastTrackedName: string | null = null;
28
+ let isInitializing = true;
29
+
30
+ setTimeout(() => {
31
+ isInitializing = false;
32
+ }, 2500);
33
+
34
+ const onStateChange = () => {
35
+ if (!navigationRef.isReady()) return;
36
+
37
+ const route = navigationRef.getCurrentRoute();
38
+ if (!route || route.key === lastTrackedKey) return;
39
+
40
+ const currentName = route.name;
41
+ const prevName = lastTrackedName;
42
+
43
+ lastTrackedKey = route.key;
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
+ }
58
+ };
59
+
60
+ onStateChange();
61
+
62
+ return navigationRef.addListener("state", onStateChange);
63
+ }
64
+
15
65
  // Start the Appambit SDK with the provided app key
16
66
 
17
67
  export function start(appkey: string): void {
18
68
  Appambit.start(appkey);
19
69
  }
20
70
 
71
+ // Breadcrumbs
72
+
73
+ export function addBreadcrumb(name: string): void {
74
+ Appambit.addBreadcrumb(name);
75
+ }
76
+
21
77
  // Analytics methods
22
78
 
23
79
  export function setUserId(userId: string): void {
@@ -62,6 +118,34 @@ export function generateTestCrash(): void {
62
118
  AppambitCrashes.generateTestCrash();
63
119
  }
64
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
+
65
149
  export function logErrorMessage(message: string, properties?: Record<string, string>): void {
66
150
  AppambitCrashes.logErrorMessage(message, properties);
67
151
  }
@@ -76,7 +160,7 @@ export async function logError({
76
160
  properties,
77
161
  }: LogErrorParams): Promise<void> {
78
162
  if (!AppambitCrashes) {
79
- console.warn('AppambitCrashes not registered');
163
+ console.warn('AppAmbitCrashes not registered');
80
164
  return;
81
165
  }
82
166
 
@@ -84,15 +168,15 @@ export async function logError({
84
168
  message && message.length > 0
85
169
  ? message
86
170
  : exception
87
- ? exception.message || JSON.stringify(exception)
88
- : "UnknownError";
171
+ ? exception.message || JSON.stringify(exception)
172
+ : "UnknownError";
89
173
 
90
174
  const stackStr =
91
175
  stack && stack.length > 0
92
176
  ? stack
93
177
  : exception?.stack
94
- ? exception.stack.toString()
95
- : new Error().stack?.toString();
178
+ ? exception.stack.toString()
179
+ : new Error().stack?.toString();
96
180
 
97
181
  const payload: Record<string, any> = {};
98
182
 
@@ -102,7 +186,7 @@ export async function logError({
102
186
  payload.properties = properties;
103
187
  if (classFqn) payload.classFqn = classFqn;
104
188
  if (fileName) payload.fileName = fileName;
105
-
189
+
106
190
  if (typeof lineNumber === 'number' && !isNaN(lineNumber) && isFinite(lineNumber)) {
107
191
  payload.lineNumber = lineNumber;
108
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;AAMpE,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,99 +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
- // Start the Appambit SDK with the provided app key
7
-
8
- export function start(appkey) {
9
- Appambit.start(appkey);
10
- }
11
-
12
- // Analytics methods
13
-
14
- export function setUserId(userId) {
15
- AppambitAnalytics.setUserId(userId);
16
- }
17
- export function setUserEmail(userEmail) {
18
- AppambitAnalytics.setUserEmail(userEmail);
19
- }
20
- export function clearToken() {
21
- AppambitAnalytics.clearToken();
22
- }
23
- export function startSession() {
24
- AppambitAnalytics.startSession();
25
- }
26
- export function endSession() {
27
- AppambitAnalytics.endSession();
28
- }
29
- export function enableManualSession() {
30
- AppambitAnalytics.enableManualSession();
31
- }
32
- export function trackEvent(eventTitle, properties) {
33
- AppambitAnalytics.trackEvent(eventTitle, properties);
34
- }
35
- export function generateTestEvent() {
36
- AppambitAnalytics.generateTestEvent();
37
- }
38
-
39
- // Crashes methods
40
-
41
- export function didCrashInLastSession() {
42
- return AppambitCrashes.didCrashInLastSession();
43
- }
44
- export function generateTestCrash() {
45
- AppambitCrashes.generateTestCrash();
46
- }
47
- export function logErrorMessage(message, properties) {
48
- AppambitCrashes.logErrorMessage(message, properties);
49
- }
50
- export async function logError({
51
- message,
52
- exception,
53
- stack,
54
- classFqn,
55
- fileName,
56
- lineNumber,
57
- properties
58
- }) {
59
- if (!AppambitCrashes) {
60
- console.warn('AppambitCrashes not registered');
61
- return;
62
- }
63
- const messageStr = message && message.length > 0 ? message : exception ? exception.message || JSON.stringify(exception) : "UnknownError";
64
- const stackStr = stack && stack.length > 0 ? stack : exception?.stack ? exception.stack.toString() : new Error().stack?.toString();
65
- const payload = {};
66
- if (messageStr) payload.message = messageStr;
67
- if (stackStr) payload.stack = stackStr;
68
- if (properties && Object.keys(properties).length > 0) payload.properties = properties;
69
- if (classFqn) payload.classFqn = classFqn;
70
- if (fileName) payload.fileName = fileName;
71
- if (typeof lineNumber === 'number' && !isNaN(lineNumber) && isFinite(lineNumber)) {
72
- payload.lineNumber = lineNumber;
73
- }
74
- if (Object.keys(payload).length === 0) return;
75
- const userProvidedMessage = !!message && message.length > 0;
76
- if (userProvidedMessage) {
77
- AppambitCrashes.logErrorMessage(message, properties);
78
- } else if (exception || stackStr && stackStr.length > 0) {
79
- AppambitCrashes.logError(payload);
80
- }
81
- }
82
- ErrorUtils.setGlobalHandler(error => {
83
- const hasMessage = typeof error?.message === "string" && error.message.trim().length > 0;
84
- if (hasMessage) {
85
- logError({
86
- exception: error,
87
- message: error.message,
88
- stack: error.stack,
89
- classFqn: error.constructor?.name
90
- });
91
- } else {
92
- logError({
93
- exception: error,
94
- stack: error.stack,
95
- classFqn: error.constructor?.name
96
- });
97
- }
98
- });
99
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["Appambit","AppambitAnalytics","AppambitCrashes","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","name"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","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":"AAOA,MAAM,CAAC,OAAO,UAAU,GAAG,4CA6B1B"}
@@ -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":"AAIA,MAAM,CAAC,OAAO,UAAU,eAAe,4CAuHtC"}
@@ -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,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,7 +0,0 @@
1
- import { type TurboModule } from 'react-native';
2
- export interface Spec extends TurboModule {
3
- start(appkey: string): void;
4
- }
5
- declare const _default: Spec;
6
- export default _default;
7
- //# 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;CAC7B;;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,24 +0,0 @@
1
- type LogErrorParams = {
2
- exception?: any;
3
- message?: string;
4
- stack?: string;
5
- classFqn?: string;
6
- fileName?: string;
7
- lineNumber?: number;
8
- properties?: Record<string, string>;
9
- };
10
- export declare function start(appkey: string): void;
11
- export declare function setUserId(userId: string): void;
12
- export declare function setUserEmail(userEmail: string): void;
13
- export declare function clearToken(): void;
14
- export declare function startSession(): void;
15
- export declare function endSession(): void;
16
- export declare function enableManualSession(): void;
17
- export declare function trackEvent(eventTitle: string, properties?: Record<string, string>): void;
18
- export declare function generateTestEvent(): void;
19
- export declare function didCrashInLastSession(): Promise<boolean>;
20
- export declare function generateTestCrash(): void;
21
- export declare function logErrorMessage(message: string, properties?: Record<string, string>): void;
22
- export declare function logError({ message, exception, stack, classFqn, fileName, lineNumber, properties, }: LogErrorParams): Promise<void>;
23
- export {};
24
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAIA,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;AAIF,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE1C;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"}