@pensasystems/pensa-react-native 0.1.0-beta-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/PensaSdkReactNative.podspec +25 -0
- package/README.md +373 -0
- package/android/build.gradle +90 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/pensasdkreactnative/PensaEventEmitterModule.kt +21 -0
- package/android/src/main/java/com/pensasdkreactnative/PensaListeners.kt +44 -0
- package/android/src/main/java/com/pensasdkreactnative/PensaSdkReactNativeModule.kt +172 -0
- package/android/src/main/java/com/pensasdkreactnative/PensaSdkReactNativePackage.kt +20 -0
- package/ios/PensaEventEmitter.swift +26 -0
- package/ios/PensaListeners.swift +37 -0
- package/ios/PensaSdkReactNative-Bridging-Header.h +43 -0
- package/ios/PensaSdkReactNative.mm +48 -0
- package/ios/PensaSdkReactNative.swift +121 -0
- package/ios/Podfile +35 -0
- package/lib/module/events.js +11 -0
- package/lib/module/events.js.map +1 -0
- package/lib/module/index.js +42 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/events.d.ts +7 -0
- package/lib/typescript/src/events.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +16 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +26 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/package.json +154 -0
- package/src/events.ts +16 -0
- package/src/index.tsx +77 -0
- package/src/types.ts +29 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
package com.pensasdkreactnative
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
4
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
5
|
+
import com.facebook.react.bridge.ReactMethod
|
|
6
|
+
import com.facebook.react.bridge.Promise
|
|
7
|
+
import com.facebook.react.bridge.ReadableMap
|
|
8
|
+
import com.pensasystems.pensasdk.PensaSdk
|
|
9
|
+
import com.pensasystems.pensasdk.PensaSdkConfiguration
|
|
10
|
+
import com.pensasystems.pensasdk.listener.CantScanEventListener
|
|
11
|
+
import com.pensasystems.pensasdk.listener.ScanUploadListener
|
|
12
|
+
|
|
13
|
+
class PensaSdkReactNativeModule(reactContext: ReactApplicationContext) :
|
|
14
|
+
ReactContextBaseJavaModule(reactContext) {
|
|
15
|
+
private val context = reactContext.applicationContext
|
|
16
|
+
private val rnContext = reactContext
|
|
17
|
+
|
|
18
|
+
init {
|
|
19
|
+
PensaListeners.setup(reactContext)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override fun getName(): String {
|
|
23
|
+
return NAME
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
companion object {
|
|
27
|
+
const val NAME = "PensaSdkReactNative"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@ReactMethod
|
|
31
|
+
fun initPensa(configMap: ReadableMap, promise: Promise) {
|
|
32
|
+
try {
|
|
33
|
+
val clientId = configMap.getString("clientId") ?: ""
|
|
34
|
+
val clientSecret = configMap.getString("clientSecret") ?: ""
|
|
35
|
+
val isLoggingEnabled = configMap.getBoolean("isLoggingEnabled")
|
|
36
|
+
|
|
37
|
+
val sdkConfig = PensaSdkConfiguration.Builder()
|
|
38
|
+
.setClientId(clientId)
|
|
39
|
+
.setClientSecret(clientSecret)
|
|
40
|
+
.enableLogging(isLoggingEnabled)
|
|
41
|
+
.setScanUploadListener(PensaListeners)
|
|
42
|
+
.setCantScanEventListener(PensaListeners)
|
|
43
|
+
.build()
|
|
44
|
+
|
|
45
|
+
PensaSdk.initPensa(
|
|
46
|
+
applicationContext = rnContext.applicationContext,
|
|
47
|
+
sdkConfiguration = sdkConfig,
|
|
48
|
+
onSuccess = {
|
|
49
|
+
promise.resolve(null)
|
|
50
|
+
},
|
|
51
|
+
onError = { errorMessage ->
|
|
52
|
+
if (!PensaSdk.isPensaStarted()) {
|
|
53
|
+
promise.reject("INIT_FAILED", errorMessage)
|
|
54
|
+
} else {
|
|
55
|
+
promise.resolve(null)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
} catch (e: Exception) {
|
|
61
|
+
promise.reject("INIT_EXCEPTION", e.message, e)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@ReactMethod
|
|
66
|
+
fun isPensaStarted(promise: Promise) {
|
|
67
|
+
promise.resolve(PensaSdk.isPensaStarted())
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@ReactMethod
|
|
71
|
+
fun showShelfScans(promise: Promise) {
|
|
72
|
+
val activity = reactApplicationContext.currentActivity
|
|
73
|
+
if (activity != null) {
|
|
74
|
+
PensaSdk.showShelfScans(
|
|
75
|
+
context = activity,
|
|
76
|
+
onError = { error -> promise.reject("SHOW_SHELF_SCANS_FAILED", error) }
|
|
77
|
+
)
|
|
78
|
+
promise.resolve(null)
|
|
79
|
+
} else {
|
|
80
|
+
promise.reject("NO_ACTIVITY", "Current activity is null")
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
@ReactMethod
|
|
84
|
+
fun showProductScans(promise: Promise) {
|
|
85
|
+
val activity = reactApplicationContext.currentActivity
|
|
86
|
+
if (activity != null) {
|
|
87
|
+
PensaSdk.showProductScans(
|
|
88
|
+
context = activity,
|
|
89
|
+
onError = { error -> promise.reject("SHOW_PRODUCT_SCANS_FAILED", error) }
|
|
90
|
+
)
|
|
91
|
+
promise.resolve(null)
|
|
92
|
+
} else {
|
|
93
|
+
promise.reject("NO_ACTIVITY", "Current activity is null")
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@ReactMethod
|
|
98
|
+
fun showStoreSearchView(promise: Promise) {
|
|
99
|
+
val activity = reactApplicationContext.currentActivity
|
|
100
|
+
if (activity != null) {
|
|
101
|
+
PensaSdk.showStoreSearchView(
|
|
102
|
+
context = activity,
|
|
103
|
+
onError = { error -> promise.reject("SHOW_STORES_SEARCH_SCREEN_FAILED", error) }
|
|
104
|
+
)
|
|
105
|
+
promise.resolve(null)
|
|
106
|
+
} else {
|
|
107
|
+
promise.reject("NO_ACTIVITY", "Current activity is null")
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@ReactMethod
|
|
112
|
+
fun showStoresScreen(promise: Promise) {
|
|
113
|
+
val activity = reactApplicationContext.currentActivity
|
|
114
|
+
if (activity != null) {
|
|
115
|
+
PensaSdk.showStoresScreen(
|
|
116
|
+
context = activity,
|
|
117
|
+
onError = { error -> promise.reject("SHOW_STORES_SCREEN_FAILED", error) }
|
|
118
|
+
)
|
|
119
|
+
promise.resolve(null)
|
|
120
|
+
} else {
|
|
121
|
+
promise.reject("NO_ACTIVITY", "Current activity is null")
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@ReactMethod
|
|
126
|
+
fun showScanArea(scanId: Int, storeId: Int?, globalStoreId: String?, promise: Promise) {
|
|
127
|
+
val activity = reactApplicationContext.currentActivity
|
|
128
|
+
if (activity != null) {
|
|
129
|
+
PensaSdk.showScanArea(
|
|
130
|
+
context = activity,
|
|
131
|
+
scanId = scanId,
|
|
132
|
+
storeId = storeId,
|
|
133
|
+
globalStoreId = globalStoreId,
|
|
134
|
+
onError = { error -> promise.reject("SHOW_SCAN_AREA_FAILED", error) }
|
|
135
|
+
)
|
|
136
|
+
promise.resolve(null)
|
|
137
|
+
} else {
|
|
138
|
+
promise.reject("NO_ACTIVITY", "Current activity is null")
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
@ReactMethod
|
|
143
|
+
fun showStockingScreen(promise: Promise) {
|
|
144
|
+
val activity = reactApplicationContext.currentActivity
|
|
145
|
+
if (activity != null) {
|
|
146
|
+
PensaSdk.showStockingScreen(
|
|
147
|
+
context = activity,
|
|
148
|
+
onError = { error -> promise.reject("SHOW_STOCKING_SCREEN_FAILED", error) }
|
|
149
|
+
)
|
|
150
|
+
promise.resolve(null)
|
|
151
|
+
} else {
|
|
152
|
+
promise.reject("NO_ACTIVITY", "Current activity is null")
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
@ReactMethod
|
|
157
|
+
fun showStoreChecklist(globalStoreId: String, guid: String?, sectionKey: String?, promise: Promise) {
|
|
158
|
+
val activity = reactApplicationContext.currentActivity
|
|
159
|
+
if (activity != null) {
|
|
160
|
+
PensaSdk.showStoreChecklist(
|
|
161
|
+
context = activity,
|
|
162
|
+
globalStoreId = globalStoreId,
|
|
163
|
+
guid = guid,
|
|
164
|
+
sectionKey = sectionKey,
|
|
165
|
+
onError = { error -> promise.reject("SHOW_STORE_CHECKLIST_FAILED", error) }
|
|
166
|
+
)
|
|
167
|
+
promise.resolve(null)
|
|
168
|
+
} else {
|
|
169
|
+
promise.reject("NO_ACTIVITY", "Current activity is null")
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.pensasdkreactnative
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.ReactPackage
|
|
4
|
+
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.facebook.react.uimanager.ViewManager
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PensaSdkReactNativePackage : ReactPackage {
|
|
10
|
+
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
|
|
11
|
+
return listOf(
|
|
12
|
+
PensaSdkReactNativeModule(reactContext),
|
|
13
|
+
PensaEventEmitterModule(reactContext)
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
|
|
18
|
+
return emptyList()
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import React
|
|
3
|
+
|
|
4
|
+
@objc(PensaEventEmitter)
|
|
5
|
+
class PensaEventEmitter: RCTEventEmitter {
|
|
6
|
+
|
|
7
|
+
static var shared: PensaEventEmitter?
|
|
8
|
+
|
|
9
|
+
override init() {
|
|
10
|
+
super.init()
|
|
11
|
+
PensaEventEmitter.shared = self
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
override static func requiresMainQueueSetup() -> Bool {
|
|
15
|
+
return true
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
override func supportedEvents() -> [String] {
|
|
19
|
+
return [
|
|
20
|
+
"onScanUploadProgressUpdate",
|
|
21
|
+
"onScanUploadCompleted",
|
|
22
|
+
"onScanUploadFailed",
|
|
23
|
+
"onCantScanReported"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import PensaSdk
|
|
3
|
+
|
|
4
|
+
class PensaListeners: NSObject, ScanUploadListener, CantScanEventListener {
|
|
5
|
+
|
|
6
|
+
static let shared = PensaListeners()
|
|
7
|
+
|
|
8
|
+
private override init() {}
|
|
9
|
+
|
|
10
|
+
func onScanUploadProgressUpdate(tdlinxId: String, scanAreaId: String, progress: Double) {
|
|
11
|
+
PensaEventEmitter.shared?.sendEvent(
|
|
12
|
+
withName: "onScanUploadProgressUpdate",
|
|
13
|
+
body: ["tdlinxId": tdlinxId, "scanAreaId": scanAreaId, "progress": progress]
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
func onScanUploadCompleted(tdlinxId: String, scanAreaId: String) {
|
|
18
|
+
PensaEventEmitter.shared?.sendEvent(
|
|
19
|
+
withName: "onScanUploadCompleted",
|
|
20
|
+
body: ["tdlinxId": tdlinxId, "scanAreaId": scanAreaId]
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
func onScanUploadFailed(tdlinxId: String, scanAreaId: String, error: Error) {
|
|
25
|
+
PensaEventEmitter.shared?.sendEvent(
|
|
26
|
+
withName: "onScanUploadFailed",
|
|
27
|
+
body: ["tdlinxId": tdlinxId, "scanAreaId": scanAreaId, "error": error.localizedDescription]
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
func onCantScanReported(tdlinxId: String, scanAreaId: String, cantScanReason: String) {
|
|
32
|
+
PensaEventEmitter.shared?.sendEvent(
|
|
33
|
+
withName: "onCantScanReported",
|
|
34
|
+
body: ["tdlinxId": tdlinxId, "scanAreaId": scanAreaId, "reason": cantScanReason]
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#import <React/RCTBridgeModule.h>
|
|
2
|
+
#import <React/RCTEventEmitter.h>
|
|
3
|
+
|
|
4
|
+
@interface RCT_EXTERN_MODULE(PensaSdkReactNative, NSObject)
|
|
5
|
+
|
|
6
|
+
RCT_EXTERN_METHOD(initPensa:(NSDictionary *)config
|
|
7
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
8
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
9
|
+
|
|
10
|
+
RCT_EXTERN_METHOD(isPensaStarted:(RCTPromiseResolveBlock)resolve
|
|
11
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
12
|
+
|
|
13
|
+
RCT_EXTERN_METHOD(showShelfScans:(RCTPromiseResolveBlock)resolve
|
|
14
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
15
|
+
|
|
16
|
+
RCT_EXTERN_METHOD(showProductScans:(RCTPromiseResolveBlock)resolve
|
|
17
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
18
|
+
|
|
19
|
+
RCT_EXTERN_METHOD(showStoreSearchView:(RCTPromiseResolveBlock)resolve
|
|
20
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
21
|
+
|
|
22
|
+
RCT_EXTERN_METHOD(showStoresScreen:(RCTPromiseResolveBlock)resolve
|
|
23
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
24
|
+
|
|
25
|
+
RCT_EXTERN_METHOD(showStockingScreen:(RCTPromiseResolveBlock)resolve
|
|
26
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
27
|
+
|
|
28
|
+
RCT_EXTERN_METHOD(showScanArea:(nonnull NSNumber *)scanId
|
|
29
|
+
storeId:(nullable NSNumber *)storeId
|
|
30
|
+
globalStoreId:(nullable NSString *)globalStoreId
|
|
31
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
32
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
33
|
+
|
|
34
|
+
RCT_EXTERN_METHOD(showStoreChecklist:(NSString *)globalStoreId
|
|
35
|
+
guid:(NSString * _Nullable)guid
|
|
36
|
+
sectionKey:(NSString * _Nullable)sectionKey
|
|
37
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
38
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
39
|
+
|
|
40
|
+
@end
|
|
41
|
+
|
|
42
|
+
@interface RCT_EXTERN_MODULE(PensaEventEmitter, RCTEventEmitter)
|
|
43
|
+
@end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#import <React/RCTBridgeModule.h>
|
|
2
|
+
#import <React/RCTEventEmitter.h>
|
|
3
|
+
|
|
4
|
+
@interface RCT_EXTERN_MODULE(PensaSdkReactNative, NSObject)
|
|
5
|
+
|
|
6
|
+
RCT_EXTERN_METHOD(initPensa:(NSDictionary *)config
|
|
7
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
8
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
9
|
+
|
|
10
|
+
RCT_EXTERN_METHOD(isPensaStarted:(RCTPromiseResolveBlock)resolve
|
|
11
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
12
|
+
|
|
13
|
+
RCT_EXTERN_METHOD(showShelfScans:(RCTPromiseResolveBlock)resolve
|
|
14
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
15
|
+
|
|
16
|
+
RCT_EXTERN_METHOD(showProductScans:(RCTPromiseResolveBlock)resolve
|
|
17
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
18
|
+
|
|
19
|
+
RCT_EXTERN_METHOD(showStoreSearchView:(RCTPromiseResolveBlock)resolve
|
|
20
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
21
|
+
|
|
22
|
+
RCT_EXTERN_METHOD(showStoresScreen:(RCTPromiseResolveBlock)resolve
|
|
23
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
24
|
+
|
|
25
|
+
RCT_EXTERN_METHOD(showStockingScreen:(RCTPromiseResolveBlock)resolve
|
|
26
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
27
|
+
|
|
28
|
+
RCT_EXTERN_METHOD(showScanArea:(nonnull NSNumber *)scanId
|
|
29
|
+
storeId:(nullable NSNumber *)storeId
|
|
30
|
+
globalStoreId:(nullable NSString *)globalStoreId
|
|
31
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
32
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
33
|
+
|
|
34
|
+
RCT_EXTERN_METHOD(showStoreChecklist:(NSString *)globalStoreId
|
|
35
|
+
guid:(NSString * _Nullable)guid
|
|
36
|
+
sectionKey:(NSString * _Nullable)sectionKey
|
|
37
|
+
withResolver:(RCTPromiseResolveBlock)resolve
|
|
38
|
+
withRejecter:(RCTPromiseRejectBlock)reject)
|
|
39
|
+
|
|
40
|
+
+ (BOOL)requiresMainQueueSetup
|
|
41
|
+
{
|
|
42
|
+
return NO;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@end
|
|
46
|
+
|
|
47
|
+
@interface RCT_EXTERN_MODULE(PensaEventEmitter, RCTEventEmitter)
|
|
48
|
+
@end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import PensaSdk
|
|
3
|
+
|
|
4
|
+
@objc(PensaSdkReactNative)
|
|
5
|
+
class PensaSdkReactNative: NSObject {
|
|
6
|
+
|
|
7
|
+
@objc
|
|
8
|
+
static func requiresMainQueueSetup() -> Bool {
|
|
9
|
+
return true
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
@objc(initPensa:withResolver:withRejecter:)
|
|
13
|
+
func initPensa(config: NSDictionary,
|
|
14
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
15
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
16
|
+
guard let clientId = config["clientId"] as? String,
|
|
17
|
+
let clientSecret = config["clientSecret"] as? String else {
|
|
18
|
+
reject("INVALID_CONFIG", "clientId and clientSecret are required", nil)
|
|
19
|
+
return
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let loggingEnabled = config["isLoggingEnabled"] as? Bool ?? false
|
|
23
|
+
|
|
24
|
+
let configuration = PensaConfiguration.Builder()
|
|
25
|
+
.setClientId(clientId)
|
|
26
|
+
.setClientSecret(clientSecret)
|
|
27
|
+
.setLoggingEnabled(loggingEnabled)
|
|
28
|
+
.setScanUploadListener(PensaListeners.shared)
|
|
29
|
+
.setCantScanEventListener(PensaListeners.shared)
|
|
30
|
+
.build()
|
|
31
|
+
|
|
32
|
+
DispatchQueue.main.async {
|
|
33
|
+
Pensa.shared.initPensa(config: configuration) { error in
|
|
34
|
+
if let error = error {
|
|
35
|
+
reject("INIT_FAILED", error.localizedDescription, error)
|
|
36
|
+
} else {
|
|
37
|
+
resolve(nil)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@objc(isPensaStarted:withRejecter:)
|
|
44
|
+
func isPensaStarted(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
45
|
+
DispatchQueue.main.async {
|
|
46
|
+
resolve(Pensa.shared.isPensaStarted())
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@objc(showShelfScans:withRejecter:)
|
|
51
|
+
func showShelfScans(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
52
|
+
DispatchQueue.main.async {
|
|
53
|
+
Pensa.shared.showShelfScans()
|
|
54
|
+
resolve(nil)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@objc(showProductScans:withRejecter:)
|
|
59
|
+
func showProductScans(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
60
|
+
DispatchQueue.main.async {
|
|
61
|
+
Pensa.shared.showProductScans()
|
|
62
|
+
resolve(nil)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@objc(showStoreSearchView:withRejecter:)
|
|
67
|
+
func showStoreSearchView(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
68
|
+
DispatchQueue.main.async {
|
|
69
|
+
Pensa.shared.showStoreSearchView()
|
|
70
|
+
resolve(nil)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@objc(showStoresScreen:withRejecter:)
|
|
75
|
+
func showStoresScreen(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
76
|
+
DispatchQueue.main.async {
|
|
77
|
+
Pensa.shared.showStoresScreen()
|
|
78
|
+
resolve(nil)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@objc(showStockingScreen:withRejecter:)
|
|
83
|
+
func showStockingScreen(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
84
|
+
DispatchQueue.main.async {
|
|
85
|
+
Pensa.shared.showStockingScreen()
|
|
86
|
+
resolve(nil)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@objc(showScanArea:storeId:globalStoreId:withResolver:withRejecter:)
|
|
91
|
+
func showScanArea(scanId: NSNumber,
|
|
92
|
+
storeId: NSNumber?,
|
|
93
|
+
globalStoreId: String?,
|
|
94
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
95
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
96
|
+
DispatchQueue.main.async {
|
|
97
|
+
Pensa.shared.showScanArea(
|
|
98
|
+
scanId: scanId.intValue,
|
|
99
|
+
storeId: storeId?.intValue,
|
|
100
|
+
globalStoreId: globalStoreId
|
|
101
|
+
)
|
|
102
|
+
resolve(nil)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
@objc(showStoreChecklist:guid:sectionKey:withResolver:withRejecter:)
|
|
107
|
+
func showStoreChecklist(globalStoreId: NSString,
|
|
108
|
+
guid: NSString?,
|
|
109
|
+
sectionKey: NSString?,
|
|
110
|
+
resolve: @escaping RCTPromiseResolveBlock,
|
|
111
|
+
reject: @escaping RCTPromiseRejectBlock) {
|
|
112
|
+
DispatchQueue.main.async {
|
|
113
|
+
Pensa.shared.showStoreChecklist(
|
|
114
|
+
sectionKey: sectionKey as String?,
|
|
115
|
+
guid: guid as String?,
|
|
116
|
+
globalStoreId: globalStoreId as String
|
|
117
|
+
)
|
|
118
|
+
resolve(nil)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
package/ios/Podfile
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Resolve react_native_pods.rb with node to allow for hoisting
|
|
2
|
+
require Pod::Executable.execute_command('node', ['-p',
|
|
3
|
+
'require.resolve(
|
|
4
|
+
"react-native/scripts/react_native_pods.rb",
|
|
5
|
+
{paths: [process.argv[1]]},
|
|
6
|
+
)', __dir__]).strip
|
|
7
|
+
|
|
8
|
+
platform :ios, min_ios_version_supported
|
|
9
|
+
prepare_react_native_project!
|
|
10
|
+
|
|
11
|
+
linkage = ENV['USE_FRAMEWORKS']
|
|
12
|
+
if linkage != nil
|
|
13
|
+
Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
|
|
14
|
+
use_frameworks! :linkage => linkage.to_sym
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
target 'PensaSdkReactNativeExample' do
|
|
18
|
+
config = use_native_modules!
|
|
19
|
+
|
|
20
|
+
use_react_native!(
|
|
21
|
+
:path => config[:reactNativePath],
|
|
22
|
+
# An absolute path to your application root.
|
|
23
|
+
:app_path => "#{Pod::Config.instance.installation_root}/.."
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
post_install do |installer|
|
|
27
|
+
# https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202
|
|
28
|
+
react_native_post_install(
|
|
29
|
+
installer,
|
|
30
|
+
config[:reactNativePath],
|
|
31
|
+
:mac_catalyst_enabled => false,
|
|
32
|
+
# :ccache_enabled => true
|
|
33
|
+
)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeEventEmitter, NativeModules } from 'react-native';
|
|
4
|
+
const nativeEmitter = new NativeEventEmitter(NativeModules.PensaEventEmitter);
|
|
5
|
+
export const PensaEvents = {
|
|
6
|
+
addListener: (event, callback) => {
|
|
7
|
+
const sub = nativeEmitter.addListener(event, callback);
|
|
8
|
+
return () => sub.remove();
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeEventEmitter","NativeModules","nativeEmitter","PensaEventEmitter","PensaEvents","addListener","event","callback","sub","remove"],"sourceRoot":"../../src","sources":["events.ts"],"mappings":";;AAAA,SAASA,kBAAkB,EAAEC,aAAa,QAAQ,cAAc;AAGhE,MAAMC,aAAa,GAAG,IAAIF,kBAAkB,CAACC,aAAa,CAACE,iBAAiB,CAAC;AAI7E,OAAO,MAAMC,WAAW,GAAG;EACzBC,WAAW,EAAEA,CACXC,KAAQ,EACRC,QAA+C,KAC5C;IACH,MAAMC,GAAG,GAAGN,aAAa,CAACG,WAAW,CAACC,KAAK,EAAEC,QAAQ,CAAC;IACtD,OAAO,MAAMC,GAAG,CAACC,MAAM,CAAC,CAAC;EAC3B;AACF,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeModules, Platform } from 'react-native';
|
|
4
|
+
const LINKING_ERROR = `The package 'pensa-sdk-react-native' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
|
|
5
|
+
ios: "- You have run 'pod install'\n",
|
|
6
|
+
default: ''
|
|
7
|
+
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
8
|
+
const PensaSdkReactNative = NativeModules.PensaSdkReactNative ? NativeModules.PensaSdkReactNative : new Proxy({}, {
|
|
9
|
+
get() {
|
|
10
|
+
throw new Error(LINKING_ERROR);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
export const initPensa = config => {
|
|
14
|
+
return PensaSdkReactNative.initPensa(config);
|
|
15
|
+
};
|
|
16
|
+
export const isPensaStarted = () => {
|
|
17
|
+
return PensaSdkReactNative.isPensaStarted();
|
|
18
|
+
};
|
|
19
|
+
export const showShelfScans = () => {
|
|
20
|
+
return PensaSdkReactNative.showShelfScans();
|
|
21
|
+
};
|
|
22
|
+
export const showProductScans = () => {
|
|
23
|
+
return PensaSdkReactNative.showProductScans();
|
|
24
|
+
};
|
|
25
|
+
export const showStoreSearchView = () => {
|
|
26
|
+
return PensaSdkReactNative.showStoreSearchView();
|
|
27
|
+
};
|
|
28
|
+
export const showStoresScreen = () => {
|
|
29
|
+
return PensaSdkReactNative.showStoresScreen();
|
|
30
|
+
};
|
|
31
|
+
export const showScanArea = (scanId, storeId, globalStoreId) => {
|
|
32
|
+
return PensaSdkReactNative.showScanArea(scanId, storeId ?? null, globalStoreId ?? null);
|
|
33
|
+
};
|
|
34
|
+
export const showStockingScreen = () => {
|
|
35
|
+
return PensaSdkReactNative.showStockingScreen();
|
|
36
|
+
};
|
|
37
|
+
export const showStoreChecklist = (globalStoreId, guid, sectionKey) => {
|
|
38
|
+
return PensaSdkReactNative.showStoreChecklist(globalStoreId, guid, sectionKey);
|
|
39
|
+
};
|
|
40
|
+
export * from "./events.js";
|
|
41
|
+
export * from "./types.js";
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","LINKING_ERROR","select","ios","default","PensaSdkReactNative","Proxy","get","Error","initPensa","config","isPensaStarted","showShelfScans","showProductScans","showStoreSearchView","showStoresScreen","showScanArea","scanId","storeId","globalStoreId","showStockingScreen","showStoreChecklist","guid","sectionKey"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAEtD,MAAMC,aAAa,GACjB,iFAAiF,GACjFD,QAAQ,CAACE,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,mBAAmB,GAAGN,aAAa,CAACM,mBAAmB,GACzDN,aAAa,CAACM,mBAAmB,GACjC,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEL,OAAO,MAAMQ,SAAS,GAAIC,MAIzB,IAAoB;EACnB,OAAOL,mBAAmB,CAACI,SAAS,CAACC,MAAM,CAAC;AAC9C,CAAC;AAED,OAAO,MAAMC,cAAc,GAAGA,CAAA,KAAwB;EACpD,OAAON,mBAAmB,CAACM,cAAc,CAAC,CAAC;AAC7C,CAAC;AAED,OAAO,MAAMC,cAAc,GAAGA,CAAA,KAAqB;EACjD,OAAOP,mBAAmB,CAACO,cAAc,CAAC,CAAC;AAC7C,CAAC;AAED,OAAO,MAAMC,gBAAgB,GAAGA,CAAA,KAAqB;EACnD,OAAOR,mBAAmB,CAACQ,gBAAgB,CAAC,CAAC;AAC/C,CAAC;AAED,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAqB;EACtD,OAAOT,mBAAmB,CAACS,mBAAmB,CAAC,CAAC;AAClD,CAAC;AAED,OAAO,MAAMC,gBAAgB,GAAGA,CAAA,KAAqB;EACnD,OAAOV,mBAAmB,CAACU,gBAAgB,CAAC,CAAC;AAC/C,CAAC;AAED,OAAO,MAAMC,YAAY,GAAGA,CAC1BC,MAAc,EACdC,OAAgB,EAChBC,aAAsB,KACJ;EAClB,OAAOd,mBAAmB,CAACW,YAAY,CACrCC,MAAM,EACNC,OAAO,IAAI,IAAI,EACfC,aAAa,IAAI,IACnB,CAAC;AACH,CAAC;AAED,OAAO,MAAMC,kBAAkB,GAAGA,CAAA,KAAqB;EACrD,OAAOf,mBAAmB,CAACe,kBAAkB,CAAC,CAAC;AACjD,CAAC;AAED,OAAO,MAAMC,kBAAkB,GAAGA,CAChCF,aAAqB,EACrBG,IAAa,EACbC,UAAmB,KACD;EAClB,OAAOlB,mBAAmB,CAACgB,kBAAkB,CAC3CF,aAAa,EACbG,IAAI,EACJC,UACF,CAAC;AACH,CAAC;AAED,cAAc,aAAU;AACxB,cAAc,YAAS","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PensaEventPayloads } from './types';
|
|
2
|
+
type PensaEvent = keyof PensaEventPayloads;
|
|
3
|
+
export declare const PensaEvents: {
|
|
4
|
+
addListener: <E extends PensaEvent>(event: E, callback: (data: PensaEventPayloads[E]) => void) => () => void;
|
|
5
|
+
};
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIlD,KAAK,UAAU,GAAG,MAAM,kBAAkB,CAAC;AAE3C,eAAO,MAAM,WAAW;kBACR,CAAC,SAAS,UAAU,SACzB,CAAC,YACE,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI;CAKlD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const initPensa: (config: {
|
|
2
|
+
clientId: string;
|
|
3
|
+
clientSecret: string;
|
|
4
|
+
isLoggingEnabled?: boolean;
|
|
5
|
+
}) => Promise<void>;
|
|
6
|
+
export declare const isPensaStarted: () => Promise<boolean>;
|
|
7
|
+
export declare const showShelfScans: () => Promise<void>;
|
|
8
|
+
export declare const showProductScans: () => Promise<void>;
|
|
9
|
+
export declare const showStoreSearchView: () => Promise<void>;
|
|
10
|
+
export declare const showStoresScreen: () => Promise<void>;
|
|
11
|
+
export declare const showScanArea: (scanId: number, storeId?: number, globalStoreId?: string) => Promise<void>;
|
|
12
|
+
export declare const showStockingScreen: () => Promise<void>;
|
|
13
|
+
export declare const showStoreChecklist: (globalStoreId: string, guid?: string, sectionKey?: string) => Promise<void>;
|
|
14
|
+
export * from './events';
|
|
15
|
+
export * from './types';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAmBA,eAAO,MAAM,SAAS,GAAI,QAAQ;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,KAAG,OAAO,CAAC,IAAI,CAEf,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,OAAO,CAAC,OAAO,CAEhD,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,OAAO,CAAC,IAAI,CAE7C,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,OAAO,CAAC,IAAI,CAE/C,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAO,OAAO,CAAC,IAAI,CAElD,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,OAAO,CAAC,IAAI,CAE/C,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,QAAQ,MAAM,EACd,UAAU,MAAM,EAChB,gBAAgB,MAAM,KACrB,OAAO,CAAC,IAAI,CAMd,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAO,OAAO,CAAC,IAAI,CAEjD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,eAAe,MAAM,EACrB,OAAO,MAAM,EACb,aAAa,MAAM,KAClB,OAAO,CAAC,IAAI,CAMd,CAAC;AAEF,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type OnScanUploadProgressUpdate = {
|
|
2
|
+
tdlinxId: string;
|
|
3
|
+
scanAreaId: string;
|
|
4
|
+
progress: number;
|
|
5
|
+
};
|
|
6
|
+
export type OnScanUploadCompleted = {
|
|
7
|
+
tdlinxId: string;
|
|
8
|
+
scanAreaId: string;
|
|
9
|
+
};
|
|
10
|
+
export type OnScanUploadFailed = {
|
|
11
|
+
tdlinxId: string;
|
|
12
|
+
scanAreaId: string;
|
|
13
|
+
error?: string;
|
|
14
|
+
};
|
|
15
|
+
export type OnCantScanReported = {
|
|
16
|
+
tdlinxId: string;
|
|
17
|
+
scanAreaId: string;
|
|
18
|
+
reason: string;
|
|
19
|
+
};
|
|
20
|
+
export type PensaEventPayloads = {
|
|
21
|
+
onScanUploadProgressUpdate: OnScanUploadProgressUpdate;
|
|
22
|
+
onScanUploadCompleted: OnScanUploadCompleted;
|
|
23
|
+
onScanUploadFailed: OnScanUploadFailed;
|
|
24
|
+
onCantScanReported: OnCantScanReported;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,0BAA0B,EAAE,0BAA0B,CAAC;IACvD,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,kBAAkB,EAAE,kBAAkB,CAAC;CACxC,CAAC"}
|