From 0ac67f50924f8a70a87ac42d6164e189e25858be Mon Sep 17 00:00:00 2001 From: archipelago Date: Fri, 19 Jun 2026 09:50:10 -0400 Subject: [PATCH] fix(ui): companion QR absolute 146 URL + Dashboard swipe type guard - Companion app QR encoded a relative path (/packages/...apk.zip) which can't resolve when scanned by a phone. Point it at the absolute 146 release-server URL so the download works from any device. - Dashboard tab-swipe: guard tabs[next] (noUncheckedIndexedAccess) so the frontend type-checks/builds. Co-Authored-By: Claude Opus 4.8 (1M context) --- neode-ui/src/components/CompanionIntroOverlay.vue | 5 ++++- neode-ui/src/views/Dashboard.vue | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/neode-ui/src/components/CompanionIntroOverlay.vue b/neode-ui/src/components/CompanionIntroOverlay.vue index 9ecc5372..89f2c2a7 100644 --- a/neode-ui/src/components/CompanionIntroOverlay.vue +++ b/neode-ui/src/components/CompanionIntroOverlay.vue @@ -79,7 +79,10 @@ import { ref, onMounted, watch } from 'vue' import * as QRCode from 'qrcode' const STORAGE_KEY = 'neode_companion_intro_seen' -const DEFAULT_DOWNLOAD_URL = '/packages/archipelago-companion.apk.zip' +// Absolute URL so the QR works when scanned by a phone (a relative path has no +// host to resolve). Points at the companion APK hosted on the 146 release server +// (publicly reachable) rather than the local node's /packages copy. +const DEFAULT_DOWNLOAD_URL = 'http://146.59.87.168:3000/lfg2025/archy/raw/branch/main/neode-ui/public/packages/archipelago-companion.apk.zip' const visible = ref(false) const qrDataUrl = ref('') diff --git a/neode-ui/src/views/Dashboard.vue b/neode-ui/src/views/Dashboard.vue index 23b04d38..34d85cc4 100644 --- a/neode-ui/src/views/Dashboard.vue +++ b/neode-ui/src/views/Dashboard.vue @@ -318,7 +318,9 @@ function onContentTouchEnd(e: TouchEvent) { if (idx < 0) return const next = idx + (dx < 0 ? 1 : -1) // swipe left → next tab, right → previous if (next < 0 || next >= tabs.length) return - router.push(tabs[next].to).catch(() => {}) + const target = tabs[next] + if (!target) return + router.push(target.to).catch(() => {}) } watch(() => route.path, (newPath) => {