Skip to content

feat(dashboard): update notices (banner, Updates card, nav dot, About version) - #106

Merged
vibesoftwarecoder merged 4 commits into
masterfrom
feat/update-check-dashboard
Oct 9, 2026
Merged

vibesoftwarecoder merged 4 commits into
masterfrom
feat/update-check-dashboard

Conversation

@vibesoftwarecoder

Copy link
Copy Markdown
Owner

Dashboard part of the update-notification design (step 8). It works against the contract in design section 6; the backend ships separately.

  • Informational blue banner at the top of every page, one line per announced component (max 3), dismissible per component and version in the browser (localStorage, safe when storage is blocked). A newer release announces again. A dot appears on the System nav link while any notice is active.
  • System page "Updates" card: installed, latest and status for all three components, "Last checked", Check now (with cooldown and 409/429 handling), an on/off switch, and a one-click "Turn on update checks" that says exactly what is sent. Text-only update instructions: MultiSeat -FromZip with the warnings, ApolloVibe manual steps, and a MoonlightVibe link. Nothing in the dashboard runs a command.
  • Settings > About shows the installed MultiSeat version.
  • Safety: all server text is rendered as plain React text. Release links are used only when they start with https://github.com/vibesoftwarecoder/ and open with noopener noreferrer. A 401 or any fetch error hides the notices silently.
  • Tests: adds vitest + jsdom + Testing Library (exact pins; vitest 4 because CI uses Node 20), 41 tests, each mutation-checked, and a Test step in the "Dashboard build + audit" job. npm audit: 0 vulnerabilities.
  • Not included: the backend endpoints, docs, and the ApolloVibe update script.

🤖 Generated with Claude Code

@vibesoftwarecoder
vibesoftwarecoder force-pushed the feat/update-check-dashboard branch from 45df38a to 5203f65 Compare October 9, 2026 15:53
vibesoftwarecoder added a commit that referenced this pull request Oct 9, 2026
…the writer (#107)

The test asserted the reader had read at least once after a fixed 40 saves. On a busy
CI runner the reader thread had not run by the time the writer finished (PR #106, line
178), so the assertion failed, and a passing run could have proved nothing about
atomicity. The writer now starts only after the reader has read the file, and keeps
saving until the reader has seen it 200 times (60 s limit). A non-atomic save still
turns it red.

Co-authored-by: vibesoftwarecoder <vibesoftwarecoder@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
vibesoftwarecoder and others added 4 commits October 9, 2026 11:26
…t version

Reads GET /api/system/updates (design section 6) and shows informational notices. Check now,
the on/off switch and the instructions panel use the other two endpoints. Instructions are text
only and nothing in the dashboard runs a command. Server text is rendered as plain React text;
release links are used only when they start with https://github.com/vibesoftwarecoder/.
Dismissal is per component and version in localStorage, guarded against blocked storage.

Adds vitest, jsdom and @testing-library/react (41 tests, mutation-checked), a `test` script,
and a Test step in the 'Dashboard build + audit' CI job.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Design section 5 asks for a dismissible notice when update checks are off. It shows only when
the update data loaded, checks are off and it was not dismissed in this browser
(localStorage["multiseat-update-off-notice-dismissed"] = "1", guarded against blocked storage).
It never enables anything: "See what is sent" links to the System page, "Not now" dismisses.
It sits outside the three-line update limit.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ring Check now

- /system#updates scrolls the Updates card into view and focuses its heading, on first render
  and when arriving from "See what is sent". A missing card is ignored.
- Check now keeps its own busy state ("Checking...", button disabled, one request) for as long
  as the service takes (up to about 30 s), re-enables with a plain message on failure, still
  handles 409 and 429, and does not touch state after unmount.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
request() takes an optional timeout and aborts through an AbortController; only the manual
check passes one. A timeout surfaces as "The check took too long. Try again in a minute.",
clears the busy state, re-enables the button and starts no cooldown.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@vibesoftwarecoder
vibesoftwarecoder force-pushed the feat/update-check-dashboard branch from 5203f65 to b06cb6e Compare October 9, 2026 16:27
@vibesoftwarecoder
vibesoftwarecoder merged commit b86614d into master Oct 9, 2026
3 checks passed
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