Release: 2.29.1 - #236
Release: 2.29.1#236
Conversation
… 2.29.1 UsercentricsCore.denyAll and denyAllForTCF gained a new unsavedServiceDecisions parameter in the native iOS SDK 2.29.1 (statistical exception support). The Kotlin common interface defaults it to null, but that default isn't carried over to the generated Swift/ObjC interop, so the RN wrapper failed to compile against the bumped native SDK version. Pass nil from RNUsercentricsModule.swift for both call sites, preserving the existing public JS API and behavior (nil means no unsaved service decisions are considered, matching pre-2.29.1 semantics per UsercentricsSDKImpl.denyAll). Updated the FakeUsercentricsManager test mock to match the new protocol signature. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Usercentrics 2.29.1 added a required isExempt parameter to several native init signatures used by test mocks (UsercentricsService, ServiceConsentTemplate, SubConsentTemplate, UsercentricsCategory). Update CMPData+Mock.swift to pass isExempt: false, matching pre-2.29.1 (non-exempt) semantics. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Skipping CodeAnt AI review — this PR is a back-merge between long-lived branches ( If you want to analyze this anyway (e.g. you resolved conflicts with new logic), comment |
|
Warning Review limit reached
Next review available in: 6 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (2)
📒 Files selected for processing (8)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
PR Summary by QodoRelease 2.29.1: bump native SDKs and fix iOS interop build
AI Description
Diagram
High-Level Assessment
Files changed (10)
|
|
PR Summary: Bump release to 2.29.1, add release notes and repo guidance; add support for passing per-service "unsavedServiceDecisions" through native denyAll APIs and update tests/mocks. Changes:
|
|
Reviewed up to commit:a1f00c885304e0dabfc8a5285c5dab2db6c28021 Additional SuggestionOthers- You modified iOS-native Manager APIs to accept unsavedServiceDecisions, but the RN codegen spec (RNUsercentricsModuleSpec.kt) and Android RN bridge still use the older signatures. If the new parameter is intended to be part of the public JS API, update the codegen spec and Android bridge to match, then regenerate codegen artifacts. If it is intentionally iOS-internal only, add a comment in the spec/release notes clarifying that the JS API is unchanged to avoid confusion.// android/src/main/java/com/usercentrics/reactnative/RNUsercentricsModuleSpec.kt
@ReactMethod
abstract fun denyAll(
consentType: Double,
unsavedServiceDecisions: ReadableMap?,
promise: Promise
)
@ReactMethod
abstract fun denyAllForTCF(
fromLayer: Double,
consentType: Double,
unsavedPurposeLIDecisions: ReadableArray,
unsavedVendorLIDecisions: ReadableArray,
unsavedServiceDecisions: ReadableMap?,
promise: Promise
)// android/src/main/java/com/usercentrics/reactnative/RNUsercentricsModule.kt
@ReactMethod
override fun denyAllForTCF(
fromLayer: Double,
consentType: Double,
unsavedPurposeLIDecisions: ReadableArray,
unsavedVendorLIDecisions: ReadableArray,
unsavedServiceDecisions: ReadableMap?,
promise: Promise
) {
promise.resolve(
usercentricsProxy.instance.denyAllForTCF(
TCFDecisionUILayer.values()[fromLayer.toInt()],
UsercentricsConsentType.values()[consentType.toInt()],
unsavedPurposeLIDecisions.deserializePurposeLIDecisionsMap(),
unsavedVendorLIDecisions.deserializePurposeLIDecisionsMap(),
unsavedServiceDecisions.deserializeServiceDecisionsMap()
).toWritableArray()
)
}
@ReactMethod
override fun denyAll(
consentType: Double,
unsavedServiceDecisions: ReadableMap?,
promise: Promise
) {
promise.resolve(
usercentricsProxy.instance.denyAll(
UsercentricsConsentType.values()[consentType.toInt()],
unsavedServiceDecisions.deserializeServiceDecisionsMap()
).toWritableArray()
)
}
// helper (same file or appropriate extension file)
private fun ReadableMap?.deserializeServiceDecisionsMap(): Map<String, KotlinBoolean>? {
if (this == null || this.entryIterator.hasNext().not()) return null
val result = mutableMapOf<String, KotlinBoolean>()
val iterator = this.entryIterator
while (iterator.hasNext()) {
val entry = iterator.next()
val key = entry.key
val value = entry.value as? Boolean ?: continue
result[key] = KotlinBoolean(value)
}
return result
} |
Code Review by Qodo
1. Breaking public Swift protocol
|
No description provided.