Skip to content

Commit f837e31

Browse files
committed
Fix delegate events from Compose paywalls
1 parent 6eaf64e commit f837e31

3 files changed

Lines changed: 61 additions & 5 deletions

File tree

superwall-compose/src/main/java/com/superwall/sdk/compose/PaywallComposable.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,6 @@ fun PaywallComposable(
9292
when {
9393
viewState.value != null -> {
9494
viewState.value?.let { viewToRender ->
95-
LaunchedEffect(viewToRender) {
96-
viewToRender.onViewCreated()
97-
}
9895
val themeChanged = rememberThemeChanged()
9996
AndroidView(
10097
modifier = modifier,
@@ -103,7 +100,8 @@ fun PaywallComposable(
103100
it.onThemeChanged()
104101
}
105102
},
106-
factory = { context ->
103+
factory = {
104+
viewToRender.onViewCreated()
107105
viewToRender
108106
},
109107
onRelease = {

superwall/src/main/java/com/superwall/sdk/analytics/internal/TrackingLogic.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ sealed class TrackingLogic {
141141
input?.let { value ->
142142
when (value) {
143143
is List<*> -> null
144-
is Map<*, *> -> value
144+
is Map<*, *> -> cleanMap(value)
145145
is String -> value
146146
is Int, is Float, is Double, is Long, is Boolean -> value
147147
is JsonElement -> value.convertFromJsonElement()
@@ -161,6 +161,27 @@ sealed class TrackingLogic {
161161
}
162162
}
163163

164+
private fun cleanNested(input: Any?): Any? =
165+
input?.let { value ->
166+
when (value) {
167+
is List<*> -> cleanList(value)
168+
is Map<*, *> -> cleanMap(value)
169+
else -> clean(value)
170+
}
171+
}
172+
173+
private fun cleanMap(value: Map<*, *>): Map<String, Any> =
174+
value
175+
.mapNotNull { (key, nestedValue) ->
176+
val cleanedValue = cleanNested(nestedValue) ?: return@mapNotNull null
177+
key?.toString()?.let { it to cleanedValue }
178+
}.toMap()
179+
180+
private fun cleanList(value: List<*>): List<Any>? {
181+
val cleanedValues = value.mapNotNull { cleanNested(it) }
182+
return cleanedValues.ifEmpty { null }
183+
}
184+
164185
@Throws(Exception::class)
165186
fun checkNotSuperwallEvent(event: String) {
166187
// Try to create a SuperwallEvents event from the event string

superwall/src/test/java/com/superwall/sdk/analytics/internal/TrackingLogicTest.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,43 @@ class TrackingLogicTest {
7676
assertEquals("https://example.com", parameters.delegateParams["uri_value"])
7777
}
7878

79+
@Test
80+
fun processParameters_recursivelyCleansNestedMaps() =
81+
runBlocking {
82+
val trackable =
83+
TrackableTestUtils.fakeTrackable(
84+
rawName = "event_a",
85+
superwallParams =
86+
mapOf(
87+
"customer_info" to
88+
mapOf(
89+
"userId" to "user-123",
90+
"subscriptions" to
91+
listOf(
92+
mapOf(
93+
"productId" to "pro_monthly",
94+
"unsupported" to Any(),
95+
"nullValue" to null,
96+
),
97+
),
98+
"unsupported" to Any(),
99+
),
100+
),
101+
canImplicitlyTrigger = false,
102+
)
103+
104+
val parameters = TrackingLogic.processParameters(trackable, appSessionId = "session-123")
105+
106+
val customerInfo = parameters.delegateParams["customer_info"] as Map<*, *>
107+
val subscriptions = customerInfo["subscriptions"] as List<*>
108+
val subscription = subscriptions.first() as Map<*, *>
109+
assertEquals("user-123", customerInfo["userId"])
110+
assertEquals("pro_monthly", subscription["productId"])
111+
assertFalse(subscription.containsKey("unsupported"))
112+
assertFalse(subscription.containsKey("nullValue"))
113+
assertFalse(customerInfo.containsKey("unsupported"))
114+
}
115+
79116
@Test
80117
fun isNotDisabledVerboseEvent_handlesVariousEventTypes() {
81118
val paywallInfo = PaywallInfo.empty()

0 commit comments

Comments
 (0)