fix(shell): dismiss the wizard when a library exists #234
Open
logan
wants to merge 1 commits from
fix/175-wizard-follows-the-library into main
pull from: fix/175-wizard-follows-the-library
merge into: :main
:main
:fix/146-stub-etxtbsy
:fix/175-wizard-follows-the-library
:fix/231-setter-rollback
:fix/197-duplicate-column-label
:docs/225-fixtures-wav-tags
:docs/220-skill-check-scope
:test/217-fixture-names-in-queue-selection
:fix/216-riff-parse-allocation
:fix/170-queue-header-action-names
:fix/210-nav-sheet-scroll-affordance
:docs/50-readme-landing-page
:feat/65-art-prefetch-ahead
:feat/71-more-as-a-bottom-sheet
:feat/54-native-touch-feel
:feat/67-entity-links-into-menus
:test/196-visual-tier-gates
:fix/138-ui-test-storage-leak
:fix/104-wav-tags-read
:fix/207-sheet-scroll-affordance
:fix/204-ui-visual-update-filter
:pi-agent-backlog-automation
:63-touch-model-phase-2
:63-android-touch-model
:186-touch-targets-settings
:186-touch-targets-page-header
:187-seek-bar-hit-area
:189-190-explore-correctness
:135-android-underrun-instrumentation
:51-android-small-screens
:fix/171-phone-queue-scrim
:fix/137-touch-only-affordances
:fix/154-nested-css-check
:feat/58-mini-player-progress-line
:fix/66-album-page-scrolls-as-one
:60-context-menu-action-sheet
:64-android-system-volume
:59-slim-the-mini-player
:55-queue-as-a-screen
:feat/57-drop-the-android-top-bar
:feat/62-jobs-as-a-notification
:fix/53-seek-bar-never-moves
:fix/159-android-task-app-id
:fix/52-android-activity-recreation-restarts-the-process
:fix/150-expand-button-under-the-art
:feat/42-inline-volume-and-centred-transport
:fix/156-queue-selection-fixture-order
:fix/151-fuse-the-scroll-guard-and-the-write
:fix/43-queue-panel-selection
:fix/143-top-bar-fits-its-window
:feat/27-jobs-into-settings
:feat/25-configurable-sidebar-tabs
:feat/6-global-back-forward
:fix/72-active-view-broadcast
:fix/69-page-header-action-overflow
:fix/quick-wins-batch
:fix/118-in-library-clear
:fix/61-mini-player-plain-text
:fix/68-hover-affordances-pointer
:fix/119-dev-headless-port
:fix/130-issue-claim-user
:fix/131-codegen-check-scope
:feat/28-autotag-match-on-album
:feat/17-demote-version-selector
:feat/38-ownership-visibility
:ci/115-manual-release
:feat/34-icon-language
:feat/7-full-tracklist-toggle
:fix/16-tagwriter-totals
:fix/unclaim-ca-certs
:fix/unclaim-shell
:ci/unclaim-on-close
:docs/closing-keyword
:docs/retire-stale-planning-docs
:docs/issue-driven-workflow
:integration/small-fixes
:fix/small-issue-batch
:fix/queue-toggle-state
:fix/drag-count-badge
:fix/album-card-year
:fix/album-tracklist-heading
:fix/seek-bar-clock-width
:fix/explore-art-scanner-requests
:chore/workflow-guardrails
No Reviewers
Labels
Clear labels
Area/Design
Area/Downloads
Area/Explore
Area/Library-UI
Area/Metadata
Area/Packaging
Area/Player
Area/Queue
Area/Settings
Area/Shell-Nav
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Platform/Android
Platform/Desktop
Breaking change that won't be backward compatible
Something is not working
Documentation changes
Improve existing functionality
New functionality
This is security issue
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Medium
3
The priority is medium
Priority
Low
4
The priority is low
Reviewed
Confirmed
1
Issue has been confirmed
Reviewed
Duplicate
2
This issue or pull request already exists
Reviewed
Invalid
3
Invalid issue
Reviewed
Won't Fix
3
This issue won't be fixed
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Status
Abandoned
3
Somebody has started to work on this but abandoned work
Status
In Progress
Somebody is actively working on this right now
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: yonlu/yellowjacket#234
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The issue
first-run-wizarddismissed itself as a step in its own flow —handleFinishsetfinished, closed the dialog and clearedactive—so a library appearing by any other route left the modal up over an app
that was already set up, intercepting every pointer event (#175).
What changed
One subscription.
AddLibraryemitsLibraryAddedwhoever calls it,so the wizard now waits on the state it exists to wait for:
EventsOn(Events.LibraryAdded, …)inconnectedCallback, cancelledin
disconnectedCallback.GetAllLibrariesWithTrackCounts,and the result of that read is discarded if the event landed while it
was in flight — otherwise a stale empty list raises the wizard a
moment after the library arrived.
dismiss(), which setsfinishedfirstbecause
preventClosecancels the hide otherwise.On the Direction's first question
#175 asks whether a user can reach this before it asks what to do, and
then says the dismissal should follow the library existing either
way. That is what made it takeable without settling the question: the
answer moves the priority, not the diff. What the code says, for
whoever does settle it:
AddLibrary— this wizardand Settings' Add Library.
document.elementFromPoint(550, 400)isFIRST-RUN-WIZARD; thewa-dialogis a native modal, which is what makes Settingsunreachable.
So on desktop it reads as robustness rather than a lockout. Android's
storage-access flow is the case that needs a device, and nothing here
depends on it.
Verification
make ui-test— 104 files, 1135 tests, green.frontend/test/components/first-run-wizard.test.tsis new: shows on afresh install; stays hidden when a library already exists; dismisses
on
LibraryAdded; does not raise itself when the event lands duringthe initial read; still dismisses through its own Get Started
button (that last one pinning the
handleFinish→dismiss()refactor).
new-behaviour cases fail (
expected true to be false) and the threepinning existing behaviour pass.
YJ_HOME(make dev-headless-fresh,port checked free first), driven with this issue's own reproduction —
__yjEvents.call('library.Library.AddLibrary', [fixture library]).Before:
dialogRendered: true,nativeDialogOpen: true,elementFromPoint → FIRST-RUN-WIZARD, all unchanged after the call.After: the dialog is gone and that point is
HOME-VIEW. Two buildsfrom this tree, one with the source change stashed.
make e2e(chromium, 246 passed) againstmake dev-headless SEED=default, as a regression check only: everye2e sandbox has a library by construction —
global-setup.tsrefusesto start without one — so no spec there can reach the wizard's active
state. The fresh-sandbox probe above is what covers it. WebKit is
CI's tier, not one this machine can run.
npx tsc --noEmitclean;check-css-literalsandcheck-css-nestingclean.Deliberately not done
.sql, no.templ, no bound signature, somake lint,make test,make generateandmake bindingswere not run.CLAUDE.mduntouched. It says of this component only that it iseagerly mounted because it is the first paint, which is still true.
LibraryAddedis subscribed.LibraryRemovedtaking thelast library away does not raise the wizard mid-session; that is the
existing behaviour and not what #175 reports.
Closes #175
CI green on
b9e60bd— run 601, both required jobs.check(job 29915): commit messages, lint, test, frontend typecheck,CSS literals, the component and store suite, bindings, skill-check —
every step success.
e2e(job 29916): chromium and webkit both success. Worth namingbecause the WebKit step is the one that gets skipped when chromium
fails, and it is the only signal for the renderer that actually
ships.
Not merged, per the run's instructions.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.