Launcher window: say "Not signed in on this PC" under Launch, with Sign in

The dev drive on another PC still had no live aircraft after that PC's launcher
went live: its API log kept saying "the DHP answered, but this PC has no DHP
sign-in yet", and launcher.json was never rewritten, i.e. no sign-in ever
completed there. Root cause is the window, not the operator: the action panel
offers Sign in only when nothing is installed, an update is due, or no operator
is remembered (actionFor). The operator is remembered IN launcher.json, which
travels with the drive, while the sign-in lives in that PC's Credential
Manager - so a drive on a new PC shows Launch as if nothing were missing, and
Sign in sits in Settings > Account where nothing points to it.

Under Launch, while online and not signed in, the panel now says ODIAN will run
on this PC's own data without live aircraft, with a Sign in link. Launch stays
the button: a sign-in that cannot complete must not stop ODIAN.

New mock scenario `new-pc` (online, installed, operator remembered, no
sign-in). Spot-check: npm run dev -> ?scenario=new-pc shows the line; its Sign
in link runs the sign-in and the line goes, the status bar then reading
"Signed in as". svelte-check: 0 errors.
This commit is contained in:
JIMMY_JFEXP
2026-09-29 16:22:41 +02:00
parent 58ebd1dded
commit 52f77c814c
3 changed files with 21 additions and 1 deletions
+14
View File
@@ -223,6 +223,20 @@
Offline: ODIAN <strong>{s?.installed}</strong> runs on local data and map tiles. Offline: ODIAN <strong>{s?.installed}</strong> runs on local data and map tiles.
{/if} {/if}
</p> </p>
{#if s?.online && !s.signed_in && !checking}
<!-- The operator is remembered with the install (launcher.json travels with a drive),
the DHP sign-in is not (Credential Manager, per PC). So a drive on another PC offers
Launch as if nothing were missing, and ODIAN then runs on that PC's own data: no live
aircraft, no tiles from the site. Launch stays the button - a sign-in that cannot
complete must not stop ODIAN - but the gap is said here, with the way out. -->
<p class="secondary attention">
<Icon name="alert" size={14} />
<span>
Not signed in on this PC: ODIAN will run on this PC's own data, without live aircraft.
<button class="btn-link" disabled={blocked} onclick={() => launcher.signIn()}>Sign in</button>
</span>
</p>
{/if}
{#if launcher.syncAttention > 0} {#if launcher.syncAttention > 0}
<p class="secondary attention"> <p class="secondary attention">
<Icon name="alert" size={14} /> <Icon name="alert" size={14} />
+6 -1
View File
@@ -1,7 +1,7 @@
// Browser-only stand-in for the Rust backend, so the hub can be designed with // Browser-only stand-in for the Rust backend, so the hub can be designed with
// `npm run dev`. Same shapes as docs/CONTRACT.md, driven by timers. // `npm run dev`. Same shapes as docs/CONTRACT.md, driven by timers.
// //
// ?scenario=first-run | update-required | ready | offline-installed | // ?scenario=first-run | update-required | ready | new-pc | offline-installed |
// offline-not-installed | installing | running | sync-conflicts | error | // offline-not-installed | installing | running | sync-conflicts | error |
// dev (a licensed developer PC: the Dev section of Settings appears) // dev (a licensed developer PC: the Dev section of Settings appears)
// &fail=sign_in | install | restore | launch | notes make that flow fail // &fail=sign_in | install | restore | launch | notes make that flow fail
@@ -259,6 +259,11 @@ function initialStatus(scenario: MockScenario): Status {
case "ready": case "ready":
Object.assign(s, { installed: CURRENT, operator: OPERATOR, signed_in: true }); Object.assign(s, { installed: CURRENT, operator: OPERATOR, signed_in: true });
break; break;
case "new-pc":
// A drive on a PC it has never been on: the install and its operator came with it,
// the DHP sign-in (per PC) did not. Online, launchable, and not signed in.
Object.assign(s, { installed: CURRENT, operator: OPERATOR, signed_in: false });
break;
case "offline-installed": case "offline-installed":
Object.assign(s, { online: false, installed: PREVIOUS, operator: OPERATOR }); Object.assign(s, { online: false, installed: PREVIOUS, operator: OPERATOR });
break; break;
+1
View File
@@ -292,6 +292,7 @@ export const MOCK_SCENARIOS = [
"first-run", "first-run",
"update-required", "update-required",
"ready", "ready",
"new-pc",
"offline-installed", "offline-installed",
"offline-not-installed", "offline-not-installed",
"installing", "installing",