react-native-sdk-pianoio 0.3.6 → 0.3.8
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/android/src/main/java/com/sdkpianoio/ComposerPianoImpl.kt +54 -30
- package/android/src/main/java/com/sdkpianoio/SdkPianoioModule.kt +116 -62
- package/android/src/main/java/com/sdkpianoio/TokenService.kt +37 -34
- package/ios/ComposerPianoImpl.swift +30 -14
- package/ios/MyComposerDelegate.swift +53 -70
- package/ios/SdkPianoio.swift +29 -17
- package/ios/SdkPianoioBridge.m +1 -0
- package/lib/commonjs/NativeSdkPianoio.ts +1 -1
- package/lib/commonjs/PianoComposer.js +2 -2
- package/lib/commonjs/PianoComposer.js.map +1 -1
- package/lib/module/NativeSdkPianoio.ts +1 -1
- package/lib/module/PianoComposer.js +2 -2
- package/lib/module/PianoComposer.js.map +1 -1
- package/lib/typescript/commonjs/src/NativeSdkPianoio.d.ts +1 -1
- package/lib/typescript/commonjs/src/NativeSdkPianoio.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/PianoComposer.d.ts +1 -1
- package/lib/typescript/commonjs/src/PianoComposer.d.ts.map +1 -1
- package/lib/typescript/module/src/NativeSdkPianoio.d.ts +1 -1
- package/lib/typescript/module/src/NativeSdkPianoio.d.ts.map +1 -1
- package/lib/typescript/module/src/PianoComposer.d.ts +1 -1
- package/lib/typescript/module/src/PianoComposer.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/NativeSdkPianoio.ts +1 -1
- package/src/PianoComposer.tsx +8 -3
@@ -1,24 +1,18 @@
|
|
1
1
|
package com.sdkpianoio
|
2
2
|
|
3
|
+
import android.util.Log
|
3
4
|
import androidx.activity.result.ActivityResultLauncher
|
4
5
|
import io.piano.android.id.PianoId
|
5
6
|
import io.piano.android.id.PianoIdClient
|
6
7
|
import io.piano.android.id.models.PianoIdToken
|
7
8
|
|
8
9
|
/**
|
9
|
-
* Represents a user from the Piano ID SDK.
|
10
|
-
*
|
10
|
+
* Represents a user from the Piano ID SDK. This custom class simplifies passing user data back to
|
11
|
+
* React Native.
|
11
12
|
*/
|
12
13
|
class User(val id: String, val email: String, val accessToken: String)
|
13
14
|
|
14
|
-
/**
|
15
|
-
* TokenService - Manages OAuth tokens and authentication with the Piano ID SDK.
|
16
|
-
*
|
17
|
-
* This class is responsible for:
|
18
|
-
* - Integrating with the real PianoId SDK.
|
19
|
-
* - Managing user authentication (sign-in, sign-out).
|
20
|
-
* - Storing and providing the current user's token and information.
|
21
|
-
*/
|
15
|
+
/** TokenService - Manages OAuth tokens and authentication with the Piano ID SDK. */
|
22
16
|
class TokenService {
|
23
17
|
|
24
18
|
// MARK: - Properties
|
@@ -27,27 +21,28 @@ class TokenService {
|
|
27
21
|
private var isInitialized: Boolean = false
|
28
22
|
private var cachedToken: PianoIdToken? = null
|
29
23
|
|
24
|
+
companion object {
|
25
|
+
private const val TAG = "TokenService"
|
26
|
+
}
|
27
|
+
|
30
28
|
// MARK: - Initialization
|
31
29
|
|
32
|
-
/**
|
33
|
-
* Initializes the Piano ID SDK. This should ideally be called once per application lifecycle.
|
34
|
-
*
|
35
|
-
* @param aid The Piano Application ID.
|
36
|
-
*/
|
37
30
|
fun initialize(aid: String) {
|
38
|
-
if (isInitialized)
|
39
|
-
|
31
|
+
if (isInitialized) {
|
32
|
+
Log.d(TAG, "Already initialized.")
|
33
|
+
return
|
34
|
+
}
|
35
|
+
Log.d(TAG, "Initializing with AID: $aid")
|
40
36
|
try {
|
41
37
|
if (aid.isBlank()) {
|
42
38
|
throw IllegalArgumentException("AID cannot be empty")
|
43
39
|
}
|
44
|
-
// Initialize the SDK statically, then get the client instance.
|
45
40
|
PianoId.init(PianoId.ENDPOINT_PRODUCTION, aid)
|
46
41
|
this.client = PianoId.getInstance()
|
47
42
|
isInitialized = true
|
48
|
-
|
43
|
+
Log.d(TAG, "Initialization completed successfully")
|
49
44
|
} catch (e: Exception) {
|
50
|
-
|
45
|
+
Log.e(TAG, "Error during initialization", e)
|
51
46
|
throw e
|
52
47
|
}
|
53
48
|
}
|
@@ -55,42 +50,44 @@ class TokenService {
|
|
55
50
|
// MARK: - Authentication Methods
|
56
51
|
|
57
52
|
fun setToken(token: PianoIdToken?) {
|
53
|
+
Log.d(TAG, "Setting token.")
|
58
54
|
this.cachedToken = token
|
59
55
|
}
|
60
56
|
|
61
57
|
fun signIn(authResultLauncher: ActivityResultLauncher<PianoIdClient.SignInContext>) {
|
62
58
|
val localClient = client
|
63
59
|
if (localClient == null) {
|
64
|
-
|
60
|
+
Log.w(TAG, "signIn called but not initialized.")
|
65
61
|
return
|
66
62
|
}
|
67
|
-
|
68
|
-
val request = localClient.signIn()
|
63
|
+
Log.d(TAG, "Launching sign in flow")
|
64
|
+
val request = localClient.signIn()
|
69
65
|
authResultLauncher.launch(request)
|
70
66
|
}
|
71
67
|
|
72
68
|
fun signOut(callback: (Boolean) -> Unit) {
|
69
|
+
Log.d(TAG, "signOut called")
|
73
70
|
val localClient = client
|
74
71
|
if (localClient == null) {
|
75
|
-
|
72
|
+
Log.w(TAG, "signOut called but not initialized.")
|
76
73
|
callback(false)
|
77
74
|
return
|
78
75
|
}
|
79
76
|
val token = this.cachedToken?.accessToken
|
80
77
|
if (token == null) {
|
81
|
-
|
78
|
+
Log.d(TAG, "No user is signed in, considering signOut successful.")
|
82
79
|
callback(true) // Already signed out
|
83
80
|
return
|
84
81
|
}
|
85
82
|
|
86
|
-
|
83
|
+
Log.d(TAG, "Starting sign out network request")
|
87
84
|
localClient.signOut(token) {
|
88
85
|
if (it.isSuccess) {
|
89
|
-
|
90
|
-
this.cachedToken = null
|
86
|
+
Log.d(TAG, "Sign out successful")
|
87
|
+
this.cachedToken = null
|
91
88
|
callback(true)
|
92
89
|
} else {
|
93
|
-
|
90
|
+
Log.e(TAG, "Sign out failed", it.exceptionOrNull())
|
94
91
|
callback(false)
|
95
92
|
}
|
96
93
|
}
|
@@ -99,16 +96,22 @@ class TokenService {
|
|
99
96
|
// MARK: - User Information Methods
|
100
97
|
|
101
98
|
fun getCurrentUser(): User? {
|
102
|
-
|
103
|
-
|
99
|
+
Log.d(TAG, "getCurrentUser called")
|
100
|
+
val token =
|
101
|
+
this.cachedToken
|
102
|
+
?: run {
|
103
|
+
Log.d(TAG, "No cached token found, returning null user.")
|
104
|
+
return null
|
105
|
+
}
|
104
106
|
return User(
|
105
|
-
|
106
|
-
|
107
|
-
|
107
|
+
id = token.getInfoField<String>("user_id") ?: "unknown",
|
108
|
+
email = token.getInfoField<String>("email") ?: "unknown",
|
109
|
+
accessToken = token.accessToken
|
108
110
|
)
|
109
111
|
}
|
110
112
|
|
111
113
|
fun isAuthenticated(): Boolean {
|
114
|
+
Log.d(TAG, "isAuthenticated called")
|
112
115
|
return this.cachedToken != null
|
113
116
|
}
|
114
117
|
}
|
@@ -4,18 +4,12 @@ import PianoOAuth
|
|
4
4
|
import React
|
5
5
|
|
6
6
|
/// ComposerPianoImpl - Main implementation class for the Piano SDK on iOS.
|
7
|
-
///
|
8
|
-
/// This class is responsible for:
|
9
|
-
/// - Managing the Piano SDK's Composer instance.
|
10
|
-
/// - Configuring the experience request using a fluent builder pattern.
|
11
|
-
/// - Executing Piano experiences and handling results via a delegate.
|
12
|
-
/// - Managing React Native promises across asynchronous callbacks.
|
13
7
|
@objcMembers public class ComposerPianoImpl: NSObject {
|
14
8
|
|
15
9
|
// MARK: - Properties
|
16
10
|
|
17
11
|
private var composer: PianoComposer?
|
18
|
-
|
12
|
+
internal var tokenService: TokenService?
|
19
13
|
private var delegate: MyComposerDelegate?
|
20
14
|
|
21
15
|
var experienceResolver: RCTPromiseResolveBlock?
|
@@ -35,8 +29,8 @@ import React
|
|
35
29
|
*
|
36
30
|
* @param aid The Piano Application ID.
|
37
31
|
*/
|
38
|
-
public func initialize(aid: String) {
|
39
|
-
print("ComposerPianoImpl
|
32
|
+
public func initialize(aid: String, isSandbox: Bool) {
|
33
|
+
print("[ComposerPianoImpl] Initializing with AID: \(aid), isSandbox: \(isSandbox)")
|
40
34
|
|
41
35
|
// 1. Initialize and store the TokenService
|
42
36
|
self.tokenService = TokenService()
|
@@ -44,8 +38,9 @@ import React
|
|
44
38
|
print("ComposerPianoImpl: TokenService initialized")
|
45
39
|
|
46
40
|
// 2. Initialize the Composer instance
|
47
|
-
|
48
|
-
print("ComposerPianoImpl
|
41
|
+
let endpoint = isSandbox ? PianoEndpoint.sandbox : PianoEndpoint.production
|
42
|
+
print("[ComposerPianoImpl] Using endpoint: \(endpoint)")
|
43
|
+
self.composer = PianoComposer(aid: aid, endpoint: endpoint)
|
49
44
|
|
50
45
|
// 3. Initialize and set up the delegate
|
51
46
|
self.delegate = MyComposerDelegate(impl: self)
|
@@ -82,34 +77,43 @@ import React
|
|
82
77
|
// MARK: - Configuration Methods (Setters)
|
83
78
|
|
84
79
|
public func addTag(_ tag: String) {
|
80
|
+
print("[ComposerPianoImpl] Adding tag: \(tag)")
|
85
81
|
self.tags.append(tag)
|
86
82
|
}
|
87
83
|
|
88
84
|
public func addTags(_ tags: [String]) {
|
85
|
+
print("[ComposerPianoImpl] Adding tags: \(tags)")
|
89
86
|
self.tags.append(contentsOf: tags)
|
90
87
|
}
|
91
88
|
|
92
89
|
public func setZoneId(_ zoneId: String) {
|
90
|
+
print("[ComposerPianoImpl] Setting zoneId: \(zoneId)")
|
93
91
|
self.zoneId = zoneId
|
94
92
|
}
|
95
93
|
|
96
94
|
public func setReferrer(_ referrer: String) {
|
95
|
+
print("[ComposerPianoImpl] Setting referrer: \(referrer)")
|
97
96
|
self.referrer = referrer
|
98
97
|
}
|
99
98
|
|
100
99
|
public func setUrl(_ url: String) {
|
100
|
+
print("[ComposerPianoImpl] Setting url: \(url)")
|
101
101
|
self.url = url
|
102
102
|
}
|
103
|
-
|
103
|
+
|
104
104
|
public func setCustomVariables(_ variables: [String: String]) {
|
105
|
+
print("[ComposerPianoImpl] Setting custom variables")
|
105
106
|
self.customVariables = variables
|
106
107
|
}
|
107
108
|
|
108
109
|
public func addCustomVariable(_ name: String, value: String) {
|
110
|
+
print("[ComposerPianoImpl] Adding custom variable: \(name) = \(value)")
|
109
111
|
self.customVariables[name] = value
|
110
112
|
}
|
111
113
|
|
112
114
|
public func setUserToken(_ token: String) {
|
115
|
+
print("[ComposerPianoImpl] Setting userToken")
|
116
|
+
self.userToken = token
|
113
117
|
_ = self.composer?.userToken(token)
|
114
118
|
}
|
115
119
|
|
@@ -132,6 +136,7 @@ import React
|
|
132
136
|
}
|
133
137
|
|
134
138
|
public func clearConfiguration() {
|
139
|
+
print("[ComposerPianoImpl] Clearing all configurations")
|
135
140
|
self.clearTags()
|
136
141
|
self.clearCustomVariables()
|
137
142
|
self.zoneId = nil
|
@@ -147,10 +152,13 @@ import React
|
|
147
152
|
rejecter: @escaping RCTPromiseRejectBlock
|
148
153
|
) {
|
149
154
|
guard let composer = self.composer else {
|
155
|
+
print("[ComposerPianoImpl] ERROR: executeExperience called but composer is not initialized.")
|
150
156
|
rejecter("INIT_ERROR", "Composer not initialized.", nil)
|
151
157
|
return
|
152
158
|
}
|
153
159
|
|
160
|
+
print("[ComposerPianoImpl] Executing experience")
|
161
|
+
|
154
162
|
self.experienceResolver = resolver
|
155
163
|
self.experienceRejecter = rejecter
|
156
164
|
|
@@ -161,10 +169,18 @@ import React
|
|
161
169
|
.referrer(self.referrer ?? "")
|
162
170
|
.url(self.url ?? "")
|
163
171
|
|
164
|
-
|
165
|
-
|
172
|
+
if !self.customVariables.isEmpty {
|
173
|
+
print("[ComposerPianoImpl] Applying \(self.customVariables.count) custom variables...")
|
174
|
+
for (key, value) in self.customVariables {
|
175
|
+
print("[ComposerPianoImpl] - Applying custom variable: '\(key)' = '\(value)'")
|
176
|
+
_ = composer.customVariable(name: key, value: value)
|
177
|
+
}
|
178
|
+
print("[ComposerPianoImpl] Custom variables applied successfully.")
|
179
|
+
} else {
|
180
|
+
print("[ComposerPianoImpl] No custom variables to apply.")
|
166
181
|
}
|
167
182
|
|
183
|
+
print("[ComposerPianoImpl] Calling composer.execute()")
|
168
184
|
composer.execute()
|
169
185
|
}
|
170
186
|
}
|
@@ -2,50 +2,26 @@ import Foundation
|
|
2
2
|
import PianoComposer
|
3
3
|
import React
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
* events from the native Piano SDK and communicate them back to React Native.
|
8
|
-
*/
|
5
|
+
/// MyComposerDelegate - Implements the PianoComposerDelegate protocol to handle
|
6
|
+
/// events from the native Piano SDK and communicate them back to React Native.
|
9
7
|
@objcMembers public class MyComposerDelegate: NSObject, PianoComposerDelegate {
|
10
8
|
|
11
9
|
// MARK: - Properties
|
12
10
|
|
13
|
-
/**
|
14
|
-
* A weak reference back to the main implementation class.
|
15
|
-
* This is used to access the stored promise resolver and rejecter
|
16
|
-
* and to avoid a strong reference cycle (memory leak).
|
17
|
-
*/
|
18
11
|
private weak var impl: ComposerPianoImpl?
|
19
12
|
|
20
|
-
// MARK: - Initialization
|
21
|
-
|
22
|
-
/**
|
23
|
-
* Initializes the delegate with a reference back to the main implementation.
|
24
|
-
*
|
25
|
-
* @param impl The instance of ComposerPianoImpl.
|
26
|
-
*/
|
27
13
|
init(impl: ComposerPianoImpl) {
|
28
14
|
self.impl = impl
|
29
15
|
}
|
30
16
|
|
31
17
|
// MARK: - Promise Handling Helpers
|
32
18
|
|
33
|
-
/**
|
34
|
-
* Resolves the stored promise with the provided event data.
|
35
|
-
*
|
36
|
-
* @param eventData A dictionary representing the event to be sent to JavaScript.
|
37
|
-
*/
|
38
19
|
private func resolvePromise(with eventData: [String: Any]) {
|
39
20
|
guard let resolver = self.impl?.experienceResolver else { return }
|
40
21
|
resolver(eventData)
|
41
22
|
clearPromiseHandlers()
|
42
23
|
}
|
43
24
|
|
44
|
-
/**
|
45
|
-
* Rejects the stored promise with a given error.
|
46
|
-
*
|
47
|
-
* @param error The error that occurred.
|
48
|
-
*/
|
49
25
|
private func rejectPromise(with error: Error) {
|
50
26
|
guard let rejecter = self.impl?.experienceRejecter else { return }
|
51
27
|
let errorCode = "EXECUTION_FAILED"
|
@@ -54,9 +30,6 @@ import React
|
|
54
30
|
clearPromiseHandlers()
|
55
31
|
}
|
56
32
|
|
57
|
-
/**
|
58
|
-
* Clears the stored promise handlers to prevent them from being called more than once.
|
59
|
-
*/
|
60
33
|
private func clearPromiseHandlers() {
|
61
34
|
self.impl?.experienceResolver = nil
|
62
35
|
self.impl?.experienceRejecter = nil
|
@@ -64,46 +37,33 @@ import React
|
|
64
37
|
|
65
38
|
// MARK: - PianoComposerDelegate Implementation
|
66
39
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
print("MyComposerDelegate: Received showTemplate event")
|
73
|
-
let eventData: [String: Any] = [
|
74
|
-
"eventType": "showTemplate",
|
75
|
-
"templateId": params?.templateId ?? "",
|
76
|
-
"templateVariantId": params?.templateVariantId ?? "",
|
77
|
-
"displayMode": params?.displayMode.rawValue ?? "inline",
|
78
|
-
"containerSelector": params?.containerSelector ?? ""
|
79
|
-
]
|
40
|
+
public func showTemplate(
|
41
|
+
composer: PianoComposer, event: XpEvent, params: ShowTemplateEventParams?
|
42
|
+
) {
|
43
|
+
var eventData = paramsToDictionary(params)
|
44
|
+
eventData["eventType"] = "showTemplate"
|
80
45
|
resolvePromise(with: eventData)
|
81
46
|
}
|
82
47
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
"views": params?.views ?? 0,
|
92
|
-
"viewsLeft": params?.viewsLeft ?? 0,
|
93
|
-
"maxViews": params?.maxViews ?? 0
|
94
|
-
]
|
48
|
+
public func meterActive(
|
49
|
+
composer: PianoComposer, event: XpEvent, params: PageViewMeterEventParams?
|
50
|
+
) {
|
51
|
+
print(
|
52
|
+
"[MyComposerDelegate] Received meterActive event for meter: \(params?.meterName ?? "N/A")"
|
53
|
+
)
|
54
|
+
var eventData = paramsToDictionary(params)
|
55
|
+
eventData["eventType"] = "meterActive"
|
95
56
|
resolvePromise(with: eventData)
|
96
57
|
}
|
97
58
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
]
|
59
|
+
public func meterExpired(
|
60
|
+
composer: PianoComposer, event: XpEvent, params: PageViewMeterEventParams?
|
61
|
+
) {
|
62
|
+
print(
|
63
|
+
"[MyComposerDelegate] Received meterExpired event for meter: \(params?.meterName ?? "N/A")"
|
64
|
+
)
|
65
|
+
var eventData = paramsToDictionary(params)
|
66
|
+
eventData["eventType"] = "meterExpired"
|
107
67
|
resolvePromise(with: eventData)
|
108
68
|
}
|
109
69
|
|
@@ -122,20 +82,24 @@ import React
|
|
122
82
|
print("MyComposerDelegate: Received userSegmentFalse event")
|
123
83
|
resolvePromise(with: ["eventType": "userSegmentFalse"])
|
124
84
|
}
|
125
|
-
|
85
|
+
|
126
86
|
/**
|
127
87
|
* A general-purpose callback for when an experience is executed.
|
128
88
|
*/
|
129
|
-
public func experienceExecute(
|
130
|
-
|
131
|
-
|
132
|
-
|
89
|
+
public func experienceExecute(
|
90
|
+
composer: PianoComposer, event: XpEvent, params: ExperienceExecuteEventParams?
|
91
|
+
) {
|
92
|
+
var eventData = paramsToDictionary(params)
|
93
|
+
eventData["eventType"] = "experienceExecute"
|
94
|
+
resolvePromise(with: eventData)
|
133
95
|
}
|
134
96
|
|
135
97
|
/**
|
136
98
|
* Called when an error occurs during the experience execution.
|
137
99
|
*/
|
138
|
-
public func experienceExecutionFailed(
|
100
|
+
public func experienceExecutionFailed(
|
101
|
+
composer: PianoComposer, event: XpEvent, params: FailureEventParams?
|
102
|
+
) {
|
139
103
|
print("MyComposerDelegate: Received experienceExecutionFailed event")
|
140
104
|
let error = NSError(
|
141
105
|
domain: "PianoSDK",
|
@@ -144,5 +108,24 @@ import React
|
|
144
108
|
)
|
145
109
|
rejectPromise(with: error)
|
146
110
|
}
|
147
|
-
}
|
148
111
|
|
112
|
+
// MARK: - Helper Methods
|
113
|
+
|
114
|
+
private func paramsToDictionary(_ params: Any?) -> [String: Any] {
|
115
|
+
var dict = [String: Any]()
|
116
|
+
if let params = params {
|
117
|
+
let mirror = Mirror(reflecting: params)
|
118
|
+
for child in mirror.children {
|
119
|
+
if let label = child.label {
|
120
|
+
// Handle cases where the value might be an enum
|
121
|
+
if let rawValue = (child.value as? any RawRepresentable)?.rawValue {
|
122
|
+
dict[label] = rawValue
|
123
|
+
} else {
|
124
|
+
dict[label] = child.value
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
}
|
129
|
+
return dict
|
130
|
+
}
|
131
|
+
}
|
package/ios/SdkPianoio.swift
CHANGED
@@ -7,20 +7,19 @@ import React
|
|
7
7
|
@objc(SdkPianoio)
|
8
8
|
class SdkPianoio: NSObject {
|
9
9
|
|
10
|
-
|
11
|
-
private var moduleImpl: ComposerPianoImpl?
|
10
|
+
private var moduleImpl: ComposerPianoImpl
|
12
11
|
|
13
12
|
override init() {
|
14
13
|
self.moduleImpl = ComposerPianoImpl()
|
15
14
|
super.init()
|
16
15
|
}
|
17
16
|
|
18
|
-
@objc(initialize:resolver:rejecter:)
|
17
|
+
@objc(initialize:isSandbox:resolver:rejecter:)
|
19
18
|
func initialize(
|
20
|
-
aid: String, resolver: @escaping RCTPromiseResolveBlock,
|
19
|
+
aid: String, isSandbox: Bool, resolver: @escaping RCTPromiseResolveBlock,
|
21
20
|
rejecter: @escaping RCTPromiseRejectBlock
|
22
21
|
) {
|
23
|
-
moduleImpl
|
22
|
+
moduleImpl.initialize(aid: aid, isSandbox: isSandbox)
|
24
23
|
resolver(true)
|
25
24
|
}
|
26
25
|
|
@@ -31,7 +30,7 @@ class SdkPianoio: NSObject {
|
|
31
30
|
tag: String, resolver: @escaping RCTPromiseResolveBlock,
|
32
31
|
rejecter: @escaping RCTPromiseRejectBlock
|
33
32
|
) {
|
34
|
-
moduleImpl
|
33
|
+
moduleImpl.addTag(tag)
|
35
34
|
resolver(true)
|
36
35
|
}
|
37
36
|
|
@@ -40,7 +39,7 @@ class SdkPianoio: NSObject {
|
|
40
39
|
tags: [String], resolver: @escaping RCTPromiseResolveBlock,
|
41
40
|
rejecter: @escaping RCTPromiseRejectBlock
|
42
41
|
) {
|
43
|
-
moduleImpl
|
42
|
+
moduleImpl.addTags(tags)
|
44
43
|
resolver(true)
|
45
44
|
}
|
46
45
|
|
@@ -49,7 +48,7 @@ class SdkPianoio: NSObject {
|
|
49
48
|
zoneId: String, resolver: @escaping RCTPromiseResolveBlock,
|
50
49
|
rejecter: @escaping RCTPromiseRejectBlock
|
51
50
|
) {
|
52
|
-
moduleImpl
|
51
|
+
moduleImpl.setZoneId(zoneId)
|
53
52
|
resolver(true)
|
54
53
|
}
|
55
54
|
|
@@ -58,7 +57,7 @@ class SdkPianoio: NSObject {
|
|
58
57
|
referrer: String, resolver: @escaping RCTPromiseResolveBlock,
|
59
58
|
rejecter: @escaping RCTPromiseRejectBlock
|
60
59
|
) {
|
61
|
-
moduleImpl
|
60
|
+
moduleImpl.setReferrer(referrer)
|
62
61
|
resolver(true)
|
63
62
|
}
|
64
63
|
|
@@ -67,7 +66,7 @@ class SdkPianoio: NSObject {
|
|
67
66
|
url: String, resolver: @escaping RCTPromiseResolveBlock,
|
68
67
|
rejecter: @escaping RCTPromiseRejectBlock
|
69
68
|
) {
|
70
|
-
moduleImpl
|
69
|
+
moduleImpl.setUrl(url)
|
71
70
|
resolver(true)
|
72
71
|
}
|
73
72
|
|
@@ -76,7 +75,7 @@ class SdkPianoio: NSObject {
|
|
76
75
|
token: String, resolver: @escaping RCTPromiseResolveBlock,
|
77
76
|
rejecter: @escaping RCTPromiseRejectBlock
|
78
77
|
) {
|
79
|
-
moduleImpl
|
78
|
+
moduleImpl.setUserToken(token)
|
80
79
|
resolver(true)
|
81
80
|
}
|
82
81
|
|
@@ -85,7 +84,7 @@ class SdkPianoio: NSObject {
|
|
85
84
|
name: String, value: String, resolver: @escaping RCTPromiseResolveBlock,
|
86
85
|
rejecter: @escaping RCTPromiseRejectBlock
|
87
86
|
) {
|
88
|
-
moduleImpl
|
87
|
+
moduleImpl.addCustomVariable(name, value: value)
|
89
88
|
resolver(true)
|
90
89
|
}
|
91
90
|
|
@@ -104,7 +103,7 @@ class SdkPianoio: NSObject {
|
|
104
103
|
func executeExperience(
|
105
104
|
resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock
|
106
105
|
) {
|
107
|
-
moduleImpl
|
106
|
+
moduleImpl.executeExperience(resolver: resolver, rejecter: rejecter)
|
108
107
|
}
|
109
108
|
|
110
109
|
// MARK: - Authentication Methods
|
@@ -113,28 +112,41 @@ class SdkPianoio: NSObject {
|
|
113
112
|
func signIn(
|
114
113
|
resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock
|
115
114
|
) {
|
116
|
-
|
115
|
+
// Correctly call signIn on the tokenService instance
|
116
|
+
moduleImpl.tokenService?.signIn(resolver: resolver, rejecter: rejecter)
|
117
117
|
}
|
118
118
|
|
119
119
|
@objc(signOut:rejecter:)
|
120
120
|
func signOut(
|
121
121
|
resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock
|
122
122
|
) {
|
123
|
-
moduleImpl.signOut(resolver: resolver, rejecter: rejecter)
|
123
|
+
moduleImpl.tokenService?.signOut(resolver: resolver, rejecter: rejecter)
|
124
124
|
}
|
125
125
|
|
126
126
|
@objc(getCurrentUser:rejecter:)
|
127
127
|
func getCurrentUser(
|
128
128
|
resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock
|
129
129
|
) {
|
130
|
-
moduleImpl.getCurrentUser(
|
130
|
+
if let user = moduleImpl.tokenService?.getCurrentUser() {
|
131
|
+
let userMap: [String: Any] = [
|
132
|
+
"success": true,
|
133
|
+
"userId": user.id,
|
134
|
+
"userEmail": user.email,
|
135
|
+
"accessToken": user.accessToken,
|
136
|
+
"authenticated": true,
|
137
|
+
]
|
138
|
+
resolver(userMap)
|
139
|
+
} else {
|
140
|
+
resolver(["success": true, "authenticated": false])
|
141
|
+
}
|
131
142
|
}
|
132
143
|
|
133
144
|
@objc(isAuthenticated:rejecter:)
|
134
145
|
func isAuthenticated(
|
135
146
|
resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock
|
136
147
|
) {
|
137
|
-
moduleImpl.isAuthenticated(
|
148
|
+
let isAuth = moduleImpl.tokenService?.isAuthenticated() ?? false
|
149
|
+
resolver(["authenticated": isAuth])
|
138
150
|
}
|
139
151
|
|
140
152
|
// MARK: - Helper and Cleanup Methods
|
package/ios/SdkPianoioBridge.m
CHANGED
@@ -7,7 +7,7 @@ import { NativeModules, Platform } from 'react-native';
|
|
7
7
|
*/
|
8
8
|
interface SdkPianoioType {
|
9
9
|
// Initialization
|
10
|
-
initialize(aid: string): Promise<boolean>;
|
10
|
+
initialize(aid: string, isSandbox: boolean): Promise<boolean>;
|
11
11
|
|
12
12
|
// Configuration
|
13
13
|
addTag(tag: string): Promise<boolean>;
|
@@ -21,9 +21,9 @@ class PianoComposer {
|
|
21
21
|
* This is the main entry point for using the library.
|
22
22
|
* @param aid Your Application ID from Piano.io
|
23
23
|
*/
|
24
|
-
static async create(aid) {
|
24
|
+
static async create(aid, isSandbox = false) {
|
25
25
|
// Call the corrected native initialize method
|
26
|
-
await _NativeSdkPianoio.default.initialize(aid);
|
26
|
+
await _NativeSdkPianoio.default.initialize(aid, isSandbox);
|
27
27
|
return new PianoComposer();
|
28
28
|
}
|
29
29
|
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_NativeSdkPianoio","_interopRequireDefault","require","e","__esModule","default","PianoComposer","constructor","create","aid","SdkPianoio","initialize","addTag","tag","addTags","tags","setZoneId","zoneId","setReferrer","referrer","setCustomVariable","name","value","addCustomVariable","setCustomVariables","variables","setUserToken","token","setUrl","url","signIn","signOut","getCurrentUser","isAuthenticated","executeExperience","getStatus","clearConfiguration","_default","exports"],"sourceRoot":"../../src","sources":["PianoComposer.tsx"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA4C,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE5C;AACA;AACA;AACA;AACA,MAAMG,aAAa,CAAC;EAClB;EACQC,WAAWA,CAAA,EAAG;IACpB;EAAA;;EAGF;AACF;AACA;AACA;AACA;EACE,aAAaC,MAAMA,
|
1
|
+
{"version":3,"names":["_NativeSdkPianoio","_interopRequireDefault","require","e","__esModule","default","PianoComposer","constructor","create","aid","isSandbox","SdkPianoio","initialize","addTag","tag","addTags","tags","setZoneId","zoneId","setReferrer","referrer","setCustomVariable","name","value","addCustomVariable","setCustomVariables","variables","setUserToken","token","setUrl","url","signIn","signOut","getCurrentUser","isAuthenticated","executeExperience","getStatus","clearConfiguration","_default","exports"],"sourceRoot":"../../src","sources":["PianoComposer.tsx"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA4C,SAAAD,uBAAAE,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE5C;AACA;AACA;AACA;AACA,MAAMG,aAAa,CAAC;EAClB;EACQC,WAAWA,CAAA,EAAG;IACpB;EAAA;;EAGF;AACF;AACA;AACA;AACA;EACE,aAAaC,MAAMA,CACjBC,GAAW,EACXC,SAAkB,GAAG,KAAK,EACF;IACxB;IACA,MAAMC,yBAAU,CAACC,UAAU,CAACH,GAAG,EAAEC,SAAS,CAAC;IAC3C,OAAO,IAAIJ,aAAa,CAAC,CAAC;EAC5B;;EAEA;;EAEA,MAAMO,MAAMA,CAACC,GAAW,EAAoB;IAC1C,OAAOH,yBAAU,CAACE,MAAM,CAACC,GAAG,CAAC;EAC/B;EAEA,MAAMC,OAAOA,CAACC,IAAc,EAAoB;IAC9C,OAAOL,yBAAU,CAACI,OAAO,CAACC,IAAI,CAAC;EACjC;EAEA,MAAMC,SAASA,CAACC,MAAc,EAAoB;IAChD,OAAOP,yBAAU,CAACM,SAAS,CAACC,MAAM,CAAC;EACrC;EAEA,MAAMC,WAAWA,CAACC,QAAgB,EAAoB;IACpD,OAAOT,yBAAU,CAACQ,WAAW,CAACC,QAAQ,CAAC;EACzC;EAEA,MAAMC,iBAAiBA,CAACC,IAAY,EAAEC,KAAa,EAAoB;IACrE,OAAOZ,yBAAU,CAACa,iBAAiB,CAACF,IAAI,EAAEC,KAAK,CAAC;EAClD;EAEA,MAAME,kBAAkBA,CAACC,SAExB,EAAoB;IACnB,OAAOf,yBAAU,CAACc,kBAAkB,CAACC,SAAS,CAAC;EACjD;EAEA,MAAMC,YAAYA,CAACC,KAAa,EAAoB;IAClD,OAAOjB,yBAAU,CAACgB,YAAY,CAACC,KAAK,CAAC;EACvC;EAEA,MAAMC,MAAMA,CAACC,GAAW,EAAoB;IAC1C,OAAOnB,yBAAU,CAACkB,MAAM,CAACC,GAAG,CAAC;EAC/B;;EAEA;;EAEA;AACF;AACA;AACA;EACE,MAAMC,MAAMA,CAAA,EAAiB;IAC3B,OAAOpB,yBAAU,CAACoB,MAAM,CAAC,CAAC;EAC5B;;EAEA;AACF;AACA;AACA;EACE,MAAMC,OAAOA,CAAA,EAAiB;IAC5B,OAAOrB,yBAAU,CAACqB,OAAO,CAAC,CAAC;EAC7B;;EAEA;AACF;AACA;AACA;EACE,MAAMC,cAAcA,CAAA,EAAiB;IACnC,OAAOtB,yBAAU,CAACsB,cAAc,CAAC,CAAC;EACpC;;EAEA;AACF;AACA;AACA;EACE,MAAMC,eAAeA,CAAA,EAAiB;IACpC,OAAOvB,yBAAU,CAACuB,eAAe,CAAC,CAAC;EACrC;;EAEA;;EAEA;AACF;AACA;AACA;AACA;EACE,MAAMC,iBAAiBA,CAAA,EAAiB;IACtC,OAAOxB,yBAAU,CAACwB,iBAAiB,CAAC,CAAC;EACvC;;EAEA;;EAEA;AACF;AACA;AACA;EACE,MAAMC,SAASA,CAAA,EAAiB;IAC9B,OAAOzB,yBAAU,CAACyB,SAAS,CAAC,CAAC;EAC/B;;EAEA;AACF;AACA;AACA;EACE,MAAMC,kBAAkBA,CAAA,EAAqB;IAC3C,OAAO1B,yBAAU,CAAC0B,kBAAkB,CAAC,CAAC;EACxC;AACF;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAlC,OAAA,GAEcC,aAAa","ignoreList":[]}
|
@@ -7,7 +7,7 @@ import { NativeModules, Platform } from 'react-native';
|
|
7
7
|
*/
|
8
8
|
interface SdkPianoioType {
|
9
9
|
// Initialization
|
10
|
-
initialize(aid: string): Promise<boolean>;
|
10
|
+
initialize(aid: string, isSandbox: boolean): Promise<boolean>;
|
11
11
|
|
12
12
|
// Configuration
|
13
13
|
addTag(tag: string): Promise<boolean>;
|