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.
@@ -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
- * This custom class simplifies passing user data back to React Native.
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) return
39
- println("TokenService: Initializing with AID: $aid")
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
- println("TokenService: Initialization completed successfully")
43
+ Log.d(TAG, "Initialization completed successfully")
49
44
  } catch (e: Exception) {
50
- println("TokenService: Error during initialization: ${e.message}")
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
- println("TokenService: Not initialized. Call initialize() first.")
60
+ Log.w(TAG, "signIn called but not initialized.")
65
61
  return
66
62
  }
67
- println("TokenService: Launching sign in flow")
68
- val request = localClient.signIn() // This returns a SignInContext
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
- println("TokenService: Not initialized.")
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
- println("TokenService: No user is signed in.")
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
- println("TokenService: Starting sign out")
83
+ Log.d(TAG, "Starting sign out network request")
87
84
  localClient.signOut(token) {
88
85
  if (it.isSuccess) {
89
- println("TokenService: Sign out successful")
90
- this.cachedToken = null // Clear the cached token
86
+ Log.d(TAG, "Sign out successful")
87
+ this.cachedToken = null
91
88
  callback(true)
92
89
  } else {
93
- println("TokenService: Sign out failed: ${it.exceptionOrNull()?.message}")
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
- val token = this.cachedToken ?: return null
103
- // Construct a user from the token information using the getInfoField method.
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
- id = token.getInfoField<String>("user_id") ?: "unknown",
106
- email = token.getInfoField<String>("email") ?: "unknown",
107
- accessToken = token.accessToken
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
- private var tokenService: TokenService?
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: Initializing with AID: \(aid)")
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
- self.composer = PianoComposer(aid: aid, endpoint: PianoEndpoint.production)
48
- print("ComposerPianoImpl: Composer instance created for PRODUCTION")
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
- for (key, value) in self.customVariables {
165
- _ = composer.customVariable(name: key, value: value)
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
- * MyComposerDelegate - Implements the PianoComposerDelegate protocol to handle
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
- * Called when a 'showTemplate' event is received from the Piano backend.
69
- * This is the primary event for displaying a paywall or other experience.
70
- */
71
- public func showTemplate(composer: PianoComposer, event: XpEvent, params: ShowTemplateEventParams?) {
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
- * Called when a meter is active.
85
- */
86
- public func meterActive(composer: PianoComposer, event: XpEvent, params: PageViewMeterEventParams?) {
87
- print("MyComposerDelegate: Received meterActive event")
88
- let eventData: [String: Any] = [
89
- "eventType": "meterActive",
90
- "meterName": params?.meterName ?? "",
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
- * Called when a meter has expired.
100
- */
101
- public func meterExpired(composer: PianoComposer, event: XpEvent, params: PageViewMeterEventParams?) {
102
- print("MyComposerDelegate: Received meterExpired event")
103
- let eventData: [String: Any] = [
104
- "eventType": "meterExpired",
105
- "meterName": params?.meterName ?? ""
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(composer: PianoComposer, event: XpEvent, params: ExperienceExecuteEventParams?) {
130
- print("MyComposerDelegate: Received experienceExecute event")
131
- // This is often a good place to resolve the promise if no other specific event is expected.
132
- resolvePromise(with: ["eventType": "experienceExecute"])
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(composer: PianoComposer, event: XpEvent, params: FailureEventParams?) {
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
+ }
@@ -7,20 +7,19 @@ import React
7
7
  @objc(SdkPianoio)
8
8
  class SdkPianoio: NSObject {
9
9
 
10
- // The single, persistent instance of our implementation class.
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?.initialize(aid: aid)
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?.addTag(tag)
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?.addTags(tags)
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?.setZoneId(zoneId)
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?.setReferrer(referrer)
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?.setUrl(url)
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?.setUserToken(token)
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?.addCustomVariable(name, value: value)
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?.executeExperience(resolver: resolver, rejecter: rejecter)
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
- moduleImpl.signIn(resolver: resolver, rejecter: rejecter)
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(resolver: resolver, rejecter: rejecter)
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(resolver: resolver, rejecter: rejecter)
148
+ let isAuth = moduleImpl.tokenService?.isAuthenticated() ?? false
149
+ resolver(["authenticated": isAuth])
138
150
  }
139
151
 
140
152
  // MARK: - Helper and Cleanup Methods
@@ -6,6 +6,7 @@
6
6
  // MARK: - Initialization
7
7
 
8
8
  RCT_EXTERN_METHOD(initialize:(NSString *)aid
9
+ isSandbox:(BOOL)isSandbox
9
10
  resolver:(RCTPromiseResolveBlock)resolve
10
11
  rejecter:(RCTPromiseRejectBlock)reject)
11
12
 
@@ -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,CAACC,GAAW,EAA0B;IACvD;IACA,MAAMC,yBAAU,CAACC,UAAU,CAACF,GAAG,CAAC;IAChC,OAAO,IAAIH,aAAa,CAAC,CAAC;EAC5B;;EAEA;;EAEA,MAAMM,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,SAAoC,EAAoB;IAC/E,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,CAAAjC,OAAA,GAEcC,aAAa","ignoreList":[]}
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>;