W-451: Onboarding refresh + symbols on by default#153
Merged
wr merged 1 commit intoJun 26, 2026
Merged
Conversation
- New "Set up your features" step (welcome → features → permissions → done): enable Emoji / Symbols / GIF and pick each trigger, reusing the Settings section headers + trigger pickers. - Drop the dedicated "Replace system emoji picker" CTA step and the "More options" overlay. Replace is now a toggle on the Done screen; autoupdate + start-at-login live in a second section there. - Add an autofocused, live "try it out" field (:smile) on Done — DoneStep posts mojitoShouldStartEngine so the engine starts early enough to expand in place. - Move the stats toggle into the onboarding Privacy details sheet (which marks consent seen on appear); skipping it still fires the one-time consent prompt, so nothing is sent without disclosure. - Symbols now default ON for fresh installs (TriggerConfigStore.migrate + TriggerConfig.default), blended into emoji search via follow-emoji. Existing configs are untouched. Tests updated. Refs: W-451
There was a problem hiding this comment.
Reviewed the diff against CLAUDE.md conventions. This is a clean, well-scoped refactor:
engine.start()→reconcile()→KeyMonitor.start()is idempotent (guards on!isRunning/!monitor.isRunning), so the new.mojitoShouldStartEnginenotification handler inAppDelegate.swiftsafely overlaps with the existingstart()calls inapplicationDidFinishLaunchingand the.mojitoOnboardingFinishedhandler — no double-tap risk.FeaturesStepmirrorsGeneralSettings.swift's section headers /TriggerPickerwiring (including thetakenOpens(excluding:)helper) field-for-field — confirmed by diffing the two.- The symbols-default flip (
TriggerConfig.default+TriggerConfigStore.migrate's fallback?? true) only changes behavior for configs with no persistedPrefsKey.triggersblob (fresh installs, per the PR description) — existing installs already have that blob from the prior migration and hit the early-return decode path inload(), untouched. Tests were updated consistently (migrationOnEmptyDefaultsEnablesAllFeatures,symbolsTriggerDefaultsOn). - Telemetry consent: moving the toggle into
PrivacyDetailsSheetand stampingtelemetryConsentSeenthere, with the existingTelemetryConsent.presentIfNeeded()fallback after onboarding finishes, preserves the "nothing sent before disclosure" invariant either way (sheet opened or skipped). - No leftover references to the removed
ReplaceEmojiStep.
CI (ssot workflow) was still in progress at review time with no failures reported, so not treating it as blocking.
Nit: FeaturesStep (OnboardingScreens.swift) duplicates GeneralSettings.swift's takenOpens(excluding:) helper and the three Section/SettingsSectionHeader/TriggerPicker blocks verbatim. Not required to fix, but if this pattern gets a third caller, worth factoring into a shared view.
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.
Reworks onboarding to feel less pushy and more useful.
What's in it
:smile) —DoneStepposts amojitoShouldStartEnginenotification so the engine starts early enough for shortcuts to expand right in the field.TriggerConfigStore.migrate+TriggerConfig.default), blended into emoji search via follow-emoji — matching emoji/GIF. Existing users' saved configs are untouched.Test plan
:smilefield is focused and expands live.Notes
Independent code review: clean, no high-confidence issues.
Refs W-451