Skip to content

feat(SDK-548): React Native SDK feature parity epic - #933

Open
jferrao-itrbl wants to merge 50 commits into
masterfrom
feature/SDK-548-feature-parity
Open

jferrao-itrbl wants to merge 50 commits into
masterfrom
feature/SDK-548-feature-parity

Conversation

@jferrao-itrbl

@jferrao-itrbl jferrao-itrbl commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Epic integration PR for SDK-548. This merges the long-lived feature/SDK-548-feature-parity branch into master.

Each slice below was implemented on its own branch, reviewed, and merged into this epic branch already. This PR is mainly integration and changelog packaging, not a first-pass review of new design.

Jira Ticket: SDK-548

Included work (already reviewed)

Jira Branch PR
SDK-549 feature/SDK-549-logout-user-parity #900
SDK-550 feature/SDK-550-disable-device-all-users #901
SDK-555 feature/SDK-555-keychain-encryption #905
SDK-557 feature/SDK-557-decryption-failure-handler #906
SDK-559 feature/SDK-559-get-auth-token #907
SDK-748 feature/SDK-748-forward-app-already-running #912
SDK-749 feature/SDK-749-success-failure-callbacks #908
SDK-750 feature/SDK-750-expose-json-only #913
SDK-751 feature/SDK-751-sync-messages-placement-ids #914

SDK-798 (Android scoped embedded sync caveat) is documented in the SDK-751 changelog note and in #913, not a separate branch on this epic.

Unknown User Activation follow-ups (SDK-553, SDK-554, SDK-556, SDK-561, SDK-794, SDK-804) live on feature/SDK-548-uua-feature-parity, not in this PR.

Description

Rolls up RN bridge and API parity work tracked under SDK-548: push open appAlreadyRunning, embedded sync callbacks and scoped sync, in-app jsonOnly, auth token read, Android keychain encryption and decryption failure handling, and disableDeviceForAllUsers, plus logout documentation (SDK-549).

See CHANGELOG.md Unreleased for customer-facing bullets.

How to test?

  • Confirm CI on this PR (lint, typecheck, Jest with coverage, circular deps, example builds).
  • Spot-check one change from the table above if you want a sanity pass on the integrated tree.
  • No new behavior is expected beyond what was already verified on the linked PRs.

Changelog

Unreleased section added in CHANGELOG.md on this branch.

Loom recording if applicable

N/A

Github Issues solved

N/A

Docs PR if applicable

N/A (SDK-549 is in-repo documentation only; see #900)

jferrao-itrbl and others added 30 commits September 12, 2026 07:26
Co-authored-by: Cursor <cursoragent@cursor.com>
Bridge Iterable.disableDeviceForAllUsers() so iOS can unregister this
device's push token for every associated user. Android stays a logged
no-op because the native SDK has no public equivalent.

Co-authored-by: Cursor <cursoragent@cursor.com>
Keep the native bridge no-op, but emit the same unsupported warning from
JS so the gap is visible without logcat when logReactNativeSdkCalls is on.

Co-authored-by: Cursor <cursoragent@cursor.com>
…all-users

feat(SDK-550): expose disableDeviceForAllUsers on the RN SDK
Co-authored-by: Cursor <cursoragent@cursor.com>
docs(SDK-549): document logout() as native logoutUser equivalent
Add IterableConfig.keychainEncryption (default true) and apply it on the
Android bridge, deprecating encryptionEnforced which was never honored.

Co-authored-by: Cursor <cursoragent@cursor.com>
Align encryptionEnforced JSDoc with keychainEncryption defaults and assert
explicit keychainEncryption wins over encryptionEnforced in toDict().

Co-authored-by: Cursor <cursoragent@cursor.com>
Expose IterableConfig.decryptionFailureHandler so RN apps can react when
Android keychain PII decryption fails, matching native IterableConfig parity.
Avoid RN debug RedBox when apps set decryptionFailureHandler on iOS.
Assert listenerCount in the omitted-callback test.
Bridge native JWT reads for parity with Android getAuthToken() and iOS
IterableAPI.authToken, alongside existing getEmail/getUserId.
Expose IterableConfig sync success/failure handlers via native events
so apps can observe embedded sync outcomes.
Assert sync handlers stay separate from message-update events and
respect enableEmbeddedMessaging when callbacks are omitted or set.
Drop dead encryptionEnforced fallback, tighten deprecated docs, and trim
misleading tests per PR review.
…tion

feat(SDK-555): wire Android keychain encryption config
IterableKeychain caches decryptionFailureHandler at first construction.
Register the RN bridge unconditionally; keep the JS listener conditional.
…ure-handler

feat(SDK-557): bridge Android decryption failure handler to JS
feat(SDK-559): expose Iterable.authManager.getAuthToken()
The bridge accepted the flag but dropped it before IterableApi.
Call the five-argument trackPushOpen overload so campaigns see the real value.
Add RNIterableInternal unit tests against the five-argument trackPushOpen
overload, wire testDebugUnitTest in CI, and implement embedded sync handler
stubs required to compile against iterableapi 3.10.1.
Keep compile-only stubs for IterableEmbeddedUpdateHandler without emitting
events outside SDK-748 scope; JS wiring remains SDK-749.
Serialize the native JSON-only flag onto bridge dictionaries so inAppHandler
and message fetches can distinguish JSON-only in-apps from HTML messages.
Always overwrite jsonOnly with a boolean after toJSONObject() so the bridge
does not forward native integer 1 to JS.
Use put(boolean) instead of putOpt so false is always written, and propagate
JSONException to existing handlers in onNewInApp and getMessages paths.
Expose optional placement scoping on embedded sync so RN matches native
Android and iOS APIs; omit/null/empty still syncs all placements.
Lock AC2 sync-all inputs at IterableApi and IterableEmbeddedManager.
…-callbacks

feat(SDK-749): embedded messaging sync success and failure callbacks
…rward-app-already-running

Keep parity embedded sync handler emissions; SDK-748 push-open forwarding unchanged.
Scope push-open fix to trackPushOpenWithCampaignId and call the package
script from the Android CI job.
…eady-running

fix(SDK-748): forward appAlreadyRunning on Android push open
Resolve Android conflicts: keep embedded sync events from the feature
branch, adopt master logging and Robolectric test dependency.
Add Robolectric tests for Android getInAppMessageJson boolean overwrite and
Jest coverage for inAppHandler and getMessages jsonOnly payloads.
Warn when scoped sync is used on Android and document iOS/Android cache
behavior in CHANGELOG and public TSDoc for SDK-751.
feat(SDK-750): expose jsonOnly on in-app message payloads
…lacement-ids

feat(SDK-751): add placement IDs to syncMessages
@jferrao-itrbl
jferrao-itrbl requested a review from a team as a code owner October 29, 2026 02:23
@github-actions

Copy link
Copy Markdown
Lines Statements Branches Functions
Coverage: 72%
72.77% (604/830) 62.59% (246/393) 68.04% (181/266)

@qltysh

qltysh Bot commented Oct 29, 2026

Copy link
Copy Markdown

Qlty


Coverage Impact

⬆️ Merging this pull request will increase total coverage on master by 0.8%.

Modified Files with Diff Coverage (6)

RatingFile% DiffUncovered Line #s
Coverage rating: A Coverage rating: A
src/core/classes/IterableApi.ts100.0%
Coverage rating: A Coverage rating: A
src/embedded/classes/IterableEmbeddedManager.ts100.0%
Coverage rating: A Coverage rating: A
src/core/classes/Iterable.ts100.0%
Coverage rating: A Coverage rating: A
src/core/classes/IterableConfig.ts100.0%
Coverage rating: A Coverage rating: A
src/inApp/classes/IterableInAppMessage.ts100.0%
Coverage rating: A Coverage rating: A
src/core/classes/IterableAuthManager.ts100.0%
Total100.0%
🚦 See full report on Qlty Cloud »

🛟 Help
  • Diff Coverage: Coverage for added or modified lines of code (excludes deleted files). Learn more.

  • Total Coverage: Coverage for the whole repository, calculated as the sum of all File Coverage. Learn more.

  • File Coverage: Covered Lines divided by Covered Lines plus Missed Lines. (Excludes non-executable lines including blank lines and comments.)

    • Indirect Changes: Changes to File Coverage for files that were not modified in this PR. Learn more.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant