Add single_step_fallback_id field to PublishedWorkflow#3436
Merged
Conversation
Adds the optional `singleStepFallbackId` field to `PublishedWorkflow` so the backend can identify which step holds the canonical package list for multi-step workflows where earlier steps have no package components. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Covers the two resilience cases: field present is parsed correctly, field absent (e.g. removed from backend) defaults to null without error. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Covers field present (parsed correctly) and field absent (defaults to null without error, i.e. backend can safely remove it). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ows/PublishedWorkflowSerializationTest.kt
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #3436 +/- ##
=======================================
Coverage 79.47% 79.47%
=======================================
Files 362 362
Lines 14547 14547
Branches 1977 1977
=======================================
Hits 11561 11561
Misses 2190 2190
Partials 796 796 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
This was referenced May 6, 2026
matteinn
pushed a commit
to matteinn/purchases-android
that referenced
this pull request
Jun 5, 2026
**This is an automatic release.** ## RevenueCat SDK ### ✨ New Features * Add optional support for setting obfuscated account id to product changes (RevenueCat#3428) via Mark Villacampa (@MarkVillacampa) ## RevenueCatUI SDK ### Paywallv2 #### ✨ New Features * Add slide transition to workflow paywalls (RevenueCat#3418) via Cesar de la Vega (@vegaro) * Workflow state & ViewModel infrastructure (RevenueCat#3416) via Cesar de la Vega (@vegaro) #### 🐞 Bugfixes * Fix paywall layout direction for RTL locale overrides (PWENG-39) (RevenueCat#3425) via Monika Mateska (@MonikaMateska) * Apply ripple shape clip on a sibling Box to avoid clipping content (RevenueCat#3395) via Toni Rico (@tonidero) ### 🔄 Other Changes * build(deps): bump fastlane-plugin-revenuecat_internal from `21e02ec` to `af7bb5c` (RevenueCat#3442) via dependabot[bot] (@dependabot[bot]) * Abstract workflow page transition animation behind sealed class (RevenueCat#3430) via Cesar de la Vega (@vegaro) * Add `single_step_fallback_id` field to `PublishedWorkflow` (RevenueCat#3436) via Cesar de la Vega (@vegaro) * build(deps): bump fastlane-plugin-revenuecat_internal from `2d11430` to `21e02ec` (RevenueCat#3429) via dependabot[bot] (@dependabot[bot]) * Generalize `PaywallComponentsScaffold` for workflow reuse (RevenueCat#3417) via Cesar de la Vega (@vegaro) * perf: pre-warm workflow paywall step states off-thread (RevenueCat#3420) via Cesar de la Vega (@vegaro) * Update baseline profiles (RevenueCat#3427) via RevenueCat Git Bot (@RCGitBot) * build(deps): bump fastlane-plugin-revenuecat_internal from `d24ab26` to `2d11430` (RevenueCat#3426) via dependabot[bot] (@dependabot[bot]) * Replace unauthenticated SDKMAN install with SHA-pinned orb command (RevenueCat#3407) via Rick (@rickvdl) * Auto load paywall in paywall tester via local.properties (RevenueCat#3405) via Cesar de la Vega (@vegaro) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk: this is a version/release cut that mainly updates version strings, changelogs, and doc deployment targets with no functional logic changes beyond version identifiers. > > **Overview** > Cuts the `10.4.0` release by removing `-SNAPSHOT` across the project (core `VERSION_NAME`, `Config.frameworkVersion`, sample/test app dependency versions, and the root `.version` file). > > Updates release collateral and publishing to point at `10.4.0`, including changelogs (`CHANGELOG.md`/`CHANGELOG.latest.md`), docs redirect (`docs/index.html`), and the CircleCI `docs-deploy` S3 sync path (from `10.4.0-SNAPSHOT` to `10.4.0`). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit f7b3604. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
matteinn
pushed a commit
to matteinn/purchases-android
that referenced
this pull request
Jun 5, 2026
## Motivation
In a multipage workflow paywall, `PackageComponent`s only live on the
terminal step. Early "info" screens have no package components, so
`selectedPackageInfo` is `null` on them. Price/period template variables
like `{{ price }}` and `{{ price_per_year }}` can't resolve on those
screens.
## Description
Adds a default-package fallback. The terminal step is identified by
`singleStepFallbackId` on the workflow (added in RevenueCat#3436). When any step
state is built, the terminal step's `selectedPackageInfo` is applied as
the default. Steps with their own `PackageComponent`s ignore the
default; steps without one resolve variables against it.
The default is set once per step and never overwritten, so back
navigation always shows the same content as the initial render, even if
the user changed the selection on the terminal step.
Changes:
- `PaywallState.Loaded.Components`: add `defaultPackageInfo` and
`setDefaultPackage(info)`. `setDefaultPackage` is idempotent (set once,
never overwritten). `selectedPackageInfo` is now `ownSelection ?:
defaultPackageInfo`.
- `PaywallViewModel`: in `updateStateFromWorkflow`, pre-compute the
`singleStepFallbackId` step first so its default is in cache before any
other step loads. On every step build, apply the fallback step's
`selectedPackageInfo` (idempotency means it only takes effect on the
first visit). Log a warning if `singleStepFallbackId` points to a
missing step.
- Tests: default-package application on packageless steps,
back-navigation preserving the initial default, own selection winning
over the default, graceful handling when `singleStepFallbackId` is
missing. Plus extra `WorkflowNavigator` cases (deep backstack,
non-linear navigation).
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Medium Risk**
> Touches workflow state construction/caching and selection precedence,
which can subtly affect navigation/backstack behavior and displayed
pricing context across steps.
>
> **Overview**
> Adds a **default-package fallback** to multi-step workflow paywalls:
`PaywallState.Loaded.Components` now stores an idempotent
`defaultPackageInfo`, and `selectedPackageInfo` resolves as *own
selection* falling back to that default.
>
> `PaywallViewModel` now precomputes the `singleStepFallbackId` step to
seed the cache, applies the fallback step’s `selectedPackageInfo` as a
default on every step build/prewarm (without overwriting on revisits),
and logs when the fallback step ID is missing.
>
> Expands tests to cover context propagation on packageless steps,
back-navigation stability, selection precedence, missing-fallback
safety, plus additional `WorkflowNavigator` backstack/loop scenarios.
>
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
a9a862d. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds the optional
singleStepFallbackIdfield toPublishedWorkflowso the backend can identify which step holds the canonical package list for multi-step workflows where earlier steps have no package components.Note
Low Risk
Low risk: adds an optional serialized field to
PublishedWorkflowand validates parsing behavior with unit tests, with no changes to workflow resolution logic.Overview
Adds an optional
single_step_fallback_id(exposed assingleStepFallbackId) to thePublishedWorkflowJSON model so backend-provided workflows can indicate a canonical step for single-step fallback behavior.Extends
WorkflowDetailResolverTestcoverage to assert the field is parsed when present and defaults tonullwhen absent.Reviewed by Cursor Bugbot for commit 1aaf371. Bugbot is set up for automated code reviews on this repo. Configure here.