Skip to content

feat(components): a user header for /summary and /archive - #109

Merged
manuroe merged 6 commits into
mainfrom
feat/user-header
Oct 30, 2026
Merged

manuroe merged 6 commits into
mainfrom
feat/user-header

Conversation

@manuroe

@manuroe manuroe commented Oct 30, 2026

Copy link
Copy Markdown
Owner

Summary

/archive now shows whose rageshake it is in its header, like /summary does, through a shared UserHeader. The header also shows the user's rooms: the app's room list size when Element X iOS logged it, and the distinct rooms the logs mention. Clicking the header opens the device keys from details.json, each with a copy button. The curve key is how a sender's logs name the device, so it is what to search for in the other side's rageshake.

Each count in the /archive table now opens its file on the view that details it, instead of making you open the file and pick the view by hand.

Changes

  • feat(demo): Alice sends, Bob gets the UTDs: the demos swap roles to follow the crypto convention. The mobile demo is now Bob (BOBPHONE) and the web demo Alice (ALICEWEB), and the newest session shows a key Alice shared with Bob's other device but not his phone.
  • feat(utils): count the user's rooms, and the rooms the logs mention: roomsInLog reads one log, and roomCount merges logs. For each Element X room list it keeps the newest size and shows the largest, so a filtered AllRooms never hides the unfiltered StaticAllRooms. ArchiveSummary carries each file's rooms.
  • feat(components): a user header for /summary and /archive: UserHeader with avatar, display name, user and device IDs, rooms, and the device keys panel. /summary reuses the archive's room summaries when its files came from /archive, instead of scanning them again. /archive shows the rooms once every file is summarized.
  • feat(views): archive counts open their file on the view that details them: lines open /logs, and Sentry, errors and warnings open /logs filtered. Requests open /http_requests, and a status chip filters it to that status. The incomplete chip also turns on incomplete requests, which /http_requests hides by default. The UTDs cell has two links: reported UTDs on /decryption filtered to reported, and all of them unfiltered.

For reviewers

  • UTD counts in /archive are computed over the whole archive, but the link opens that one file. A UTD that decrypts in the next file counts once in the archive, but shows unresolved when its file is opened alone, so the numbers on /decryption can differ.
  • Status chips count each request's final status. The /http_requests status filter also matches retried attempts, so "503 ×1" can list more than one request.
  • Escape closes the keys panel only while focus is inside the header. Safari does not focus a clicked button, so after a mouse click only an outside click closes it.

Testing

  • npm run build, npm run lint and npm test -- --run --coverage pass (2646 tests, coverage thresholds met).
  • Not tried in a real browser yet. To check with a rageshake archive:
    • /archive shows the user header with rooms once all files are summarized;
    • clicking the header opens the device keys and copies one;
    • each count opens its file on the right view, and the incomplete chip lists incomplete requests;
    • opening a file from /archive shows the same room count on /summary.

Crypto convention has Alice send and Bob receive, but the mobile demo
was Alice's rageshake, so /decryption opened on Bob sending to her.
The demos swap roles: the mobile demo is Bob (BOBPHONE), the web demo
Alice (ALICEWEB).

s5, the newest session, now shows a key Alice shared with Bob's other
device (BOBLAPTOP) but not his phone: the UTD /decryption opens on, and
the one the screenshot captures.
No log states on every platform how many rooms a user is in. Element X
iOS logs its room lists' sizes ("<list>: Rebuilding room summaries for
N rooms"); every log names rooms in its lines. roomCount keeps both:
the newest room list size, when there is one, and the distinct rooms
mentioned, a lower bound that tells how much of the user's rooms the
rageshake covers.

ArchiveSummary carries each file's rooms, so /archive can merge them
over the whole archive.
/summary showed whose rageshake it is in its header; /archive only had
it in the details card at the bottom of the page. UserHeader is that
header, shared: avatar, display name, user and device IDs, plus the
user's rooms (the app's room list size when logged, and the rooms the
logs mention).

Clicking it opens the device keys from details.json, each with its
role and a copy button: the curve key is how a sender's logs name the
device, so it is what to search for in the other side's rageshake.
…them

A count in the /archive table pointed at a problem but the file still
had to be opened and the view picked by hand. Each count now opens its
file there: lines on /logs, Sentry, errors and warnings filtered on
/logs, requests on /http_requests, a status chip filtered to that
status. The UTDs cell has two links: reported ones on /decryption
filtered to reported, all of them unfiltered.

/http_requests hides incomplete requests by default, so the incomplete
chip turns them on before filtering to them.
@github-actions

Copy link
Copy Markdown
Contributor

🚀 PR Preview ready:
https://manuroe.github.io/shakeview/pull/109/

@codspeed

codspeed Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Merging this PR will not alter performance

1 warning

⚠️ 4 benchmarks are dominated by system calls

System calls cannot be simulated consistently and are left out of the measure. The reported value understates the real cost. Switch to the Walltime instrument to measure them.

Learn more about system calls

See affected benchmarks

✅ 30 untouched benchmarks


Comparing feat/user-header (3debbfe) with main (2d947c5)

Open in CodSpeed

The "N files" count in the /archive header now opens every log of the
archive merged, always on /summary, even when the first log is undated
and would otherwise land on /logs.

The clickable counts had lost their bold: the link's `font: inherit`
came later in the stylesheet than .errorCount and the others. It moves
into the zero-specificity rule with the colour, so each count's own
class wins.
@manuroe
manuroe merged commit 89d89af into main Oct 30, 2026
5 checks passed
@manuroe
manuroe deleted the feat/user-header branch October 30, 2026 10:13
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