Skip to content

Reader: Harden the Skip button and add interest-selection debug controls - #25924

Merged
jkmassel merged 3 commits into
trunkfrom
jkmassel/skip-button-followups
Aug 24, 2026
Merged

Reader: Harden the Skip button and add interest-selection debug controls#25924
jkmassel merged 3 commits into
trunkfrom
jkmassel/skip-button-followups

Conversation

@jkmassel

@jkmassel jkmassel commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Follow-up to the Skip button (#25921, now merged): review fixes to the new Skip button, plus internal tooling to exercise the interest-selection screen.

What changed

Skip button (user-facing)

  • Track a select_interests_skipped event. Tapping Skip completes the flow and permanently sets readerDidSelectInterestsKey, but emitted nothing — so the funnel couldn't tell a skip from an abandonment (select_interests_shown with no terminal event). Adds the event alongside the existing select_interests_shown / select_interests_picked.
  • Debounce the Skip button. The primary save path disables its button and fades the content before dismissing; Skip did neither, so a fast double-tap during the ~0.35s dismiss animation could re-enter ReaderDiscoverViewController.didSaveInterests() — a second dismiss and another forced stream refresh. sender.isEnabled = false on first tap prevents the re-entry.
  • Complete the flow on Skip. The save-success path calls readerDiscoverFlowDelegate?.didCompleteReaderDiscoverFlow(); Skip didn't. This is inert today — the only flow that shows Skip (.discover) never sets the delegate, and the only flow that sets the delegate (Stats' "Grow your audience" nudge) uses a config with showsSkipButton == false. But those two config flags are independent: flip showsSkipButton on the Stats config and Skip would silently fail to mark the nudge complete, so the card would reappear on every visit. Calling the delegate on Skip closes that with no change to current behavior.

Debug controls (internal builds only)

The select-interests screen is a one-time onboarding prompt, hard to see again during development. Adds two actions under Developer → Settings:

  • Show Reader Interests Screen — presents the .discover screen (with the Skip button) directly, bypassing both the readerDidSelectInterestsKey flag and the isFollowingInterests check that gate it, so it works on any account.
  • Reset Reader Interests Prompt — clears readerDidSelectInterestsKey so the real auto-prompt fires again on the next Reader → Discover visit (still subject to isFollowingInterests — an account following no tags).

The reset action posts a text confirmation notice. It first reused the debug menu's shared showSuccessNotice(), which posts a bare "✅"; app notices render on an inverted background (light in dark mode), so an emoji-only toast reads as a blank light box in dark mode. A text title renders legibly in both appearances.

Not in this PR — Skip is unavailable in the offline / empty state

When the interests request fails or returns empty, the Discover flow shows only the "Try Again" NoResults overlay: Skip — like the primary button — lives inside contentContainerView, which fades to alpha 0 during loading and is covered by the overlay, and the sheet is presented without a nav bar and with isModalInPresentation = true, so there is no way out until the network recovers. This predates the Skip button (the primary button is equally unavailable there); fixing it means extending the deprecated NoResultsViewController or restructuring the empty/error presentation — both larger than a review follow-up and risky for the Stats flow that shares this screen.

Test plan

  • Reader → Discover as an account that hasn't picked interests: tap Skip → the sheet dismisses, the stream refreshes, and the prompt doesn't return.
  • A select_interests_skipped event fires on Skip (Tracks debug console); select_interests_picked still fires on the Done path.
  • Double-tap Skip rapidly → one dismiss, no second stream refresh.
  • VoiceOver reads the Skip button as "Skip, button".
  • Developer → Settings → Show Reader Interests Screen presents the screen on an account that already follows tags.
  • Developer → Settings → Reset Reader Interests Prompt shows a legible "Reader interests prompt reset" toast in dark mode (verified on an iPhone 15 Pro, iOS 27).

Related

@wpmobilebot

wpmobilebot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor
App Icon📲 You can test the changes from this Pull Request in WordPress by scanning the QR code below to install the corresponding build.
App NameWordPress
ConfigurationRelease-Alpha
Build Number33914
VersionPR #25924
Bundle IDorg.wordpress.alpha
Commit25da1f4
Installation URL5kdtul7ahdje8
Automatticians: You can use our internal self-serve MC tool to give yourself access to those builds if needed.

@wpmobilebot

wpmobilebot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor
App Icon📲 You can test the changes from this Pull Request in Jetpack by scanning the QR code below to install the corresponding build.
App NameJetpack
ConfigurationRelease-Alpha
Build Number33914
VersionPR #25924
Bundle IDcom.jetpack.alpha
Commit25da1f4
Installation URL3t8gokrrq2o3g
Automatticians: You can use our internal self-serve MC tool to give yourself access to those builds if needed.

@jkmassel jkmassel changed the title Reader: Harden the interest-selection Skip button Reader: Harden the Skip button and add interest-selection debug controls Aug 21, 2026
@wpmobilebot

Copy link
Copy Markdown
Contributor

🤖 Build Failure Analysis

This build has failures. Claude has analyzed them - check the build annotations for details.

@jkmassel
jkmassel requested a review from crazytonyli August 23, 2026 02:19
@crazytonyli

Copy link
Copy Markdown
Contributor

The changes look good to me. But this PR may need a rebase and target the trunk branch.

Follow-up to #25921 addressing review findings:

- Track a `select_interests_skipped` event; skip was the one
  interest-selection outcome with no analytics, so the funnel could not
  distinguish it from an abandonment.
- Disable the button on first tap to debounce, matching the primary
  button; a fast double-tap could otherwise re-run the Discover flow's
  dismiss and forced stream sync.
- Call `readerDiscoverFlowDelegate?.didCompleteReaderDiscoverFlow()` on
  skip so a flow that both shows Skip and sets the delegate completes.
  Inert today — the only Skip flow (Discover) leaves the delegate nil.
The select-interests screen is a one-time onboarding prompt gated by
`readerDidSelectInterestsKey` and an `isFollowingInterests` check, which
makes it hard to see again during development. Adds two internal-only
Developer menu actions:

- Show Reader Interests Screen — presents the `.discover` screen
  directly, bypassing both gates so it can be inspected on any account.
- Reset Reader Interests Prompt — clears `readerDidSelectInterestsKey`
  so the real auto-prompt can fire again on the next Discover visit.
The debug menu's shared `showSuccessNotice()` posts a bare "✅" emoji,
which is illegible against the notice's inverted (light-in-dark-mode)
background. Post a text confirmation for the Reset Reader Interests
Prompt action instead.
@jkmassel
jkmassel changed the base branch from jkmassel/skip-button-base to trunk August 24, 2026 20:29
@jkmassel
jkmassel force-pushed the jkmassel/skip-button-followups branch from 34dc97c to 25da1f4 Compare August 24, 2026 20:29
@jkmassel jkmassel added this to the 27.3 milestone Aug 24, 2026
@jkmassel

Copy link
Copy Markdown
Contributor Author

@crazytonyli – this is rebased and ready for another look!

@jkmassel
jkmassel added this pull request to the merge queue Aug 24, 2026
Merged via the queue into trunk with commit 6bdbe28 Aug 24, 2026
29 checks passed
@jkmassel
jkmassel deleted the jkmassel/skip-button-followups branch August 24, 2026 21:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants