fix: poll checkSetup every 4s independently of QR render
Browse files- public/app.js +19 -12
public/app.js
CHANGED
|
@@ -252,7 +252,6 @@ async function fetchAndRenderQR() {
|
|
| 252 |
correctLevel: QRCode.CorrectLevel.M,
|
| 253 |
});
|
| 254 |
qrRendered = true;
|
| 255 |
-
checkSetup(); // show one-time setup panel if secrets not yet saved
|
| 256 |
return;
|
| 257 |
} catch (err) {
|
| 258 |
console.warn('fetchAndRenderQR attempt', i, err);
|
|
@@ -301,28 +300,36 @@ async function authFetch(url, method = 'GET') {
|
|
| 301 |
}
|
| 302 |
|
| 303 |
/* ββ First-time setup panel ββββββββββββββββββββββββββββββββββββββββββββββββ */
|
| 304 |
-
const setupCard
|
|
|
|
| 305 |
|
| 306 |
async function checkSetup() {
|
|
|
|
| 307 |
try {
|
| 308 |
const r1 = await authFetch('/api/setup-status');
|
| 309 |
if (!r1 || !r1.ok) return;
|
| 310 |
const { seeded } = await r1.json();
|
| 311 |
-
if (seeded) return; // secrets already saved
|
| 312 |
|
| 313 |
-
//
|
| 314 |
const r2 = await authFetch('/api/shellular/credentials');
|
| 315 |
-
if (!r2 || !r2.ok) return;
|
| 316 |
-
const
|
| 317 |
-
if (!hostId) return;
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
$('val-
|
| 321 |
-
$('val-
|
|
|
|
| 322 |
setupCard.classList.remove('hidden');
|
| 323 |
-
|
|
|
|
| 324 |
}
|
| 325 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 326 |
// Copy-to-clipboard buttons
|
| 327 |
document.addEventListener('click', (e) => {
|
| 328 |
const btn = e.target.closest('.btn-copy');
|
|
|
|
| 252 |
correctLevel: QRCode.CorrectLevel.M,
|
| 253 |
});
|
| 254 |
qrRendered = true;
|
|
|
|
| 255 |
return;
|
| 256 |
} catch (err) {
|
| 257 |
console.warn('fetchAndRenderQR attempt', i, err);
|
|
|
|
| 300 |
}
|
| 301 |
|
| 302 |
/* ββ First-time setup panel ββββββββββββββββββββββββββββββββββββββββββββββββ */
|
| 303 |
+
const setupCard = $('setup-card');
|
| 304 |
+
let setupDone = false; // true once panel is shown OR secrets are already seeded
|
| 305 |
|
| 306 |
async function checkSetup() {
|
| 307 |
+
if (setupDone || !token) return;
|
| 308 |
try {
|
| 309 |
const r1 = await authFetch('/api/setup-status');
|
| 310 |
if (!r1 || !r1.ok) return;
|
| 311 |
const { seeded } = await r1.json();
|
| 312 |
+
if (seeded) { setupDone = true; return; } // secrets already saved
|
| 313 |
|
| 314 |
+
// Try to read credentials (shellular must have registered first)
|
| 315 |
const r2 = await authFetch('/api/shellular/credentials');
|
| 316 |
+
if (!r2 || !r2.ok) return; // not ready yet β poll will retry
|
| 317 |
+
const data = await r2.json();
|
| 318 |
+
if (!data.hostId) return;
|
| 319 |
+
|
| 320 |
+
// Populate and show the panel
|
| 321 |
+
$('val-host-id').textContent = data.hostId;
|
| 322 |
+
$('val-machine-id').textContent = data.machineId;
|
| 323 |
+
$('val-key').textContent = data.keyB64;
|
| 324 |
setupCard.classList.remove('hidden');
|
| 325 |
+
setupDone = true;
|
| 326 |
+
} catch { /* retry on next poll */ }
|
| 327 |
}
|
| 328 |
|
| 329 |
+
// Poll every 4 s so the panel appears as soon as credentials are available,
|
| 330 |
+
// regardless of whether the QR has rendered yet.
|
| 331 |
+
setInterval(checkSetup, 4000);
|
| 332 |
+
|
| 333 |
// Copy-to-clipboard buttons
|
| 334 |
document.addEventListener('click', (e) => {
|
| 335 |
const btn = e.target.closest('.btn-copy');
|