- Shipped
- September 23, 2026 at 3:15 PM UTC
- Author
- Kamo
- Commit
- c224e20
Clicking a computer opened a browser tab that closed again, and said nothing. openHostedComputer opens its tab synchronously inside the click, because a popup blocker allows that and nothing later. When the launch came back needsPassword — which it does for EVERY computer until its member confirms their Kamo password once, since Kamo never stored it — the function closed that tab and called onNeedsPassword?.(). No call site has ever passed onNeedsPassword. The nav calls openHostedComputer(computer.id, resolution), two arguments. So the tab opened, the tab closed, the optional callback was undefined, and that was the whole interaction: no throw, no log, no dialog, and a computer that was healthy and awake throughout. The function's own comment said "the caller is told, and shows a dialog"; no caller did. ASK BEFORE OPENING A TAB. The menu already has passwordSet on every row, so a computer with no login gets the dialog instead of a tab and there is no flash at all. The fallback in openHostedComputer stays for the cases the menu cannot know about — a list rendered before a password reset, or any future caller — and now raises the same ask rather than depending on a callback nobody passes. ONE HOST, IN AuthedChrome, the way MemberCardDialogs does it and for the same reason: the rows live in a memo with nowhere to render, and the menu closes the moment one is clicked. A member with six computers has six rows and at most one dialog. The open happens from inside the confirm click so the popup blocker allows the tab, which is why the dialog launches the computer itself rather than returning a promise to whoever asked. A wrong password and a failed push are told apart: 400/401/403 is the member's to fix and says so, anything else is the push to the machine failing. Telling somebody their password is wrong when it was not is the worst answer available here.
