expo-helium 3.1.13 → 3.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.
- package/android/build.gradle +1 -1
- package/android/src/main/java/expo/modules/paywallsdk/HeliumPaywallSdkModule.kt +129 -89
- package/build/HeliumPaywallSdk.types.d.ts +12 -13
- package/build/HeliumPaywallSdk.types.d.ts.map +1 -1
- package/build/HeliumPaywallSdk.types.js.map +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +36 -2
- package/build/index.js.map +1 -1
- package/ios/HeliumPaywallSdk.podspec +2 -2
- package/ios/HeliumPaywallSdkModule.swift +72 -49
- package/package.json +1 -1
- package/src/HeliumPaywallSdk.types.ts +13 -14
- package/src/index.ts +41 -2
package/android/build.gradle
CHANGED
|
@@ -43,7 +43,7 @@ android {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
dependencies {
|
|
46
|
-
implementation("com.tryhelium.paywall:core:0.1
|
|
46
|
+
implementation("com.tryhelium.paywall:core:4.0.1")
|
|
47
47
|
implementation("com.google.code.gson:gson:2.10.1")
|
|
48
48
|
implementation("com.android.billingclient:billing:8.0.0")
|
|
49
49
|
implementation("org.jetbrains.kotlin:kotlin-reflect")
|
|
@@ -15,15 +15,14 @@ import com.tryhelium.paywall.core.HeliumEnvironment
|
|
|
15
15
|
import com.tryhelium.paywall.core.event.HeliumEvent
|
|
16
16
|
import com.tryhelium.paywall.core.event.HeliumEventDictionaryMapper
|
|
17
17
|
import com.tryhelium.paywall.core.event.PaywallEventHandlers
|
|
18
|
-
import com.tryhelium.paywall.core.HeliumFallbackConfig
|
|
19
|
-
import com.tryhelium.paywall.core.HeliumIdentityManager
|
|
20
18
|
import com.tryhelium.paywall.core.HeliumUserTraits
|
|
21
19
|
import com.tryhelium.paywall.core.HeliumUserTraitsArgument
|
|
22
20
|
import com.tryhelium.paywall.core.HeliumPaywallTransactionStatus
|
|
23
21
|
import com.tryhelium.paywall.core.HeliumLightDarkMode
|
|
24
|
-
import com.tryhelium.paywall.core.
|
|
22
|
+
import com.tryhelium.paywall.core.PaywallPresentationConfig
|
|
25
23
|
import com.tryhelium.paywall.delegate.HeliumPaywallDelegate
|
|
26
24
|
import com.tryhelium.paywall.delegate.PlayStorePaywallDelegate
|
|
25
|
+
import com.tryhelium.paywall.core.logger.HeliumLogger
|
|
27
26
|
import com.android.billingclient.api.ProductDetails
|
|
28
27
|
import kotlinx.coroutines.suspendCancellableCoroutine
|
|
29
28
|
import java.lang.ref.WeakReference
|
|
@@ -165,7 +164,7 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
165
164
|
}
|
|
166
165
|
|
|
167
166
|
// Defines event names that the module can send to JavaScript
|
|
168
|
-
Events("onHeliumPaywallEvent", "onDelegateActionEvent", "paywallEventHandlers")
|
|
167
|
+
Events("onHeliumPaywallEvent", "onDelegateActionEvent", "paywallEventHandlers", "onHeliumLogEvent")
|
|
169
168
|
|
|
170
169
|
// Lifecycle event to cache Activity reference for hot reload resilience
|
|
171
170
|
OnActivityEntersForeground {
|
|
@@ -193,12 +192,15 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
193
192
|
|
|
194
193
|
@Suppress("UNCHECKED_CAST")
|
|
195
194
|
val paywallLoadingConfigMap = convertMarkersToBooleans(config["paywallLoadingConfig"] as? Map<String, Any?>)
|
|
196
|
-
val
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
195
|
+
val useLoadingState = paywallLoadingConfigMap?.get("useLoadingState") as? Boolean ?: true
|
|
196
|
+
val loadingBudgetSeconds = (paywallLoadingConfigMap?.get("loadingBudget") as? Number)?.toDouble()
|
|
197
|
+
val loadingBudgetMs = loadingBudgetSeconds?.let { (it * 1000).toLong() } ?: DEFAULT_LOADING_BUDGET_MS
|
|
198
|
+
if (!useLoadingState) {
|
|
199
|
+
// Setting <= 0 will disable loading state
|
|
200
|
+
Helium.config.defaultLoadingBudgetInMs = -1
|
|
201
|
+
} else {
|
|
202
|
+
Helium.config.defaultLoadingBudgetInMs = loadingBudgetMs ?: DEFAULT_LOADING_BUDGET_MS
|
|
203
|
+
}
|
|
202
204
|
|
|
203
205
|
// Parse environment parameter, defaulting to PRODUCTION
|
|
204
206
|
val environmentString = config["environment"] as? String
|
|
@@ -221,7 +223,10 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
221
223
|
}
|
|
222
224
|
|
|
223
225
|
val wrapperSdkVersion = config["wrapperSdkVersion"] as? String ?: "unknown"
|
|
224
|
-
|
|
226
|
+
Helium.config.setWrapperSdkInfo(sdk = "expo", version = wrapperSdkVersion)
|
|
227
|
+
|
|
228
|
+
// Set up bridging logger to forward native SDK logs to JavaScript
|
|
229
|
+
Helium.config.logger = BridgingLogger()
|
|
225
230
|
|
|
226
231
|
val delegateType = config["delegateType"] as? String ?: "custom"
|
|
227
232
|
|
|
@@ -238,20 +243,23 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
238
243
|
CustomPaywallDelegate(delegateType, delegateEventHandler)
|
|
239
244
|
}
|
|
240
245
|
|
|
246
|
+
customUserId?.let { Helium.identity.userId = it }
|
|
247
|
+
customUserTraits?.let { Helium.identity.setUserTraits(it) }
|
|
248
|
+
revenueCatAppUserId?.let { Helium.identity.revenueCatAppUserId = it }
|
|
249
|
+
|
|
250
|
+
Helium.config.heliumPaywallDelegate = delegate
|
|
251
|
+
customAPIEndpoint?.let { Helium.config.customApiEndpoint = it }
|
|
252
|
+
|
|
253
|
+
setupFallbackBundle(context, fallbackBundleUrlString, fallbackBundleString)
|
|
254
|
+
|
|
241
255
|
Helium.initialize(
|
|
242
256
|
context = context,
|
|
243
257
|
apiKey = apiKey,
|
|
244
|
-
|
|
245
|
-
customUserId = customUserId,
|
|
246
|
-
customApiEndpoint = customAPIEndpoint,
|
|
247
|
-
customUserTraits = customUserTraits,
|
|
248
|
-
revenueCatAppUserId = revenueCatAppUserId,
|
|
249
|
-
fallbackConfig = fallbackConfig,
|
|
250
|
-
environment = environment
|
|
258
|
+
environment = environment,
|
|
251
259
|
)
|
|
252
260
|
} catch (e: Exception) {
|
|
253
261
|
// Log error but don't throw - initialization errors will be handled by SDK
|
|
254
|
-
|
|
262
|
+
Helium.config.logger?.e("Failed to initialize: ${e.message}")
|
|
255
263
|
}
|
|
256
264
|
}
|
|
257
265
|
|
|
@@ -316,23 +324,28 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
316
324
|
onCustomPaywallAction = { event -> sendPaywallEvent(event) }
|
|
317
325
|
)
|
|
318
326
|
|
|
319
|
-
Helium.
|
|
327
|
+
Helium.presentPaywall(
|
|
320
328
|
trigger = trigger,
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
329
|
+
config = PaywallPresentationConfig(
|
|
330
|
+
fromActivityContext = activity,
|
|
331
|
+
customPaywallTraits = convertedTraits,
|
|
332
|
+
dontShowIfAlreadyEntitled = dontShowIfAlreadyEntitled ?: false
|
|
333
|
+
),
|
|
334
|
+
eventListener = eventHandlers,
|
|
335
|
+
onPaywallNotShown = { _ ->
|
|
336
|
+
// nothing for now
|
|
337
|
+
}
|
|
325
338
|
)
|
|
326
339
|
}
|
|
327
340
|
|
|
328
341
|
// Hide the current upsell
|
|
329
342
|
Function("hideUpsell") {
|
|
330
|
-
Helium.
|
|
343
|
+
Helium.hidePaywall()
|
|
331
344
|
}
|
|
332
345
|
|
|
333
346
|
// Hide all upsells
|
|
334
347
|
Function("hideAllUpsells") {
|
|
335
|
-
Helium.
|
|
348
|
+
Helium.hideAllPaywalls()
|
|
336
349
|
}
|
|
337
350
|
|
|
338
351
|
// Get download status of paywall assets
|
|
@@ -375,17 +388,17 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
375
388
|
|
|
376
389
|
// Set RevenueCat app user ID
|
|
377
390
|
Function("setRevenueCatAppUserId") { rcAppUserId: String ->
|
|
378
|
-
|
|
391
|
+
Helium.identity.revenueCatAppUserId = rcAppUserId
|
|
379
392
|
}
|
|
380
393
|
|
|
381
394
|
// Set custom user ID
|
|
382
395
|
Function("setCustomUserId") { newUserId: String ->
|
|
383
|
-
Helium.
|
|
396
|
+
Helium.identity.userId = newUserId
|
|
384
397
|
}
|
|
385
398
|
|
|
386
399
|
// Check if user has entitlement for a specific paywall
|
|
387
400
|
AsyncFunction("hasEntitlementForPaywall") Coroutine { trigger: String ->
|
|
388
|
-
val result = Helium.
|
|
401
|
+
val result = Helium.entitlements.hasEntitlementForPaywall(trigger)
|
|
389
402
|
return@Coroutine HasEntitlementResult().apply {
|
|
390
403
|
hasEntitlement = result
|
|
391
404
|
}
|
|
@@ -393,12 +406,12 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
393
406
|
|
|
394
407
|
// Check if user has any active subscription
|
|
395
408
|
AsyncFunction("hasAnyActiveSubscription") Coroutine { ->
|
|
396
|
-
return@Coroutine Helium.
|
|
409
|
+
return@Coroutine Helium.entitlements.hasAnyActiveSubscription()
|
|
397
410
|
}
|
|
398
411
|
|
|
399
412
|
// Check if user has any entitlement
|
|
400
413
|
AsyncFunction("hasAnyEntitlement") Coroutine { ->
|
|
401
|
-
return@Coroutine Helium.
|
|
414
|
+
return@Coroutine Helium.entitlements.hasAnyEntitlement()
|
|
402
415
|
}
|
|
403
416
|
|
|
404
417
|
// Handle deep link
|
|
@@ -409,7 +422,7 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
409
422
|
|
|
410
423
|
// Get experiment info for a trigger
|
|
411
424
|
Function("getExperimentInfoForTrigger") { trigger: String ->
|
|
412
|
-
val experimentInfo = Helium.
|
|
425
|
+
val experimentInfo = Helium.experiments.getExperimentInfoForTrigger(trigger)
|
|
413
426
|
|
|
414
427
|
return@Function if (experimentInfo == null) {
|
|
415
428
|
mapOf<String, Any?>(
|
|
@@ -445,6 +458,8 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
445
458
|
|
|
446
459
|
// Reset Helium SDK
|
|
447
460
|
Function("resetHelium") {
|
|
461
|
+
// Reset logger back to default stdout logger
|
|
462
|
+
Helium.config.logger = HeliumLogger.Stdout
|
|
448
463
|
Helium.resetHelium()
|
|
449
464
|
}
|
|
450
465
|
|
|
@@ -535,69 +550,36 @@ class HeliumPaywallSdkModule : Module() {
|
|
|
535
550
|
}
|
|
536
551
|
}
|
|
537
552
|
|
|
538
|
-
|
|
539
|
-
|
|
553
|
+
/**
|
|
554
|
+
* Sets up the fallback bundle by writing it to the helium_local directory where the SDK expects it.
|
|
555
|
+
* Accepts either a URL string pointing to an existing file, or a JSON string to write directly.
|
|
556
|
+
*/
|
|
557
|
+
private fun setupFallbackBundle(
|
|
558
|
+
context: android.content.Context,
|
|
540
559
|
fallbackBundleUrlString: String?,
|
|
541
|
-
fallbackBundleString: String
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
// Extract loading config settings
|
|
545
|
-
val useLoadingState = paywallLoadingConfig?.get("useLoadingState") as? Boolean ?: true
|
|
546
|
-
val loadingBudgetSeconds = (paywallLoadingConfig?.get("loadingBudget") as? Number)?.toDouble()
|
|
547
|
-
val loadingBudget = loadingBudgetSeconds?.let { (it * 1000).toLong() } ?: DEFAULT_LOADING_BUDGET_MS
|
|
548
|
-
|
|
549
|
-
// Parse perTriggerLoadingConfig if present
|
|
550
|
-
var perTriggerLoadingConfig: Map<String, HeliumFallbackConfig>? = null
|
|
551
|
-
val perTriggerDict = paywallLoadingConfig?.get("perTriggerLoadingConfig") as? Map<*, *>
|
|
552
|
-
if (perTriggerDict != null) {
|
|
553
|
-
@Suppress("UNCHECKED_CAST")
|
|
554
|
-
perTriggerLoadingConfig = perTriggerDict.mapNotNull { (key, value) ->
|
|
555
|
-
if (key is String && value is Map<*, *>) {
|
|
556
|
-
val config = value as? Map<String, Any?>
|
|
557
|
-
val triggerUseLoadingState = config?.get("useLoadingState") as? Boolean
|
|
558
|
-
val triggerLoadingBudgetSeconds = (config?.get("loadingBudget") as? Number)?.toDouble()
|
|
559
|
-
val triggerLoadingBudget = triggerLoadingBudgetSeconds?.let { (it * 1000).toLong() }
|
|
560
|
-
key to HeliumFallbackConfig(
|
|
561
|
-
useLoadingState = triggerUseLoadingState ?: true,
|
|
562
|
-
loadingBudgetInMs = triggerLoadingBudget ?: DEFAULT_LOADING_BUDGET_MS
|
|
563
|
-
)
|
|
564
|
-
} else {
|
|
565
|
-
null
|
|
566
|
-
}
|
|
567
|
-
}.toMap() as? Map<String, HeliumFallbackConfig>
|
|
568
|
-
}
|
|
560
|
+
fallbackBundleString: String?
|
|
561
|
+
) {
|
|
562
|
+
if (fallbackBundleUrlString == null && fallbackBundleString == null) return
|
|
569
563
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
if (
|
|
578
|
-
|
|
579
|
-
val sourceFile = java.io.File(java.net.URI.create(fallbackBundleUrlString))
|
|
580
|
-
if (sourceFile.exists()) {
|
|
581
|
-
sourceFile.copyTo(destinationFile, overwrite = true)
|
|
582
|
-
fallbackBundleName = "helium-fallback.json"
|
|
583
|
-
}
|
|
584
|
-
} else if (fallbackBundleString != null) {
|
|
585
|
-
// Write fallback bundle string to file
|
|
586
|
-
destinationFile.writeText(fallbackBundleString)
|
|
587
|
-
fallbackBundleName = "helium-fallback.json"
|
|
564
|
+
try {
|
|
565
|
+
val heliumLocalDir = context.getDir("helium_local", android.content.Context.MODE_PRIVATE)
|
|
566
|
+
val destinationFile = java.io.File(heliumLocalDir, "helium-expo-fallbacks.json")
|
|
567
|
+
|
|
568
|
+
if (fallbackBundleUrlString != null) {
|
|
569
|
+
// Copy file from Expo's document directory to helium_local
|
|
570
|
+
val sourceFile = java.io.File(java.net.URI.create(fallbackBundleUrlString))
|
|
571
|
+
if (sourceFile.exists()) {
|
|
572
|
+
sourceFile.copyTo(destinationFile, overwrite = true)
|
|
588
573
|
}
|
|
589
|
-
}
|
|
590
|
-
//
|
|
574
|
+
} else if (fallbackBundleString != null) {
|
|
575
|
+
// Write fallback bundle string to file
|
|
576
|
+
destinationFile.writeText(fallbackBundleString)
|
|
591
577
|
}
|
|
578
|
+
} catch (e: Exception) {
|
|
579
|
+
Helium.config.logger?.e("Failed to write fallback bundle: ${e.message}")
|
|
592
580
|
}
|
|
593
|
-
|
|
594
|
-
return HeliumFallbackConfig(
|
|
595
|
-
useLoadingState = useLoadingState,
|
|
596
|
-
loadingBudgetInMs = loadingBudget,
|
|
597
|
-
perTriggerLoadingConfig = perTriggerLoadingConfig,
|
|
598
|
-
fallbackBundleName = fallbackBundleName
|
|
599
|
-
)
|
|
600
581
|
}
|
|
582
|
+
|
|
601
583
|
}
|
|
602
584
|
|
|
603
585
|
/**
|
|
@@ -688,3 +670,61 @@ class DefaultPaywallDelegate(
|
|
|
688
670
|
eventHandler(event)
|
|
689
671
|
}
|
|
690
672
|
}
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* Bridging logger that forwards native SDK logs to JavaScript while also
|
|
676
|
+
* logging to stdout (logcat) for local debugging.
|
|
677
|
+
*
|
|
678
|
+
* Log level mapping to match iOS:
|
|
679
|
+
* - e (error) -> level 1
|
|
680
|
+
* - w (warn) -> level 2
|
|
681
|
+
* - i (info) -> level 3
|
|
682
|
+
* - d (debug) -> level 4
|
|
683
|
+
* - v (verbose/trace) -> level 5
|
|
684
|
+
*/
|
|
685
|
+
class BridgingLogger : HeliumLogger {
|
|
686
|
+
override val logTag: String = "Helium"
|
|
687
|
+
|
|
688
|
+
// Also log to stdout so logcat still works
|
|
689
|
+
private val stdoutLogger = HeliumLogger.Stdout
|
|
690
|
+
|
|
691
|
+
override fun e(message: String) {
|
|
692
|
+
stdoutLogger.e(message)
|
|
693
|
+
sendLogEvent(level = 1, message = message)
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
override fun w(message: String) {
|
|
697
|
+
stdoutLogger.w(message)
|
|
698
|
+
sendLogEvent(level = 2, message = message)
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
override fun i(message: String) {
|
|
702
|
+
stdoutLogger.i(message)
|
|
703
|
+
sendLogEvent(level = 3, message = message)
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
override fun d(message: String) {
|
|
707
|
+
stdoutLogger.d(message)
|
|
708
|
+
sendLogEvent(level = 4, message = message)
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
override fun v(message: String) {
|
|
712
|
+
stdoutLogger.v(message)
|
|
713
|
+
sendLogEvent(level = 5, message = message)
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
private fun sendLogEvent(level: Int, message: String) {
|
|
717
|
+
// Drop log events if no module is available - don't queue them.
|
|
718
|
+
// Logs could be high-volume and could evict critical events (purchase/restore).
|
|
719
|
+
// Plus they're already going to logcat via stdoutLogger anyway.
|
|
720
|
+
if (NativeModuleManager.currentModule == null) return
|
|
721
|
+
|
|
722
|
+
val eventData = mapOf(
|
|
723
|
+
"level" to level,
|
|
724
|
+
"category" to logTag,
|
|
725
|
+
"message" to "[$logTag] $message",
|
|
726
|
+
"metadata" to emptyMap<String, String>()
|
|
727
|
+
)
|
|
728
|
+
NativeModuleManager.safeSendEvent("onHeliumLogEvent", eventData)
|
|
729
|
+
}
|
|
730
|
+
}
|
|
@@ -6,7 +6,19 @@ export type HeliumPaywallSdkModuleEvents = {
|
|
|
6
6
|
onHeliumPaywallEvent: (params: HeliumPaywallEvent) => void;
|
|
7
7
|
onDelegateActionEvent: (params: DelegateActionEvent) => void;
|
|
8
8
|
paywallEventHandlers: (params: HeliumPaywallEvent) => void;
|
|
9
|
+
onHeliumLogEvent: (params: HeliumLogEvent) => void;
|
|
9
10
|
};
|
|
11
|
+
/** A log event emitted by the Helium SDK. */
|
|
12
|
+
export interface HeliumLogEvent {
|
|
13
|
+
/** Numeric log level (1=error, 2=warn, 3=info, 4=debug, 5=trace). */
|
|
14
|
+
level: number;
|
|
15
|
+
/** The category/subsystem that generated this log (iOS) or tag (Android). */
|
|
16
|
+
category: string;
|
|
17
|
+
/** The log message (prefixed with "[Helium] "). */
|
|
18
|
+
message: string;
|
|
19
|
+
/** Key-value metadata associated with this log event (iOS only, empty on Android). */
|
|
20
|
+
metadata: Record<string, string>;
|
|
21
|
+
}
|
|
10
22
|
export type HeliumPaywallEvent = {
|
|
11
23
|
type: 'paywallOpen' | 'paywallClose' | 'paywallDismissed' | 'paywallOpenFailed' | 'paywallSkipped' | 'paywallButtonPressed' | 'productSelected' | 'purchasePressed' | 'purchaseSucceeded' | 'purchaseCancelled' | 'purchaseFailed' | 'purchaseRestored' | 'purchaseRestoreFailed' | 'purchasePending' | 'initializeStart' | 'paywallsDownloadSuccess' | 'paywallsDownloadError' | 'paywallWebViewRendered' | 'customPaywallAction' | 'userAllocated';
|
|
12
24
|
triggerName?: string;
|
|
@@ -92,12 +104,6 @@ export declare function createCustomPurchaseConfig(callbacks: {
|
|
|
92
104
|
makePurchaseAndroid?: (productId: string, basePlanId?: string, offerId?: string) => Promise<HeliumPurchaseResult>;
|
|
93
105
|
restorePurchases: () => Promise<boolean>;
|
|
94
106
|
}): HeliumPurchaseConfig;
|
|
95
|
-
export type TriggerLoadingConfig = {
|
|
96
|
-
/** Whether to show loading state for this trigger. Set to nil to use the global `useLoadingState` setting. */
|
|
97
|
-
useLoadingState?: boolean;
|
|
98
|
-
/** Maximum seconds to show loading for this trigger. Set to nil to use the global `loadingBudget` setting. */
|
|
99
|
-
loadingBudget?: number;
|
|
100
|
-
};
|
|
101
107
|
export type HeliumPaywallLoadingConfig = {
|
|
102
108
|
/**
|
|
103
109
|
* Whether to show a loading state while fetching paywall configuration.
|
|
@@ -111,13 +117,6 @@ export type HeliumPaywallLoadingConfig = {
|
|
|
111
117
|
* Default: 7.0 seconds
|
|
112
118
|
*/
|
|
113
119
|
loadingBudget?: number;
|
|
114
|
-
/**
|
|
115
|
-
* Optional per-trigger loading configuration overrides.
|
|
116
|
-
* Use this to customize loading behavior for specific triggers.
|
|
117
|
-
* Keys are trigger names, values are TriggerLoadingConfig instances.
|
|
118
|
-
* Example: Disable loading for "onboarding" trigger while keeping it for others.
|
|
119
|
-
*/
|
|
120
|
-
perTriggerLoadingConfig?: Record<string, TriggerLoadingConfig>;
|
|
121
120
|
};
|
|
122
121
|
export interface HeliumConfig {
|
|
123
122
|
/** Your Helium API Key */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeliumPaywallSdk.types.d.ts","sourceRoot":"","sources":["../src/HeliumPaywallSdk.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,oBAAoB,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC3D,qBAAqB,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC7D,oBAAoB,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"HeliumPaywallSdk.types.d.ts","sourceRoot":"","sources":["../src/HeliumPaywallSdk.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HeliumPaywallSdk.types.js","sourceRoot":"","sources":["../src/HeliumPaywallSdk.types.ts"],"names":[],"mappings":"AAuGA,sDAAsD;AACtD,MAAM,UAAU,0BAA0B,CAAC,SAM1C;IACC,OAAO;QACL,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,eAAe,EAAE,SAAS,CAAC,eAAe;QAC1C,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;QAClD,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;KAC7C,CAAC;AACJ,CAAC;AAuJD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;CACrC,CAAA","sourcesContent":["import type { StyleProp, ViewStyle } from 'react-native';\n\nexport type OnLoadEventPayload = {\n url: string;\n};\n\nexport type HeliumPaywallSdkModuleEvents = {\n onHeliumPaywallEvent: (params: HeliumPaywallEvent) => void;\n onDelegateActionEvent: (params: DelegateActionEvent) => void;\n paywallEventHandlers: (params: HeliumPaywallEvent) => void;\n};\nexport type HeliumPaywallEvent = {\n type: 'paywallOpen' | 'paywallClose' | 'paywallDismissed' |\n 'paywallOpenFailed' | 'paywallSkipped' | 'paywallButtonPressed' |\n 'productSelected' | 'purchasePressed' | 'purchaseSucceeded' |\n 'purchaseCancelled' | 'purchaseFailed' | 'purchaseRestored' |\n 'purchaseRestoreFailed' | 'purchasePending' | 'initializeStart' |\n 'paywallsDownloadSuccess' | 'paywallsDownloadError' | 'paywallWebViewRendered' |\n 'customPaywallAction' | 'userAllocated';\n triggerName?: string;\n paywallName?: string;\n /**\n * @deprecated Use `paywallName` instead.\n */\n paywallTemplateName?: string;\n productId?: string;\n /**\n * @deprecated Use `productId` instead.\n */\n productKey?: string;\n buttonName?: string;\n /**\n * @deprecated Use `buttonName` instead.\n */\n ctaName?: string;\n configId?: string;\n numAttempts?: number;\n downloadTimeTakenMS?: number;\n webviewRenderTimeTakenMS?: number;\n imagesDownloadTimeTakenMS?: number;\n fontsDownloadTimeTakenMS?: number;\n bundleDownloadTimeMS?: number;\n dismissAll?: boolean;\n isSecondTry?: boolean;\n error?: string;\n /**\n * @deprecated Use `error` instead.\n */\n errorDescription?: string;\n /**\n * Unix timestamp in seconds\n */\n timestamp?: number;\n paywallUnavailableReason?: string;\n customPaywallActionName?: string;\n customPaywallActionParams?: Record<string, any>;\n};\nexport type DelegateActionEvent = {\n type: 'purchase' | 'restore';\n productId?: string;\n /** Android-specific: Base plan ID for subscriptions */\n basePlanId?: string;\n /** Android-specific: Offer ID for promotional offers */\n offerId?: string;\n};\n\nexport type HeliumPaywallSdkViewProps = {\n url: string;\n onLoad: (event: { nativeEvent: OnLoadEventPayload }) => void;\n style?: StyleProp<ViewStyle>;\n};\n\nexport type HeliumTransactionStatus = 'purchased' | 'failed' | 'cancelled' | 'pending' | 'restored';\nexport type HeliumPurchaseResult = {\n status: HeliumTransactionStatus;\n error?: string; // Optional error message\n};\nexport type HeliumDownloadStatus = 'downloadSuccess' | 'downloadFailure' | 'inProgress' | 'notDownloadedYet';\nexport type HeliumLightDarkMode = 'light' | 'dark' | 'system';\nexport type HeliumEnvironment = 'sandbox' | 'production';\n\n// --- Purchase Configuration Types ---\n\n/** Interface for providing custom purchase handling logic. */\nexport interface HeliumPurchaseConfig {\n /**\n * @deprecated Use makePurchaseIOS / makePurchaseAndroid instead for platform-specific handling.\n * This method will continue to work for backward compatibility but doesn't provide Android subscription parameters.\n */\n makePurchase?: (productId: string) => Promise<HeliumPurchaseResult>;\n\n /** iOS-specific purchase handler. Receives a simple product ID string. */\n makePurchaseIOS?: (productId: string) => Promise<HeliumPurchaseResult>;\n\n /** Android-specific purchase handler. Receives product ID and optional subscription parameters. */\n makePurchaseAndroid?: (productId: string, basePlanId?: string, offerId?: string) => Promise<HeliumPurchaseResult>;\n\n restorePurchases: () => Promise<boolean>;\n\n /** @internal Used to identify the purchase delegate type for analytics. */\n _delegateType?: string;\n}\n\n// Helper function for creating Custom Purchase Config\nexport function createCustomPurchaseConfig(callbacks: {\n /** @deprecated Use makePurchaseIOS or makePurchaseAndroid instead */\n makePurchase?: (productId: string) => Promise<HeliumPurchaseResult>;\n makePurchaseIOS?: (productId: string) => Promise<HeliumPurchaseResult>;\n makePurchaseAndroid?: (productId: string, basePlanId?: string, offerId?: string) => Promise<HeliumPurchaseResult>;\n restorePurchases: () => Promise<boolean>;\n}): HeliumPurchaseConfig {\n return {\n makePurchase: callbacks.makePurchase,\n makePurchaseIOS: callbacks.makePurchaseIOS,\n makePurchaseAndroid: callbacks.makePurchaseAndroid,\n restorePurchases: callbacks.restorePurchases,\n };\n}\n\nexport type TriggerLoadingConfig = {\n /** Whether to show loading state for this trigger. Set to nil to use the global `useLoadingState` setting. */\n useLoadingState?: boolean;\n /** Maximum seconds to show loading for this trigger. Set to nil to use the global `loadingBudget` setting. */\n loadingBudget?: number;\n};\n\nexport type HeliumPaywallLoadingConfig = {\n /**\n * Whether to show a loading state while fetching paywall configuration.\n * When true, shows a loading view for up to `loadingBudget` seconds before falling back.\n * Default: true\n */\n useLoadingState?: boolean;\n /**\n * Maximum time (in seconds) to show the loading state before displaying fallback.\n * After this timeout, the fallback view will be shown even if the paywall is still downloading.\n * Default: 7.0 seconds\n */\n loadingBudget?: number;\n /**\n * Optional per-trigger loading configuration overrides.\n * Use this to customize loading behavior for specific triggers.\n * Keys are trigger names, values are TriggerLoadingConfig instances.\n * Example: Disable loading for \"onboarding\" trigger while keeping it for others.\n */\n perTriggerLoadingConfig?: Record<string, TriggerLoadingConfig>;\n};\n\nexport interface HeliumConfig {\n /** Your Helium API Key */\n apiKey: string;\n /**\n * Configuration for handling purchases. Can be custom functions or a pre-built handler config.\n * If not provided, Helium will handle purchases for you.\n */\n purchaseConfig?: HeliumPurchaseConfig;\n /** Callback for receiving all Helium paywall events. */\n onHeliumPaywallEvent?: (event: HeliumPaywallEvent) => void;\n\n // Optional configurations\n /** Fallback bundle in the rare situation that paywall is not ready to be shown. Highly recommended. See docs at https://docs.tryhelium.com/guides/fallback-bundle#react-native */\n fallbackBundle?: object;\n /** Configure loading behavior for paywalls that are mid-download. */\n paywallLoadingConfig?: HeliumPaywallLoadingConfig;\n /** Environment to use for Android. (iOS auto-detects this.)\n * If not specified, Android environment will be \"sandbox\" if app is a debug build, \"production\" otherwise.\n * Recommended to pass in \"sandbox\" for QA builds that behave like a production build but are actually just for testing.\n */\n environment?: HeliumEnvironment;\n customUserId?: string;\n customAPIEndpoint?: string;\n customUserTraits?: Record<string, any>;\n revenueCatAppUserId?: string;\n}\n\nexport interface NativeHeliumConfig {\n apiKey: string;\n customUserId?: string;\n customAPIEndpoint?: string;\n customUserTraits?: Record<string, any>;\n revenueCatAppUserId?: string;\n fallbackBundleUrlString?: string;\n fallbackBundleString?: string;\n paywallLoadingConfig?: HeliumPaywallLoadingConfig;\n useDefaultDelegate?: boolean;\n environment?: string;\n wrapperSdkVersion?: string;\n delegateType?: string;\n}\n\nexport type PresentUpsellParams = {\n triggerName: string;\n /** Optional. This will be called when paywall fails to show due to an unsuccessful paywall download or if an invalid trigger is provided. */\n onFallback?: () => void;\n eventHandlers?: PaywallEventHandlers;\n customPaywallTraits?: Record<string, any>;\n /** Optional. If true, the paywall will not be shown if the user already has an entitlement for a product in the paywall. */\n dontShowIfAlreadyEntitled?: boolean;\n};\n\nexport interface PaywallInfo {\n /** Name of the paywall. */\n paywallTemplateName: string;\n /** Will be false if the paywall should not be shown due to targeting or workflow configuration (Helium handles this for you in presentUpsell) */\n shouldShow: boolean;\n}\n\n// Event handler types for per-presentation event handling\nexport interface PaywallEventHandlers {\n onOpen?: (event: PaywallOpenEvent) => void;\n onClose?: (event: PaywallCloseEvent) => void;\n onDismissed?: (event: PaywallDismissedEvent) => void;\n onPurchaseSucceeded?: (event: PurchaseSucceededEvent) => void;\n onOpenFailed?: (event: PaywallOpenFailedEvent) => void;\n onCustomPaywallAction?: (event: CustomPaywallActionEvent) => void;\n /** A handler that will fire for any paywall-related event. */\n onAnyEvent?: (event: HeliumPaywallEvent) => void;\n}\n\n// Typed event interfaces\nexport interface PaywallOpenEvent {\n type: 'paywallOpen';\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n viewType?: 'presented' | 'embedded' | 'triggered';\n}\n\nexport interface PaywallCloseEvent {\n type: 'paywallClose';\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n}\n\nexport interface PaywallDismissedEvent {\n type: 'paywallDismissed';\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n}\n\nexport interface PurchaseSucceededEvent {\n type: 'purchaseSucceeded';\n productId: string;\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n}\n\nexport interface PaywallOpenFailedEvent {\n type: 'paywallOpenFailed';\n triggerName: string;\n paywallName: string;\n error: string;\n paywallUnavailableReason?: string;\n isSecondTry: boolean;\n}\n\nexport interface CustomPaywallActionEvent {\n type: 'customPaywallAction';\n triggerName: string;\n paywallName: string;\n actionName: string;\n params: Record<string, any>;\n isSecondTry: boolean;\n}\n\nexport const HELIUM_CTA_NAMES = {\n SCHEDULE_CALL: 'schedule_call',\n SUBSCRIBE_BUTTON: 'subscribe_button',\n}\n"]}
|
|
1
|
+
{"version":3,"file":"HeliumPaywallSdk.types.js","sourceRoot":"","sources":["../src/HeliumPaywallSdk.types.ts"],"names":[],"mappings":"AAoHA,sDAAsD;AACtD,MAAM,UAAU,0BAA0B,CAAC,SAM1C;IACC,OAAO;QACL,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,eAAe,EAAE,SAAS,CAAC,eAAe;QAC1C,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;QAClD,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;KAC7C,CAAC;AACJ,CAAC;AAyID,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;CACrC,CAAA","sourcesContent":["import type { StyleProp, ViewStyle } from 'react-native';\n\nexport type OnLoadEventPayload = {\n url: string;\n};\n\nexport type HeliumPaywallSdkModuleEvents = {\n onHeliumPaywallEvent: (params: HeliumPaywallEvent) => void;\n onDelegateActionEvent: (params: DelegateActionEvent) => void;\n paywallEventHandlers: (params: HeliumPaywallEvent) => void;\n onHeliumLogEvent: (params: HeliumLogEvent) => void;\n};\n\n/** A log event emitted by the Helium SDK. */\nexport interface HeliumLogEvent {\n /** Numeric log level (1=error, 2=warn, 3=info, 4=debug, 5=trace). */\n level: number;\n /** The category/subsystem that generated this log (iOS) or tag (Android). */\n category: string;\n /** The log message (prefixed with \"[Helium] \"). */\n message: string;\n /** Key-value metadata associated with this log event (iOS only, empty on Android). */\n metadata: Record<string, string>;\n}\nexport type HeliumPaywallEvent = {\n type: 'paywallOpen' | 'paywallClose' | 'paywallDismissed' |\n 'paywallOpenFailed' | 'paywallSkipped' | 'paywallButtonPressed' |\n 'productSelected' | 'purchasePressed' | 'purchaseSucceeded' |\n 'purchaseCancelled' | 'purchaseFailed' | 'purchaseRestored' |\n 'purchaseRestoreFailed' | 'purchasePending' | 'initializeStart' |\n 'paywallsDownloadSuccess' | 'paywallsDownloadError' | 'paywallWebViewRendered' |\n 'customPaywallAction' | 'userAllocated';\n triggerName?: string;\n paywallName?: string;\n /**\n * @deprecated Use `paywallName` instead.\n */\n paywallTemplateName?: string;\n productId?: string;\n /**\n * @deprecated Use `productId` instead.\n */\n productKey?: string;\n buttonName?: string;\n /**\n * @deprecated Use `buttonName` instead.\n */\n ctaName?: string;\n configId?: string;\n numAttempts?: number;\n downloadTimeTakenMS?: number;\n webviewRenderTimeTakenMS?: number;\n imagesDownloadTimeTakenMS?: number;\n fontsDownloadTimeTakenMS?: number;\n bundleDownloadTimeMS?: number;\n dismissAll?: boolean;\n isSecondTry?: boolean;\n error?: string;\n /**\n * @deprecated Use `error` instead.\n */\n errorDescription?: string;\n /**\n * Unix timestamp in seconds\n */\n timestamp?: number;\n paywallUnavailableReason?: string;\n customPaywallActionName?: string;\n customPaywallActionParams?: Record<string, any>;\n};\nexport type DelegateActionEvent = {\n type: 'purchase' | 'restore';\n productId?: string;\n /** Android-specific: Base plan ID for subscriptions */\n basePlanId?: string;\n /** Android-specific: Offer ID for promotional offers */\n offerId?: string;\n};\n\nexport type HeliumPaywallSdkViewProps = {\n url: string;\n onLoad: (event: { nativeEvent: OnLoadEventPayload }) => void;\n style?: StyleProp<ViewStyle>;\n};\n\nexport type HeliumTransactionStatus = 'purchased' | 'failed' | 'cancelled' | 'pending' | 'restored';\nexport type HeliumPurchaseResult = {\n status: HeliumTransactionStatus;\n error?: string; // Optional error message\n};\nexport type HeliumDownloadStatus = 'downloadSuccess' | 'downloadFailure' | 'inProgress' | 'notDownloadedYet';\nexport type HeliumLightDarkMode = 'light' | 'dark' | 'system';\nexport type HeliumEnvironment = 'sandbox' | 'production';\n\n// --- Purchase Configuration Types ---\n\n/** Interface for providing custom purchase handling logic. */\nexport interface HeliumPurchaseConfig {\n /**\n * @deprecated Use makePurchaseIOS / makePurchaseAndroid instead for platform-specific handling.\n * This method will continue to work for backward compatibility but doesn't provide Android subscription parameters.\n */\n makePurchase?: (productId: string) => Promise<HeliumPurchaseResult>;\n\n /** iOS-specific purchase handler. Receives a simple product ID string. */\n makePurchaseIOS?: (productId: string) => Promise<HeliumPurchaseResult>;\n\n /** Android-specific purchase handler. Receives product ID and optional subscription parameters. */\n makePurchaseAndroid?: (productId: string, basePlanId?: string, offerId?: string) => Promise<HeliumPurchaseResult>;\n\n restorePurchases: () => Promise<boolean>;\n\n /** @internal Used to identify the purchase delegate type for analytics. */\n _delegateType?: string;\n}\n\n// Helper function for creating Custom Purchase Config\nexport function createCustomPurchaseConfig(callbacks: {\n /** @deprecated Use makePurchaseIOS or makePurchaseAndroid instead */\n makePurchase?: (productId: string) => Promise<HeliumPurchaseResult>;\n makePurchaseIOS?: (productId: string) => Promise<HeliumPurchaseResult>;\n makePurchaseAndroid?: (productId: string, basePlanId?: string, offerId?: string) => Promise<HeliumPurchaseResult>;\n restorePurchases: () => Promise<boolean>;\n}): HeliumPurchaseConfig {\n return {\n makePurchase: callbacks.makePurchase,\n makePurchaseIOS: callbacks.makePurchaseIOS,\n makePurchaseAndroid: callbacks.makePurchaseAndroid,\n restorePurchases: callbacks.restorePurchases,\n };\n}\n\nexport type HeliumPaywallLoadingConfig = {\n /**\n * Whether to show a loading state while fetching paywall configuration.\n * When true, shows a loading view for up to `loadingBudget` seconds before falling back.\n * Default: true\n */\n useLoadingState?: boolean;\n /**\n * Maximum time (in seconds) to show the loading state before displaying fallback.\n * After this timeout, the fallback view will be shown even if the paywall is still downloading.\n * Default: 7.0 seconds\n */\n loadingBudget?: number;\n};\n\nexport interface HeliumConfig {\n /** Your Helium API Key */\n apiKey: string;\n /**\n * Configuration for handling purchases. Can be custom functions or a pre-built handler config.\n * If not provided, Helium will handle purchases for you.\n */\n purchaseConfig?: HeliumPurchaseConfig;\n /** Callback for receiving all Helium paywall events. */\n onHeliumPaywallEvent?: (event: HeliumPaywallEvent) => void;\n\n // Optional configurations\n /** Fallback bundle in the rare situation that paywall is not ready to be shown. Highly recommended. See docs at https://docs.tryhelium.com/guides/fallback-bundle#react-native */\n fallbackBundle?: object;\n /** Configure loading behavior for paywalls that are mid-download. */\n paywallLoadingConfig?: HeliumPaywallLoadingConfig;\n /** Environment to use for Android. (iOS auto-detects this.)\n * If not specified, Android environment will be \"sandbox\" if app is a debug build, \"production\" otherwise.\n * Recommended to pass in \"sandbox\" for QA builds that behave like a production build but are actually just for testing.\n */\n environment?: HeliumEnvironment;\n customUserId?: string;\n customAPIEndpoint?: string;\n customUserTraits?: Record<string, any>;\n revenueCatAppUserId?: string;\n}\n\nexport interface NativeHeliumConfig {\n apiKey: string;\n customUserId?: string;\n customAPIEndpoint?: string;\n customUserTraits?: Record<string, any>;\n revenueCatAppUserId?: string;\n fallbackBundleUrlString?: string;\n fallbackBundleString?: string;\n paywallLoadingConfig?: HeliumPaywallLoadingConfig;\n useDefaultDelegate?: boolean;\n environment?: string;\n wrapperSdkVersion?: string;\n delegateType?: string;\n}\n\nexport type PresentUpsellParams = {\n triggerName: string;\n /** Optional. This will be called when paywall fails to show due to an unsuccessful paywall download or if an invalid trigger is provided. */\n onFallback?: () => void;\n eventHandlers?: PaywallEventHandlers;\n customPaywallTraits?: Record<string, any>;\n /** Optional. If true, the paywall will not be shown if the user already has an entitlement for a product in the paywall. */\n dontShowIfAlreadyEntitled?: boolean;\n};\n\nexport interface PaywallInfo {\n /** Name of the paywall. */\n paywallTemplateName: string;\n /** Will be false if the paywall should not be shown due to targeting or workflow configuration (Helium handles this for you in presentUpsell) */\n shouldShow: boolean;\n}\n\n// Event handler types for per-presentation event handling\nexport interface PaywallEventHandlers {\n onOpen?: (event: PaywallOpenEvent) => void;\n onClose?: (event: PaywallCloseEvent) => void;\n onDismissed?: (event: PaywallDismissedEvent) => void;\n onPurchaseSucceeded?: (event: PurchaseSucceededEvent) => void;\n onOpenFailed?: (event: PaywallOpenFailedEvent) => void;\n onCustomPaywallAction?: (event: CustomPaywallActionEvent) => void;\n /** A handler that will fire for any paywall-related event. */\n onAnyEvent?: (event: HeliumPaywallEvent) => void;\n}\n\n// Typed event interfaces\nexport interface PaywallOpenEvent {\n type: 'paywallOpen';\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n viewType?: 'presented' | 'embedded' | 'triggered';\n}\n\nexport interface PaywallCloseEvent {\n type: 'paywallClose';\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n}\n\nexport interface PaywallDismissedEvent {\n type: 'paywallDismissed';\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n}\n\nexport interface PurchaseSucceededEvent {\n type: 'purchaseSucceeded';\n productId: string;\n triggerName: string;\n paywallName: string;\n isSecondTry: boolean;\n}\n\nexport interface PaywallOpenFailedEvent {\n type: 'paywallOpenFailed';\n triggerName: string;\n paywallName: string;\n error: string;\n paywallUnavailableReason?: string;\n isSecondTry: boolean;\n}\n\nexport interface CustomPaywallActionEvent {\n type: 'customPaywallAction';\n triggerName: string;\n paywallName: string;\n actionName: string;\n params: Record<string, any>;\n isSecondTry: boolean;\n}\n\nexport const HELIUM_CTA_NAMES = {\n SCHEDULE_CALL: 'schedule_call',\n SUBSCRIBE_BUTTON: 'subscribe_button',\n}\n"]}
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAG8B,WAAW,EAAE,mBAAmB,EAC3E,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAa9D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,cAAe,0BAA0B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAmB7C,eAAO,MAAM,UAAU,GAAU,QAAQ,YAAY,kBAyFpD,CAAC;AAiEF,eAAO,MAAM,aAAa,GAAI,6FAMG,mBAAmB,SAYnD,CAAC;AAqHF,eAAO,MAAM,UAAU,YAAoC,CAAC;AAC5D,eAAO,MAAM,cAAc,YAAwC,CAAC;AACpE,eAAO,MAAM,iBAAiB,+DAA2C,CAAC;AAC1E,eAAO,MAAM,sBAAsB,+BAAgD,CAAC;AAEpF;;GAEG;AACH,eAAO,MAAM,eAAe,6BAAyC,CAAC;AAEtE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GAAU,SAAS,MAAM,KAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAG3F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,wBAAkD,CAAC;AAExF;;GAEG;AACH,eAAO,MAAM,iBAAiB,wBAA2C,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,WAAW,YASvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,6BAA6B,wFAAuD,CAAC;AAElG;;;GAGG;AACH,eAAO,MAAM,0BAA0B,YAAoD,CAAC;AAE5F;;;GAGG;AACH,eAAO,MAAM,wBAAwB,wEAAkD,CAAC;AAExF;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,GAAI,SAAS,MAAM,KAAG,cAAc,GAAG,SAgB9E,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,WAAW,GAAG,SAc9D,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,GAAG,IAAI,YAOhD,CAAC;AAmCF,OAAO,EAAC,0BAA0B,EAAE,gBAAgB,EAAC,MAAM,0BAA0B,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -21,6 +21,9 @@ function addDelegateActionEventListener(listener) {
|
|
|
21
21
|
function addPaywallEventHandlersListener(listener) {
|
|
22
22
|
return HeliumPaywallSdkModule.addListener('paywallEventHandlers', listener);
|
|
23
23
|
}
|
|
24
|
+
function addHeliumLogEventListener(listener) {
|
|
25
|
+
return HeliumPaywallSdkModule.addListener('onHeliumLogEvent', listener);
|
|
26
|
+
}
|
|
24
27
|
let isInitialized = false;
|
|
25
28
|
export const initialize = async (config) => {
|
|
26
29
|
if (isInitialized) {
|
|
@@ -30,6 +33,7 @@ export const initialize = async (config) => {
|
|
|
30
33
|
HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');
|
|
31
34
|
HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');
|
|
32
35
|
HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');
|
|
36
|
+
HeliumPaywallSdkModule.removeAllListeners('onHeliumLogEvent');
|
|
33
37
|
// Set up listener for paywall events
|
|
34
38
|
addHeliumPaywallEventListener((event) => {
|
|
35
39
|
handlePaywallEvent(event);
|
|
@@ -98,6 +102,10 @@ export const initialize = async (config) => {
|
|
|
98
102
|
addPaywallEventHandlersListener((event) => {
|
|
99
103
|
callPaywallEventHandlers(event);
|
|
100
104
|
});
|
|
105
|
+
// Set up listener for native SDK logs
|
|
106
|
+
addHeliumLogEventListener((event) => {
|
|
107
|
+
logHeliumEvent(event);
|
|
108
|
+
});
|
|
101
109
|
await nativeInitializeAsync(config).catch(error => {
|
|
102
110
|
console.error('[Helium] Initialization failed:', error);
|
|
103
111
|
});
|
|
@@ -118,14 +126,14 @@ const nativeInitializeAsync = async (config) => {
|
|
|
118
126
|
if (hasLegacyApi) {
|
|
119
127
|
// Expo 52/53 - use legacy API
|
|
120
128
|
// @ts-ignore - documentDirectory only exists in Expo 52/53 types
|
|
121
|
-
fallbackBundleUrlString = `${ExpoFileSystem.documentDirectory}helium-
|
|
129
|
+
fallbackBundleUrlString = `${ExpoFileSystem.documentDirectory}helium-expo-fallbacks.json`;
|
|
122
130
|
// @ts-ignore - writeAsStringAsync only exists in Expo 52/53 types
|
|
123
131
|
await ExpoFileSystem.writeAsStringAsync(fallbackBundleUrlString, jsonContent);
|
|
124
132
|
}
|
|
125
133
|
else if (hasNewApi) {
|
|
126
134
|
// Expo 54+ - use new class-based API
|
|
127
135
|
// @ts-ignore - Types may not be available in older Expo versions
|
|
128
|
-
const file = new ExpoFileSystem.File(ExpoFileSystem.Paths.document, 'helium-
|
|
136
|
+
const file = new ExpoFileSystem.File(ExpoFileSystem.Paths.document, 'helium-expo-fallbacks.json');
|
|
129
137
|
file.create({ overwrite: true });
|
|
130
138
|
file.write(jsonContent);
|
|
131
139
|
fallbackBundleUrlString = file.uri;
|
|
@@ -260,6 +268,31 @@ function handlePaywallEvent(event) {
|
|
|
260
268
|
break;
|
|
261
269
|
}
|
|
262
270
|
}
|
|
271
|
+
/**
|
|
272
|
+
* Routes native SDK log events to the appropriate console method.
|
|
273
|
+
* Log levels: 1=error, 2=warn, 3=info, 4=debug, 5=trace
|
|
274
|
+
*/
|
|
275
|
+
function logHeliumEvent(event) {
|
|
276
|
+
const { level, message } = event;
|
|
277
|
+
const metadata = event.metadata ?? {};
|
|
278
|
+
const hasMetadata = Object.keys(metadata).length > 0;
|
|
279
|
+
switch (level) {
|
|
280
|
+
case 1: // error
|
|
281
|
+
hasMetadata ? console.error(message, metadata) : console.error(message);
|
|
282
|
+
break;
|
|
283
|
+
case 2: // warn
|
|
284
|
+
hasMetadata ? console.warn(message, metadata) : console.warn(message);
|
|
285
|
+
break;
|
|
286
|
+
case 3: // info
|
|
287
|
+
hasMetadata ? console.info(message, metadata) : console.info(message);
|
|
288
|
+
break;
|
|
289
|
+
case 4: // debug
|
|
290
|
+
case 5: // trace
|
|
291
|
+
default:
|
|
292
|
+
hasMetadata ? console.debug(message, metadata) : console.debug(message);
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
263
296
|
export const hideUpsell = HeliumPaywallSdkModule.hideUpsell;
|
|
264
297
|
export const hideAllUpsells = HeliumPaywallSdkModule.hideAllUpsells;
|
|
265
298
|
export const getDownloadStatus = HeliumPaywallSdkModule.getDownloadStatus;
|
|
@@ -294,6 +327,7 @@ export const resetHelium = () => {
|
|
|
294
327
|
HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');
|
|
295
328
|
HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');
|
|
296
329
|
HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');
|
|
330
|
+
HeliumPaywallSdkModule.removeAllListeners('onHeliumLogEvent');
|
|
297
331
|
HeliumPaywallSdkModule.resetHelium();
|
|
298
332
|
isInitialized = false;
|
|
299
333
|
};
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DelegateActionEvent,\n HeliumConfig,\n HeliumPaywallEvent,\n NativeHeliumConfig, PaywallEventHandlers, PaywallInfo, PresentUpsellParams,\n} from \"./HeliumPaywallSdk.types\";\nimport { ExperimentInfo } from \"./HeliumExperimentInfo.types\";\nimport HeliumPaywallSdkModule from \"./HeliumPaywallSdkModule\";\nimport { EventSubscription } from 'expo-modules-core';\nimport * as ExpoFileSystem from 'expo-file-system';\nimport { Platform } from 'react-native';\n\nlet SDK_VERSION = 'unknown';\ntry {\n SDK_VERSION = require('../package.json').version;\n} catch {\n // package.json can't be loaded, accept that we won't get wrapper sdk version\n}\n\nexport { default } from './HeliumPaywallSdkModule';\n// export { default as HeliumPaywallSdkView } from './HeliumPaywallSdkView';\nexport * from './HeliumPaywallSdk.types';\nexport * from './HeliumExperimentInfo.types';\n\nfunction addHeliumPaywallEventListener(listener: (event: HeliumPaywallEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('onHeliumPaywallEvent', listener);\n}\n\nfunction addDelegateActionEventListener(listener: (event: DelegateActionEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('onDelegateActionEvent', listener);\n}\n\nfunction addPaywallEventHandlersListener(listener: (event: HeliumPaywallEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('paywallEventHandlers', listener);\n}\n\nlet isInitialized = false;\nexport const initialize = async (config: HeliumConfig) => {\n if (isInitialized) {\n return;\n }\n isInitialized = true;\n\n HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');\n HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');\n HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');\n\n // Set up listener for paywall events\n addHeliumPaywallEventListener((event) => {\n handlePaywallEvent(event);\n config.onHeliumPaywallEvent?.(event);\n });\n\n // Set up delegate action listener for purchase and restore operations\n const purchaseConfig = config.purchaseConfig;\n if (purchaseConfig) {\n addDelegateActionEventListener(async (event) => {\n try {\n if (event.type === 'purchase') {\n if (!event.productId) {\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'No product ID for purchase event.');\n return;\n }\n\n let result;\n\n // Platform-specific purchase handling\n if (Platform.OS === 'ios') {\n // iOS: Use makePurchaseIOS if available, otherwise use deprecated makePurchase\n if (purchaseConfig.makePurchaseIOS) {\n result = await purchaseConfig.makePurchaseIOS(event.productId);\n } else if (purchaseConfig.makePurchase) {\n result = await purchaseConfig.makePurchase(event.productId);\n } else {\n console.log('[Helium] No iOS purchase handler configured.');\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'No iOS purchase handler configured.');\n return;\n }\n } else if (Platform.OS === 'android') {\n // Android: Use makePurchaseAndroid if available\n if (purchaseConfig.makePurchaseAndroid) {\n result = await purchaseConfig.makePurchaseAndroid(\n event.productId,\n event.basePlanId,\n event.offerId\n );\n } else {\n console.log('[Helium] No Android purchase handler configured.');\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'No Android purchase handler configured.');\n return;\n }\n } else {\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'Unsupported platform.');\n return;\n }\n\n HeliumPaywallSdkModule.handlePurchaseResult(result.status, result.error);\n } else if (event.type === 'restore') {\n const success = await purchaseConfig.restorePurchases();\n HeliumPaywallSdkModule.handleRestoreResult(success);\n }\n } catch (error) {\n // Send failure result based on action type\n if (event.type === 'purchase') {\n console.log('[Helium] Unexpected error: ', error);\n HeliumPaywallSdkModule.handlePurchaseResult('failed');\n } else if (event.type === 'restore') {\n HeliumPaywallSdkModule.handleRestoreResult(false);\n }\n }\n });\n }\n\n addPaywallEventHandlersListener((event) => {\n callPaywallEventHandlers(event);\n });\n\n await nativeInitializeAsync(config).catch(error => {\n console.error('[Helium] Initialization failed:', error);\n });\n};\n\nconst nativeInitializeAsync = async (config: HeliumConfig) => {\n let fallbackBundleUrlString;\n let fallbackBundleString;\n if (config.fallbackBundle) {\n try {\n const jsonContent = JSON.stringify(config.fallbackBundle);\n\n // Feature detection: check which expo-file-system API is available\n // Expo 52/53 has documentDirectory + writeAsStringAsync\n // Expo 54+ has File + Paths (new class-based API)\n // @ts-ignore - documentDirectory only exists in Expo 52/53 types\n const hasLegacyApi = typeof ExpoFileSystem.documentDirectory === 'string'\n && typeof ExpoFileSystem.writeAsStringAsync === 'function';\n const hasNewApi = 'File' in ExpoFileSystem && 'Paths' in ExpoFileSystem;\n\n if (hasLegacyApi) {\n // Expo 52/53 - use legacy API\n // @ts-ignore - documentDirectory only exists in Expo 52/53 types\n fallbackBundleUrlString = `${ExpoFileSystem.documentDirectory}helium-fallback.json`;\n // @ts-ignore - writeAsStringAsync only exists in Expo 52/53 types\n await ExpoFileSystem.writeAsStringAsync(fallbackBundleUrlString, jsonContent);\n } else if (hasNewApi) {\n // Expo 54+ - use new class-based API\n // @ts-ignore - Types may not be available in older Expo versions\n const file = new ExpoFileSystem.File(ExpoFileSystem.Paths.document, 'helium-fallback.json');\n file.create({ overwrite: true });\n file.write(jsonContent);\n fallbackBundleUrlString = file.uri;\n } else {\n throw new Error('No compatible expo-file-system API found');\n }\n } catch (error) {\n // Just use string approach if expo-file-system is unavailable or fails\n console.log(\n '[Helium] expo-file-system not available, passing fallback bundle as string.'\n );\n fallbackBundleString = JSON.stringify(config.fallbackBundle);\n }\n }\n\n\n // Create native config object\n const nativeConfig: NativeHeliumConfig = {\n apiKey: config.apiKey,\n customUserId: config.customUserId,\n customAPIEndpoint: config.customAPIEndpoint,\n customUserTraits: convertBooleansToMarkers(config.customUserTraits),\n revenueCatAppUserId: config.revenueCatAppUserId,\n fallbackBundleUrlString: fallbackBundleUrlString,\n fallbackBundleString: fallbackBundleString,\n paywallLoadingConfig: convertBooleansToMarkers(config.paywallLoadingConfig),\n useDefaultDelegate: !config.purchaseConfig,\n environment: config.environment,\n wrapperSdkVersion: SDK_VERSION,\n delegateType: config.purchaseConfig?._delegateType,\n };\n\n // Initialize the native module\n HeliumPaywallSdkModule.initialize(nativeConfig);\n};\n\nlet paywallEventHandlers: PaywallEventHandlers | undefined;\nlet presentOnFallback: (() => void) | undefined;\nexport const presentUpsell = ({\n triggerName,\n onFallback,\n eventHandlers,\n customPaywallTraits,\n dontShowIfAlreadyEntitled,\n }: PresentUpsellParams) => {\n try {\n paywallEventHandlers = eventHandlers;\n presentOnFallback = onFallback;\n HeliumPaywallSdkModule.presentUpsell(triggerName, convertBooleansToMarkers(customPaywallTraits), dontShowIfAlreadyEntitled);\n } catch (error) {\n console.log('[Helium] presentUpsell error', error);\n paywallEventHandlers = undefined;\n presentOnFallback = undefined;\n onFallback?.();\n HeliumPaywallSdkModule.fallbackOpenOrCloseEvent(triggerName, true, 'presented');\n }\n};\n\nfunction callPaywallEventHandlers(event: HeliumPaywallEvent) {\n if (paywallEventHandlers) {\n switch (event.type) {\n case 'paywallOpen':\n paywallEventHandlers?.onOpen?.({\n type: 'paywallOpen',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n viewType: 'presented',\n });\n break;\n case 'paywallClose':\n paywallEventHandlers?.onClose?.({\n type: 'paywallClose',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'paywallDismissed':\n paywallEventHandlers?.onDismissed?.({\n type: 'paywallDismissed',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'purchaseSucceeded':\n paywallEventHandlers?.onPurchaseSucceeded?.({\n type: 'purchaseSucceeded',\n productId: event.productId ?? 'unknown',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'paywallOpenFailed':\n paywallEventHandlers?.onOpenFailed?.({\n type: 'paywallOpenFailed',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n error: event.error ?? 'Unknown error',\n paywallUnavailableReason: event.paywallUnavailableReason,\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'customPaywallAction':\n paywallEventHandlers?.onCustomPaywallAction?.({\n type: 'customPaywallAction',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n actionName: event.customPaywallActionName ?? 'unknown',\n params: event.customPaywallActionParams ?? {},\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n }\n paywallEventHandlers?.onAnyEvent?.(event);\n }\n}\n\nfunction handlePaywallEvent(event: HeliumPaywallEvent) {\n switch (event.type) {\n case 'paywallClose':\n if (!event.isSecondTry) {\n paywallEventHandlers = undefined;\n }\n presentOnFallback = undefined;\n break;\n case 'paywallSkipped':\n paywallEventHandlers = undefined;\n presentOnFallback = undefined;\n break;\n case 'paywallOpenFailed':\n paywallEventHandlers = undefined;\n const unavailableReason = event.paywallUnavailableReason;\n if (event.triggerName\n && unavailableReason !== \"alreadyPresented\"\n && unavailableReason !== \"secondTryNoMatch\") {\n console.log('[Helium] paywall open failed', unavailableReason);\n presentOnFallback?.();\n }\n presentOnFallback = undefined;\n break;\n }\n}\n\nexport const hideUpsell = HeliumPaywallSdkModule.hideUpsell;\nexport const hideAllUpsells = HeliumPaywallSdkModule.hideAllUpsells;\nexport const getDownloadStatus = HeliumPaywallSdkModule.getDownloadStatus;\nexport const setRevenueCatAppUserId = HeliumPaywallSdkModule.setRevenueCatAppUserId;\n\n/**\n * Set a custom user ID for the current user\n */\nexport const setCustomUserId = HeliumPaywallSdkModule.setCustomUserId;\n\n/**\n * Checks if the user has an active entitlement for any product attached to the paywall that will show for provided trigger.\n * @param trigger The trigger name to check entitlement for\n * @returns Promise resolving to true if entitled, false if not, or undefined if not known (i.e. the paywall is not downloaded yet)\n */\nexport const hasEntitlementForPaywall = async (trigger: string): Promise<boolean | undefined> => {\n const result = await HeliumPaywallSdkModule.hasEntitlementForPaywall(trigger);\n return result?.hasEntitlement;\n};\n\n/**\n * Checks if the user has any active subscription (including non-renewable)\n */\nexport const hasAnyActiveSubscription = HeliumPaywallSdkModule.hasAnyActiveSubscription;\n\n/**\n * Checks if the user has any entitlement\n */\nexport const hasAnyEntitlement = HeliumPaywallSdkModule.hasAnyEntitlement;\n\n/**\n * Reset Helium entirely so you can call initialize again. Only for advanced use cases.\n */\nexport const resetHelium = () => {\n paywallEventHandlers = undefined;\n presentOnFallback = undefined;\n HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');\n HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');\n HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');\n HeliumPaywallSdkModule.resetHelium();\n isInitialized = false;\n};\n\n/**\n * Set custom strings to show in the dialog that Helium will display if a \"Restore Purchases\" action is not successful.\n * Note that these strings will not be localized by Helium for you.\n */\nexport const setCustomRestoreFailedStrings = HeliumPaywallSdkModule.setCustomRestoreFailedStrings;\n\n/**\n * Disable the default dialog that Helium will display if a \"Restore Purchases\" action is not successful.\n * You can handle this yourself if desired by listening for the PurchaseRestoreFailedEvent.\n */\nexport const disableRestoreFailedDialog = HeliumPaywallSdkModule.disableRestoreFailedDialog;\n\n/**\n * Override the light/dark mode for Helium paywalls\n * @param mode The mode to set: 'light', 'dark', or 'system' (follows device setting)\n */\nexport const setLightDarkModeOverride = HeliumPaywallSdkModule.setLightDarkModeOverride;\n\n/**\n * Get experiment allocation info for a specific trigger\n *\n * @param trigger The trigger name to get experiment info for\n * @returns ExperimentInfo if the trigger has experiment data, undefined otherwise\n */\nexport const getExperimentInfoForTrigger = (trigger: string): ExperimentInfo | undefined => {\n const result = HeliumPaywallSdkModule.getExperimentInfoForTrigger(trigger);\n if (!result) {\n console.log('[Helium] getExperimentInfoForTrigger unexpected error.');\n return;\n }\n if (result.getExperimentInfoErrorMsg) {\n console.log(`[Helium] ${result.getExperimentInfoErrorMsg}`);\n return;\n }\n // Validate required field exists before casting\n if (!result.experimentId) {\n console.log('[Helium] getExperimentInfoForTrigger returned data without required experimentId field.');\n return;\n }\n return result as ExperimentInfo;\n};\n\nexport const getPaywallInfo = (trigger: string): PaywallInfo | undefined => {\n const result = HeliumPaywallSdkModule.getPaywallInfo(trigger);\n if (!result) {\n console.log('[Helium] getPaywallInfo unexpected error.');\n return;\n }\n if (result.errorMsg) {\n console.log(`[Helium] ${result.errorMsg}`);\n return;\n }\n return {\n paywallTemplateName: result.templateName ?? 'unknown template',\n shouldShow: result.shouldShow ?? true,\n };\n};\n\nexport const handleDeepLink = (url: string | null) => {\n if (url) {\n const handled = HeliumPaywallSdkModule.handleDeepLink(url);\n console.log('[Helium] Handled deep link:', handled);\n return handled;\n }\n return false;\n};\n\n/**\n * Recursively converts boolean values to special marker strings to preserve\n * type information when passing through native bridge.\n *\n * Native bridge converts booleans to NSNumber (0/1), making them\n * indistinguishable from actual numeric values. This helper converts:\n * - true -> \"__helium_rn_bool_true__\"\n * - false -> \"__helium_rn_bool_false__\"\n * - All other values remain unchanged\n */\nfunction convertBooleansToMarkers(input: Record<string, any> | undefined): Record<string, any> | undefined {\n if (!input) return undefined;\n\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(input)) {\n result[key] = convertValueBooleansToMarkers(value);\n }\n return result;\n}\n/**\n * Helper to recursively convert booleans in any value type\n */\nfunction convertValueBooleansToMarkers(value: any): any {\n if (typeof value === 'boolean') {\n return value ? \"__helium_rn_bool_true__\" : \"__helium_rn_bool_false__\";\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n return convertBooleansToMarkers(value);\n } else if (value && Array.isArray(value)) {\n return value.map(convertValueBooleansToMarkers);\n }\n return value;\n}\n\nexport {createCustomPurchaseConfig, HELIUM_CTA_NAMES} from './HeliumPaywallSdk.types';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DelegateActionEvent,\n HeliumConfig,\n HeliumLogEvent,\n HeliumPaywallEvent,\n NativeHeliumConfig, PaywallEventHandlers, PaywallInfo, PresentUpsellParams,\n} from \"./HeliumPaywallSdk.types\";\nimport { ExperimentInfo } from \"./HeliumExperimentInfo.types\";\nimport HeliumPaywallSdkModule from \"./HeliumPaywallSdkModule\";\nimport { EventSubscription } from 'expo-modules-core';\nimport * as ExpoFileSystem from 'expo-file-system';\nimport { Platform } from 'react-native';\n\nlet SDK_VERSION = 'unknown';\ntry {\n SDK_VERSION = require('../package.json').version;\n} catch {\n // package.json can't be loaded, accept that we won't get wrapper sdk version\n}\n\nexport { default } from './HeliumPaywallSdkModule';\n// export { default as HeliumPaywallSdkView } from './HeliumPaywallSdkView';\nexport * from './HeliumPaywallSdk.types';\nexport * from './HeliumExperimentInfo.types';\n\nfunction addHeliumPaywallEventListener(listener: (event: HeliumPaywallEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('onHeliumPaywallEvent', listener);\n}\n\nfunction addDelegateActionEventListener(listener: (event: DelegateActionEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('onDelegateActionEvent', listener);\n}\n\nfunction addPaywallEventHandlersListener(listener: (event: HeliumPaywallEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('paywallEventHandlers', listener);\n}\n\nfunction addHeliumLogEventListener(listener: (event: HeliumLogEvent) => void): EventSubscription {\n return HeliumPaywallSdkModule.addListener('onHeliumLogEvent', listener);\n}\n\nlet isInitialized = false;\nexport const initialize = async (config: HeliumConfig) => {\n if (isInitialized) {\n return;\n }\n isInitialized = true;\n\n HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');\n HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');\n HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');\n HeliumPaywallSdkModule.removeAllListeners('onHeliumLogEvent');\n\n // Set up listener for paywall events\n addHeliumPaywallEventListener((event) => {\n handlePaywallEvent(event);\n config.onHeliumPaywallEvent?.(event);\n });\n\n // Set up delegate action listener for purchase and restore operations\n const purchaseConfig = config.purchaseConfig;\n if (purchaseConfig) {\n addDelegateActionEventListener(async (event) => {\n try {\n if (event.type === 'purchase') {\n if (!event.productId) {\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'No product ID for purchase event.');\n return;\n }\n\n let result;\n\n // Platform-specific purchase handling\n if (Platform.OS === 'ios') {\n // iOS: Use makePurchaseIOS if available, otherwise use deprecated makePurchase\n if (purchaseConfig.makePurchaseIOS) {\n result = await purchaseConfig.makePurchaseIOS(event.productId);\n } else if (purchaseConfig.makePurchase) {\n result = await purchaseConfig.makePurchase(event.productId);\n } else {\n console.log('[Helium] No iOS purchase handler configured.');\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'No iOS purchase handler configured.');\n return;\n }\n } else if (Platform.OS === 'android') {\n // Android: Use makePurchaseAndroid if available\n if (purchaseConfig.makePurchaseAndroid) {\n result = await purchaseConfig.makePurchaseAndroid(\n event.productId,\n event.basePlanId,\n event.offerId\n );\n } else {\n console.log('[Helium] No Android purchase handler configured.');\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'No Android purchase handler configured.');\n return;\n }\n } else {\n HeliumPaywallSdkModule.handlePurchaseResult('failed', 'Unsupported platform.');\n return;\n }\n\n HeliumPaywallSdkModule.handlePurchaseResult(result.status, result.error);\n } else if (event.type === 'restore') {\n const success = await purchaseConfig.restorePurchases();\n HeliumPaywallSdkModule.handleRestoreResult(success);\n }\n } catch (error) {\n // Send failure result based on action type\n if (event.type === 'purchase') {\n console.log('[Helium] Unexpected error: ', error);\n HeliumPaywallSdkModule.handlePurchaseResult('failed');\n } else if (event.type === 'restore') {\n HeliumPaywallSdkModule.handleRestoreResult(false);\n }\n }\n });\n }\n\n addPaywallEventHandlersListener((event) => {\n callPaywallEventHandlers(event);\n });\n\n // Set up listener for native SDK logs\n addHeliumLogEventListener((event) => {\n logHeliumEvent(event);\n });\n\n await nativeInitializeAsync(config).catch(error => {\n console.error('[Helium] Initialization failed:', error);\n });\n};\n\nconst nativeInitializeAsync = async (config: HeliumConfig) => {\n let fallbackBundleUrlString;\n let fallbackBundleString;\n if (config.fallbackBundle) {\n try {\n const jsonContent = JSON.stringify(config.fallbackBundle);\n\n // Feature detection: check which expo-file-system API is available\n // Expo 52/53 has documentDirectory + writeAsStringAsync\n // Expo 54+ has File + Paths (new class-based API)\n // @ts-ignore - documentDirectory only exists in Expo 52/53 types\n const hasLegacyApi = typeof ExpoFileSystem.documentDirectory === 'string'\n && typeof ExpoFileSystem.writeAsStringAsync === 'function';\n const hasNewApi = 'File' in ExpoFileSystem && 'Paths' in ExpoFileSystem;\n\n if (hasLegacyApi) {\n // Expo 52/53 - use legacy API\n // @ts-ignore - documentDirectory only exists in Expo 52/53 types\n fallbackBundleUrlString = `${ExpoFileSystem.documentDirectory}helium-expo-fallbacks.json`;\n // @ts-ignore - writeAsStringAsync only exists in Expo 52/53 types\n await ExpoFileSystem.writeAsStringAsync(fallbackBundleUrlString, jsonContent);\n } else if (hasNewApi) {\n // Expo 54+ - use new class-based API\n // @ts-ignore - Types may not be available in older Expo versions\n const file = new ExpoFileSystem.File(ExpoFileSystem.Paths.document, 'helium-expo-fallbacks.json');\n file.create({ overwrite: true });\n file.write(jsonContent);\n fallbackBundleUrlString = file.uri;\n } else {\n throw new Error('No compatible expo-file-system API found');\n }\n } catch (error) {\n // Just use string approach if expo-file-system is unavailable or fails\n console.log(\n '[Helium] expo-file-system not available, passing fallback bundle as string.'\n );\n fallbackBundleString = JSON.stringify(config.fallbackBundle);\n }\n }\n\n\n // Create native config object\n const nativeConfig: NativeHeliumConfig = {\n apiKey: config.apiKey,\n customUserId: config.customUserId,\n customAPIEndpoint: config.customAPIEndpoint,\n customUserTraits: convertBooleansToMarkers(config.customUserTraits),\n revenueCatAppUserId: config.revenueCatAppUserId,\n fallbackBundleUrlString: fallbackBundleUrlString,\n fallbackBundleString: fallbackBundleString,\n paywallLoadingConfig: convertBooleansToMarkers(config.paywallLoadingConfig),\n useDefaultDelegate: !config.purchaseConfig,\n environment: config.environment,\n wrapperSdkVersion: SDK_VERSION,\n delegateType: config.purchaseConfig?._delegateType,\n };\n\n // Initialize the native module\n HeliumPaywallSdkModule.initialize(nativeConfig);\n};\n\nlet paywallEventHandlers: PaywallEventHandlers | undefined;\nlet presentOnFallback: (() => void) | undefined;\nexport const presentUpsell = ({\n triggerName,\n onFallback,\n eventHandlers,\n customPaywallTraits,\n dontShowIfAlreadyEntitled,\n }: PresentUpsellParams) => {\n try {\n paywallEventHandlers = eventHandlers;\n presentOnFallback = onFallback;\n HeliumPaywallSdkModule.presentUpsell(triggerName, convertBooleansToMarkers(customPaywallTraits), dontShowIfAlreadyEntitled);\n } catch (error) {\n console.log('[Helium] presentUpsell error', error);\n paywallEventHandlers = undefined;\n presentOnFallback = undefined;\n onFallback?.();\n HeliumPaywallSdkModule.fallbackOpenOrCloseEvent(triggerName, true, 'presented');\n }\n};\n\nfunction callPaywallEventHandlers(event: HeliumPaywallEvent) {\n if (paywallEventHandlers) {\n switch (event.type) {\n case 'paywallOpen':\n paywallEventHandlers?.onOpen?.({\n type: 'paywallOpen',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n viewType: 'presented',\n });\n break;\n case 'paywallClose':\n paywallEventHandlers?.onClose?.({\n type: 'paywallClose',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'paywallDismissed':\n paywallEventHandlers?.onDismissed?.({\n type: 'paywallDismissed',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'purchaseSucceeded':\n paywallEventHandlers?.onPurchaseSucceeded?.({\n type: 'purchaseSucceeded',\n productId: event.productId ?? 'unknown',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'paywallOpenFailed':\n paywallEventHandlers?.onOpenFailed?.({\n type: 'paywallOpenFailed',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n error: event.error ?? 'Unknown error',\n paywallUnavailableReason: event.paywallUnavailableReason,\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n case 'customPaywallAction':\n paywallEventHandlers?.onCustomPaywallAction?.({\n type: 'customPaywallAction',\n triggerName: event.triggerName ?? 'unknown',\n paywallName: event.paywallName ?? 'unknown',\n actionName: event.customPaywallActionName ?? 'unknown',\n params: event.customPaywallActionParams ?? {},\n isSecondTry: event.isSecondTry ?? false,\n });\n break;\n }\n paywallEventHandlers?.onAnyEvent?.(event);\n }\n}\n\nfunction handlePaywallEvent(event: HeliumPaywallEvent) {\n switch (event.type) {\n case 'paywallClose':\n if (!event.isSecondTry) {\n paywallEventHandlers = undefined;\n }\n presentOnFallback = undefined;\n break;\n case 'paywallSkipped':\n paywallEventHandlers = undefined;\n presentOnFallback = undefined;\n break;\n case 'paywallOpenFailed':\n paywallEventHandlers = undefined;\n const unavailableReason = event.paywallUnavailableReason;\n if (event.triggerName\n && unavailableReason !== \"alreadyPresented\"\n && unavailableReason !== \"secondTryNoMatch\") {\n console.log('[Helium] paywall open failed', unavailableReason);\n presentOnFallback?.();\n }\n presentOnFallback = undefined;\n break;\n }\n}\n\n/**\n * Routes native SDK log events to the appropriate console method.\n * Log levels: 1=error, 2=warn, 3=info, 4=debug, 5=trace\n */\nfunction logHeliumEvent(event: HeliumLogEvent) {\n const { level, message } = event;\n const metadata = event.metadata ?? {};\n const hasMetadata = Object.keys(metadata).length > 0;\n\n switch (level) {\n case 1: // error\n hasMetadata ? console.error(message, metadata) : console.error(message);\n break;\n case 2: // warn\n hasMetadata ? console.warn(message, metadata) : console.warn(message);\n break;\n case 3: // info\n hasMetadata ? console.info(message, metadata) : console.info(message);\n break;\n case 4: // debug\n case 5: // trace\n default:\n hasMetadata ? console.debug(message, metadata) : console.debug(message);\n break;\n }\n}\n\nexport const hideUpsell = HeliumPaywallSdkModule.hideUpsell;\nexport const hideAllUpsells = HeliumPaywallSdkModule.hideAllUpsells;\nexport const getDownloadStatus = HeliumPaywallSdkModule.getDownloadStatus;\nexport const setRevenueCatAppUserId = HeliumPaywallSdkModule.setRevenueCatAppUserId;\n\n/**\n * Set a custom user ID for the current user\n */\nexport const setCustomUserId = HeliumPaywallSdkModule.setCustomUserId;\n\n/**\n * Checks if the user has an active entitlement for any product attached to the paywall that will show for provided trigger.\n * @param trigger The trigger name to check entitlement for\n * @returns Promise resolving to true if entitled, false if not, or undefined if not known (i.e. the paywall is not downloaded yet)\n */\nexport const hasEntitlementForPaywall = async (trigger: string): Promise<boolean | undefined> => {\n const result = await HeliumPaywallSdkModule.hasEntitlementForPaywall(trigger);\n return result?.hasEntitlement;\n};\n\n/**\n * Checks if the user has any active subscription (including non-renewable)\n */\nexport const hasAnyActiveSubscription = HeliumPaywallSdkModule.hasAnyActiveSubscription;\n\n/**\n * Checks if the user has any entitlement\n */\nexport const hasAnyEntitlement = HeliumPaywallSdkModule.hasAnyEntitlement;\n\n/**\n * Reset Helium entirely so you can call initialize again. Only for advanced use cases.\n */\nexport const resetHelium = () => {\n paywallEventHandlers = undefined;\n presentOnFallback = undefined;\n HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');\n HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');\n HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');\n HeliumPaywallSdkModule.removeAllListeners('onHeliumLogEvent');\n HeliumPaywallSdkModule.resetHelium();\n isInitialized = false;\n};\n\n/**\n * Set custom strings to show in the dialog that Helium will display if a \"Restore Purchases\" action is not successful.\n * Note that these strings will not be localized by Helium for you.\n */\nexport const setCustomRestoreFailedStrings = HeliumPaywallSdkModule.setCustomRestoreFailedStrings;\n\n/**\n * Disable the default dialog that Helium will display if a \"Restore Purchases\" action is not successful.\n * You can handle this yourself if desired by listening for the PurchaseRestoreFailedEvent.\n */\nexport const disableRestoreFailedDialog = HeliumPaywallSdkModule.disableRestoreFailedDialog;\n\n/**\n * Override the light/dark mode for Helium paywalls\n * @param mode The mode to set: 'light', 'dark', or 'system' (follows device setting)\n */\nexport const setLightDarkModeOverride = HeliumPaywallSdkModule.setLightDarkModeOverride;\n\n/**\n * Get experiment allocation info for a specific trigger\n *\n * @param trigger The trigger name to get experiment info for\n * @returns ExperimentInfo if the trigger has experiment data, undefined otherwise\n */\nexport const getExperimentInfoForTrigger = (trigger: string): ExperimentInfo | undefined => {\n const result = HeliumPaywallSdkModule.getExperimentInfoForTrigger(trigger);\n if (!result) {\n console.log('[Helium] getExperimentInfoForTrigger unexpected error.');\n return;\n }\n if (result.getExperimentInfoErrorMsg) {\n console.log(`[Helium] ${result.getExperimentInfoErrorMsg}`);\n return;\n }\n // Validate required field exists before casting\n if (!result.experimentId) {\n console.log('[Helium] getExperimentInfoForTrigger returned data without required experimentId field.');\n return;\n }\n return result as ExperimentInfo;\n};\n\nexport const getPaywallInfo = (trigger: string): PaywallInfo | undefined => {\n const result = HeliumPaywallSdkModule.getPaywallInfo(trigger);\n if (!result) {\n console.log('[Helium] getPaywallInfo unexpected error.');\n return;\n }\n if (result.errorMsg) {\n console.log(`[Helium] ${result.errorMsg}`);\n return;\n }\n return {\n paywallTemplateName: result.templateName ?? 'unknown template',\n shouldShow: result.shouldShow ?? true,\n };\n};\n\nexport const handleDeepLink = (url: string | null) => {\n if (url) {\n const handled = HeliumPaywallSdkModule.handleDeepLink(url);\n console.log('[Helium] Handled deep link:', handled);\n return handled;\n }\n return false;\n};\n\n/**\n * Recursively converts boolean values to special marker strings to preserve\n * type information when passing through native bridge.\n *\n * Native bridge converts booleans to NSNumber (0/1), making them\n * indistinguishable from actual numeric values. This helper converts:\n * - true -> \"__helium_rn_bool_true__\"\n * - false -> \"__helium_rn_bool_false__\"\n * - All other values remain unchanged\n */\nfunction convertBooleansToMarkers(input: Record<string, any> | undefined): Record<string, any> | undefined {\n if (!input) return undefined;\n\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(input)) {\n result[key] = convertValueBooleansToMarkers(value);\n }\n return result;\n}\n/**\n * Helper to recursively convert booleans in any value type\n */\nfunction convertValueBooleansToMarkers(value: any): any {\n if (typeof value === 'boolean') {\n return value ? \"__helium_rn_bool_true__\" : \"__helium_rn_bool_false__\";\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n return convertBooleansToMarkers(value);\n } else if (value && Array.isArray(value)) {\n return value.map(convertValueBooleansToMarkers);\n }\n return value;\n}\n\nexport {createCustomPurchaseConfig, HELIUM_CTA_NAMES} from './HeliumPaywallSdk.types';\n"]}
|
|
@@ -14,12 +14,12 @@ Pod::Spec.new do |s|
|
|
|
14
14
|
:ios => '15.1',
|
|
15
15
|
:tvos => '15.1'
|
|
16
16
|
}
|
|
17
|
-
s.swift_version = '5.
|
|
17
|
+
s.swift_version = '5.7'
|
|
18
18
|
s.source = { git: 'https://github.com/cloudcaptainai/helium-expo-sdk' }
|
|
19
19
|
s.static_framework = true
|
|
20
20
|
|
|
21
21
|
s.dependency 'ExpoModulesCore'
|
|
22
|
-
s.dependency 'Helium', '
|
|
22
|
+
s.dependency 'Helium', '4.1.2'
|
|
23
23
|
|
|
24
24
|
# Swift/Objective-C compatibility
|
|
25
25
|
s.pod_target_xcconfig = {
|
|
@@ -38,7 +38,7 @@ private class NativeModuleManager {
|
|
|
38
38
|
static let shared = NativeModuleManager()
|
|
39
39
|
|
|
40
40
|
private let maxQueuedEvents = 30
|
|
41
|
-
private let eventExpirationSeconds: TimeInterval =
|
|
41
|
+
private let eventExpirationSeconds: TimeInterval = 10.0
|
|
42
42
|
|
|
43
43
|
// Always keep reference to the current module
|
|
44
44
|
var currentModule: HeliumPaywallSdkModule?
|
|
@@ -47,6 +47,9 @@ private class NativeModuleManager {
|
|
|
47
47
|
var activePurchaseContinuation: CheckedContinuation<HeliumPaywallTransactionStatus, Never>?
|
|
48
48
|
var activeRestoreContinuation: CheckedContinuation<Bool, Never>?
|
|
49
49
|
|
|
50
|
+
// Log listener token - stored here so it survives module recreation
|
|
51
|
+
var logListenerToken: HeliumLogListenerToken?
|
|
52
|
+
|
|
50
53
|
// Event queue for when no module is available or sendEvent fails
|
|
51
54
|
private struct PendingEvent {
|
|
52
55
|
let eventName: String
|
|
@@ -147,7 +150,7 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
147
150
|
// ])
|
|
148
151
|
|
|
149
152
|
// Defines event names that the module can send to JavaScript.
|
|
150
|
-
Events("onHeliumPaywallEvent", "onDelegateActionEvent", "paywallEventHandlers")
|
|
153
|
+
Events("onHeliumPaywallEvent", "onDelegateActionEvent", "paywallEventHandlers", "onHeliumLogEvent")
|
|
151
154
|
|
|
152
155
|
// todo use Record here? https://docs.expo.dev/modules/module-api/#records
|
|
153
156
|
Function("initialize") { (config: [String : Any]) in
|
|
@@ -157,21 +160,15 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
157
160
|
let userTraitsMap = convertMarkersToBooleans(config["customUserTraits"] as? [String : Any])
|
|
158
161
|
let fallbackBundleURLString = config["fallbackBundleUrlString"] as? String
|
|
159
162
|
let fallbackBundleString = config["fallbackBundleString"] as? String
|
|
160
|
-
|
|
163
|
+
|
|
161
164
|
let paywallLoadingConfig = convertMarkersToBooleans(config["paywallLoadingConfig"] as? [String: Any])
|
|
162
165
|
let useLoadingState = paywallLoadingConfig?["useLoadingState"] as? Bool ?? true
|
|
163
|
-
let loadingBudget = paywallLoadingConfig?["loadingBudget"] as? TimeInterval
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
triggerConfigs[trigger] = TriggerLoadingConfig(
|
|
170
|
-
useLoadingState: config["useLoadingState"] as? Bool,
|
|
171
|
-
loadingBudget: config["loadingBudget"] as? TimeInterval
|
|
172
|
-
)
|
|
173
|
-
}
|
|
174
|
-
perTriggerLoadingConfig = triggerConfigs
|
|
166
|
+
let loadingBudget = paywallLoadingConfig?["loadingBudget"] as? TimeInterval
|
|
167
|
+
if !useLoadingState {
|
|
168
|
+
// Setting <= 0 will disable loading state
|
|
169
|
+
Helium.config.defaultLoadingBudget = -1
|
|
170
|
+
} else {
|
|
171
|
+
Helium.config.defaultLoadingBudget = loadingBudget ?? 7.0
|
|
175
172
|
}
|
|
176
173
|
|
|
177
174
|
let useDefaultDelegate = config["useDefaultDelegate"] as? Bool ?? false
|
|
@@ -243,7 +240,7 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
243
240
|
} else if let jsonString = fallbackBundleString {
|
|
244
241
|
// write the string to a temp file
|
|
245
242
|
let tempURL = FileManager.default.temporaryDirectory
|
|
246
|
-
.appendingPathComponent("helium-
|
|
243
|
+
.appendingPathComponent("helium-expo-fallbacks.json")
|
|
247
244
|
|
|
248
245
|
if let data = jsonString.data(using: .utf8) {
|
|
249
246
|
try? data.write(to: tempURL)
|
|
@@ -254,23 +251,42 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
254
251
|
let wrapperSdkVersion = config["wrapperSdkVersion"] as? String ?? "unknown"
|
|
255
252
|
HeliumSdkConfig.shared.setWrapperSdkInfo(sdk: "expo", version: wrapperSdkVersion)
|
|
256
253
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
254
|
+
if let customUserId = config["customUserId"] as? String {
|
|
255
|
+
Helium.identify.userId = customUserId
|
|
256
|
+
}
|
|
257
|
+
if let userTraitsMap {
|
|
258
|
+
Helium.identify.setUserTraits(HeliumUserTraits(userTraitsMap))
|
|
259
|
+
}
|
|
260
|
+
if let rcAppUserId = config["revenueCatAppUserId"] as? String {
|
|
261
|
+
Helium.identify.revenueCatAppUserId = rcAppUserId
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
Helium.config.purchaseDelegate = useDefaultDelegate ? defaultDelegate : internalDelegate
|
|
265
|
+
if let fallbackBundleURL {
|
|
266
|
+
Helium.config.customFallbacksURL = fallbackBundleURL
|
|
267
|
+
}
|
|
268
|
+
if let customAPIEndpoint = config["customAPIEndpoint"] as? String {
|
|
269
|
+
Helium.config.customAPIEndpoint = customAPIEndpoint
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
Helium.shared.initialize(apiKey: config["apiKey"] as? String ?? "")
|
|
273
|
+
|
|
274
|
+
// Set up log listener if not already registered
|
|
275
|
+
if NativeModuleManager.shared.logListenerToken == nil {
|
|
276
|
+
NativeModuleManager.shared.logListenerToken = HeliumLogger.addLogListener { event in
|
|
277
|
+
// Drop log events if no module is available - don't queue them.
|
|
278
|
+
// Logs could be high-volume and could evict critical events (purchase/restore).
|
|
279
|
+
guard NativeModuleManager.shared.currentModule != nil else { return }
|
|
280
|
+
|
|
281
|
+
let eventData: [String: Any] = [
|
|
282
|
+
"level": event.level.rawValue,
|
|
283
|
+
"category": event.category.rawValue,
|
|
284
|
+
"message": event.message,
|
|
285
|
+
"metadata": event.metadata
|
|
286
|
+
]
|
|
287
|
+
NativeModuleManager.shared.safeSendEvent(eventName: "onHeliumLogEvent", eventData: eventData)
|
|
288
|
+
}
|
|
289
|
+
}
|
|
274
290
|
}
|
|
275
291
|
|
|
276
292
|
// Function for JavaScript to provide purchase result
|
|
@@ -315,24 +331,28 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
315
331
|
|
|
316
332
|
Function("presentUpsell") { (trigger: String, customPaywallTraits: [String: Any]?, dontShowIfAlreadyEntitled: Bool?) in
|
|
317
333
|
NativeModuleManager.shared.currentModule = self // extra redundancy to update to latest live module
|
|
318
|
-
Helium.shared.
|
|
334
|
+
Helium.shared.presentPaywall(
|
|
319
335
|
trigger: trigger,
|
|
336
|
+
config: PaywallPresentationConfig(
|
|
337
|
+
customPaywallTraits: convertMarkersToBooleans(customPaywallTraits),
|
|
338
|
+
dontShowIfAlreadyEntitled: dontShowIfAlreadyEntitled ?? false
|
|
339
|
+
),
|
|
320
340
|
eventHandlers: PaywallEventHandlers.withHandlers(
|
|
321
341
|
onAnyEvent: { event in
|
|
322
342
|
NativeModuleManager.shared.safeSendEvent(eventName: "paywallEventHandlers", eventData: event.toDictionary())
|
|
323
343
|
}
|
|
324
|
-
)
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
344
|
+
)
|
|
345
|
+
) { paywallNotShownReason in
|
|
346
|
+
// nothing for now
|
|
347
|
+
}
|
|
328
348
|
}
|
|
329
349
|
|
|
330
350
|
Function("hideUpsell") {
|
|
331
|
-
let _ = Helium.shared.
|
|
351
|
+
let _ = Helium.shared.hidePaywall()
|
|
332
352
|
}
|
|
333
353
|
|
|
334
354
|
Function("hideAllUpsells") {
|
|
335
|
-
Helium.shared.
|
|
355
|
+
Helium.shared.hideAllPaywalls()
|
|
336
356
|
}
|
|
337
357
|
|
|
338
358
|
Function("getDownloadStatus") {
|
|
@@ -362,24 +382,24 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
362
382
|
}
|
|
363
383
|
|
|
364
384
|
Function("setRevenueCatAppUserId") { (rcAppUserId: String) in
|
|
365
|
-
Helium.
|
|
385
|
+
Helium.identify.revenueCatAppUserId = rcAppUserId
|
|
366
386
|
}
|
|
367
387
|
|
|
368
388
|
Function("setCustomUserId") { (newUserId: String) in
|
|
369
|
-
Helium.
|
|
389
|
+
Helium.identify.userId = newUserId
|
|
370
390
|
}
|
|
371
391
|
|
|
372
392
|
AsyncFunction("hasEntitlementForPaywall") { (trigger: String) in
|
|
373
|
-
let hasEntitlement = await Helium.
|
|
393
|
+
let hasEntitlement = await Helium.entitlements.hasEntitlementForPaywall(trigger: trigger)
|
|
374
394
|
return HasEntitlementResult(hasEntitlement: hasEntitlement)
|
|
375
395
|
}
|
|
376
396
|
|
|
377
397
|
AsyncFunction("hasAnyActiveSubscription") {
|
|
378
|
-
return await Helium.
|
|
398
|
+
return await Helium.entitlements.hasAnyActiveSubscription()
|
|
379
399
|
}
|
|
380
400
|
|
|
381
401
|
AsyncFunction("hasAnyEntitlement") {
|
|
382
|
-
return await Helium.
|
|
402
|
+
return await Helium.entitlements.hasAny()
|
|
383
403
|
}
|
|
384
404
|
|
|
385
405
|
Function("handleDeepLink") { (urlString: String) in
|
|
@@ -391,7 +411,7 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
391
411
|
}
|
|
392
412
|
|
|
393
413
|
Function("getExperimentInfoForTrigger") { (trigger: String) -> [String: Any] in
|
|
394
|
-
guard let experimentInfo = Helium.
|
|
414
|
+
guard let experimentInfo = Helium.experiments.infoForTrigger(trigger) else {
|
|
395
415
|
return ["getExperimentInfoErrorMsg": "No experiment info found for trigger: \(trigger)"]
|
|
396
416
|
}
|
|
397
417
|
|
|
@@ -407,11 +427,11 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
407
427
|
}
|
|
408
428
|
|
|
409
429
|
Function("disableRestoreFailedDialog") {
|
|
410
|
-
Helium.
|
|
430
|
+
Helium.config.restorePurchasesDialog.disableRestoreFailedDialog()
|
|
411
431
|
}
|
|
412
432
|
|
|
413
433
|
Function("setCustomRestoreFailedStrings") { (customTitle: String?, customMessage: String?, customCloseButtonText: String?) in
|
|
414
|
-
Helium.
|
|
434
|
+
Helium.config.restorePurchasesDialog.setCustomRestoreFailedStrings(
|
|
415
435
|
customTitle: customTitle,
|
|
416
436
|
customMessage: customMessage,
|
|
417
437
|
customCloseButtonText: customCloseButtonText
|
|
@@ -419,6 +439,9 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
419
439
|
}
|
|
420
440
|
|
|
421
441
|
Function("resetHelium") {
|
|
442
|
+
// Clean up log listener
|
|
443
|
+
NativeModuleManager.shared.logListenerToken?.remove()
|
|
444
|
+
NativeModuleManager.shared.logListenerToken = nil
|
|
422
445
|
Helium.resetHelium()
|
|
423
446
|
}
|
|
424
447
|
|
|
@@ -435,7 +458,7 @@ public class HeliumPaywallSdkModule: Module {
|
|
|
435
458
|
print("[Helium] Invalid mode: \(mode), defaulting to system")
|
|
436
459
|
heliumMode = .system
|
|
437
460
|
}
|
|
438
|
-
Helium.
|
|
461
|
+
Helium.config.lightDarkModeOverride = heliumMode
|
|
439
462
|
}
|
|
440
463
|
|
|
441
464
|
// Enables the module to be used as a native view. Definition components that are accepted as part of the
|
package/package.json
CHANGED
|
@@ -8,7 +8,20 @@ export type HeliumPaywallSdkModuleEvents = {
|
|
|
8
8
|
onHeliumPaywallEvent: (params: HeliumPaywallEvent) => void;
|
|
9
9
|
onDelegateActionEvent: (params: DelegateActionEvent) => void;
|
|
10
10
|
paywallEventHandlers: (params: HeliumPaywallEvent) => void;
|
|
11
|
+
onHeliumLogEvent: (params: HeliumLogEvent) => void;
|
|
11
12
|
};
|
|
13
|
+
|
|
14
|
+
/** A log event emitted by the Helium SDK. */
|
|
15
|
+
export interface HeliumLogEvent {
|
|
16
|
+
/** Numeric log level (1=error, 2=warn, 3=info, 4=debug, 5=trace). */
|
|
17
|
+
level: number;
|
|
18
|
+
/** The category/subsystem that generated this log (iOS) or tag (Android). */
|
|
19
|
+
category: string;
|
|
20
|
+
/** The log message (prefixed with "[Helium] "). */
|
|
21
|
+
message: string;
|
|
22
|
+
/** Key-value metadata associated with this log event (iOS only, empty on Android). */
|
|
23
|
+
metadata: Record<string, string>;
|
|
24
|
+
}
|
|
12
25
|
export type HeliumPaywallEvent = {
|
|
13
26
|
type: 'paywallOpen' | 'paywallClose' | 'paywallDismissed' |
|
|
14
27
|
'paywallOpenFailed' | 'paywallSkipped' | 'paywallButtonPressed' |
|
|
@@ -117,13 +130,6 @@ export function createCustomPurchaseConfig(callbacks: {
|
|
|
117
130
|
};
|
|
118
131
|
}
|
|
119
132
|
|
|
120
|
-
export type TriggerLoadingConfig = {
|
|
121
|
-
/** Whether to show loading state for this trigger. Set to nil to use the global `useLoadingState` setting. */
|
|
122
|
-
useLoadingState?: boolean;
|
|
123
|
-
/** Maximum seconds to show loading for this trigger. Set to nil to use the global `loadingBudget` setting. */
|
|
124
|
-
loadingBudget?: number;
|
|
125
|
-
};
|
|
126
|
-
|
|
127
133
|
export type HeliumPaywallLoadingConfig = {
|
|
128
134
|
/**
|
|
129
135
|
* Whether to show a loading state while fetching paywall configuration.
|
|
@@ -137,13 +143,6 @@ export type HeliumPaywallLoadingConfig = {
|
|
|
137
143
|
* Default: 7.0 seconds
|
|
138
144
|
*/
|
|
139
145
|
loadingBudget?: number;
|
|
140
|
-
/**
|
|
141
|
-
* Optional per-trigger loading configuration overrides.
|
|
142
|
-
* Use this to customize loading behavior for specific triggers.
|
|
143
|
-
* Keys are trigger names, values are TriggerLoadingConfig instances.
|
|
144
|
-
* Example: Disable loading for "onboarding" trigger while keeping it for others.
|
|
145
|
-
*/
|
|
146
|
-
perTriggerLoadingConfig?: Record<string, TriggerLoadingConfig>;
|
|
147
146
|
};
|
|
148
147
|
|
|
149
148
|
export interface HeliumConfig {
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DelegateActionEvent,
|
|
3
3
|
HeliumConfig,
|
|
4
|
+
HeliumLogEvent,
|
|
4
5
|
HeliumPaywallEvent,
|
|
5
6
|
NativeHeliumConfig, PaywallEventHandlers, PaywallInfo, PresentUpsellParams,
|
|
6
7
|
} from "./HeliumPaywallSdk.types";
|
|
@@ -34,6 +35,10 @@ function addPaywallEventHandlersListener(listener: (event: HeliumPaywallEvent) =
|
|
|
34
35
|
return HeliumPaywallSdkModule.addListener('paywallEventHandlers', listener);
|
|
35
36
|
}
|
|
36
37
|
|
|
38
|
+
function addHeliumLogEventListener(listener: (event: HeliumLogEvent) => void): EventSubscription {
|
|
39
|
+
return HeliumPaywallSdkModule.addListener('onHeliumLogEvent', listener);
|
|
40
|
+
}
|
|
41
|
+
|
|
37
42
|
let isInitialized = false;
|
|
38
43
|
export const initialize = async (config: HeliumConfig) => {
|
|
39
44
|
if (isInitialized) {
|
|
@@ -44,6 +49,7 @@ export const initialize = async (config: HeliumConfig) => {
|
|
|
44
49
|
HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');
|
|
45
50
|
HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');
|
|
46
51
|
HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');
|
|
52
|
+
HeliumPaywallSdkModule.removeAllListeners('onHeliumLogEvent');
|
|
47
53
|
|
|
48
54
|
// Set up listener for paywall events
|
|
49
55
|
addHeliumPaywallEventListener((event) => {
|
|
@@ -115,6 +121,11 @@ export const initialize = async (config: HeliumConfig) => {
|
|
|
115
121
|
callPaywallEventHandlers(event);
|
|
116
122
|
});
|
|
117
123
|
|
|
124
|
+
// Set up listener for native SDK logs
|
|
125
|
+
addHeliumLogEventListener((event) => {
|
|
126
|
+
logHeliumEvent(event);
|
|
127
|
+
});
|
|
128
|
+
|
|
118
129
|
await nativeInitializeAsync(config).catch(error => {
|
|
119
130
|
console.error('[Helium] Initialization failed:', error);
|
|
120
131
|
});
|
|
@@ -138,13 +149,13 @@ const nativeInitializeAsync = async (config: HeliumConfig) => {
|
|
|
138
149
|
if (hasLegacyApi) {
|
|
139
150
|
// Expo 52/53 - use legacy API
|
|
140
151
|
// @ts-ignore - documentDirectory only exists in Expo 52/53 types
|
|
141
|
-
fallbackBundleUrlString = `${ExpoFileSystem.documentDirectory}helium-
|
|
152
|
+
fallbackBundleUrlString = `${ExpoFileSystem.documentDirectory}helium-expo-fallbacks.json`;
|
|
142
153
|
// @ts-ignore - writeAsStringAsync only exists in Expo 52/53 types
|
|
143
154
|
await ExpoFileSystem.writeAsStringAsync(fallbackBundleUrlString, jsonContent);
|
|
144
155
|
} else if (hasNewApi) {
|
|
145
156
|
// Expo 54+ - use new class-based API
|
|
146
157
|
// @ts-ignore - Types may not be available in older Expo versions
|
|
147
|
-
const file = new ExpoFileSystem.File(ExpoFileSystem.Paths.document, 'helium-
|
|
158
|
+
const file = new ExpoFileSystem.File(ExpoFileSystem.Paths.document, 'helium-expo-fallbacks.json');
|
|
148
159
|
file.create({ overwrite: true });
|
|
149
160
|
file.write(jsonContent);
|
|
150
161
|
fallbackBundleUrlString = file.uri;
|
|
@@ -291,6 +302,33 @@ function handlePaywallEvent(event: HeliumPaywallEvent) {
|
|
|
291
302
|
}
|
|
292
303
|
}
|
|
293
304
|
|
|
305
|
+
/**
|
|
306
|
+
* Routes native SDK log events to the appropriate console method.
|
|
307
|
+
* Log levels: 1=error, 2=warn, 3=info, 4=debug, 5=trace
|
|
308
|
+
*/
|
|
309
|
+
function logHeliumEvent(event: HeliumLogEvent) {
|
|
310
|
+
const { level, message } = event;
|
|
311
|
+
const metadata = event.metadata ?? {};
|
|
312
|
+
const hasMetadata = Object.keys(metadata).length > 0;
|
|
313
|
+
|
|
314
|
+
switch (level) {
|
|
315
|
+
case 1: // error
|
|
316
|
+
hasMetadata ? console.error(message, metadata) : console.error(message);
|
|
317
|
+
break;
|
|
318
|
+
case 2: // warn
|
|
319
|
+
hasMetadata ? console.warn(message, metadata) : console.warn(message);
|
|
320
|
+
break;
|
|
321
|
+
case 3: // info
|
|
322
|
+
hasMetadata ? console.info(message, metadata) : console.info(message);
|
|
323
|
+
break;
|
|
324
|
+
case 4: // debug
|
|
325
|
+
case 5: // trace
|
|
326
|
+
default:
|
|
327
|
+
hasMetadata ? console.debug(message, metadata) : console.debug(message);
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
294
332
|
export const hideUpsell = HeliumPaywallSdkModule.hideUpsell;
|
|
295
333
|
export const hideAllUpsells = HeliumPaywallSdkModule.hideAllUpsells;
|
|
296
334
|
export const getDownloadStatus = HeliumPaywallSdkModule.getDownloadStatus;
|
|
@@ -330,6 +368,7 @@ export const resetHelium = () => {
|
|
|
330
368
|
HeliumPaywallSdkModule.removeAllListeners('onHeliumPaywallEvent');
|
|
331
369
|
HeliumPaywallSdkModule.removeAllListeners('onDelegateActionEvent');
|
|
332
370
|
HeliumPaywallSdkModule.removeAllListeners('paywallEventHandlers');
|
|
371
|
+
HeliumPaywallSdkModule.removeAllListeners('onHeliumLogEvent');
|
|
333
372
|
HeliumPaywallSdkModule.resetHelium();
|
|
334
373
|
isInitialized = false;
|
|
335
374
|
};
|