From 2e5f67a59a53ec3dfa4bea6dcd5d5297dea52716 Mon Sep 17 00:00:00 2001 From: archipelago Date: Thu, 16 Jul 2026 20:46:08 -0400 Subject: [PATCH] feat(ui): companion app banner in the App Store + APK download unblocked MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The App Store gains a "Your Node. In Your Pocket." hero banner for the mobile companion app, in the same format as the featured-app banner, with the app running on a phone mockup rising out of the right edge. Install (or clicking anywhere on it) opens the Remote Companion download/pairing modal — now openable on demand via a shared trigger instead of only auto-showing once. Also fixes the companion APK download on PWA installs: /packages/ now bypasses the service worker's SPA fallback, which was answering the download click with index.html instead of the file. Co-Authored-By: Claude Fable 5 --- .../assets/img/companion-phone-screen.webp | Bin 0 -> 42328 bytes .../src/components/CompanionIntroOverlay.vue | 14 +++ neode-ui/src/composables/useCompanionIntro.ts | 13 ++ neode-ui/src/views/Discover.vue | 4 + .../src/views/discover/CompanionBanner.vue | 119 ++++++++++++++++++ neode-ui/vite.config.ts | 4 +- 6 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 neode-ui/public/assets/img/companion-phone-screen.webp create mode 100644 neode-ui/src/composables/useCompanionIntro.ts create mode 100644 neode-ui/src/views/discover/CompanionBanner.vue diff --git a/neode-ui/public/assets/img/companion-phone-screen.webp b/neode-ui/public/assets/img/companion-phone-screen.webp new file mode 100644 index 0000000000000000000000000000000000000000..a8153380a7deabfa4e020c667ff9ecdf55c73e0a GIT binary patch literal 42328 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 UWo#_($PEv&S{|5)?2z+d0P(Vz!T Download app @@ -132,6 +133,7 @@ import { ref, onMounted, onUnmounted, watch } from 'vue' import * as QRCode from 'qrcode' import { IS_DEMO, DEMO_PASSWORD } from '@/composables/useDemoIntro' +import { companionIntroRequested } from '@/composables/useCompanionIntro' import { useLoginTransitionStore } from '@/stores/loginTransition' import { rpcClient } from '@/api/rpc-client' @@ -202,6 +204,18 @@ function maybeShow() { }, 250) } +// Manual open (App Store banner etc.) — ignores the once-per-browser gate. +watch(companionIntroRequested, (requested) => { + if (!requested) return + companionIntroRequested.value = false + if (calmTicker) { + clearInterval(calmTicker) + calmTicker = null + } + step.value = 'download' + visible.value = true +}) + watch(visible, async (isVisible) => { if (!isVisible) return qrDataUrl.value = await QRCode.toDataURL(companionDownloadUrl, { diff --git a/neode-ui/src/composables/useCompanionIntro.ts b/neode-ui/src/composables/useCompanionIntro.ts new file mode 100644 index 00000000..b05867c0 --- /dev/null +++ b/neode-ui/src/composables/useCompanionIntro.ts @@ -0,0 +1,13 @@ +import { ref } from 'vue' + +/** + * Cross-view trigger for the Remote Companion intro/pairing modal + * (CompanionIntroOverlay, mounted once in Dashboard.vue). Views like the + * App Store banner call openCompanionIntro() to pop it on demand — this + * bypasses the once-per-browser auto-show gate. + */ +export const companionIntroRequested = ref(false) + +export function openCompanionIntro(): void { + companionIntroRequested.value = true +} diff --git a/neode-ui/src/views/Discover.vue b/neode-ui/src/views/Discover.vue index e23b6b5f..d26bf257 100644 --- a/neode-ui/src/views/Discover.vue +++ b/neode-ui/src/views/Discover.vue @@ -150,6 +150,9 @@ + + +
all @@ -239,6 +242,7 @@ import { useContainersScanTimeout } from '@/composables/useContainersScanTimeout import { APP_STORE_SECTIONS } from './appStoreCategories' import DiscoverHero from './discover/DiscoverHero.vue' import FeaturedApps from './discover/FeaturedApps.vue' +import CompanionBanner from './discover/CompanionBanner.vue' import AppGrid from './discover/AppGrid.vue' import InstallVersionModal from '@/components/InstallVersionModal.vue' import type { MarketplaceApp, FeaturedApp } from './discover/types' diff --git a/neode-ui/src/views/discover/CompanionBanner.vue b/neode-ui/src/views/discover/CompanionBanner.vue new file mode 100644 index 00000000..57a852b0 --- /dev/null +++ b/neode-ui/src/views/discover/CompanionBanner.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/neode-ui/vite.config.ts b/neode-ui/vite.config.ts index bb1b14eb..3606f9fa 100644 --- a/neode-ui/vite.config.ts +++ b/neode-ui/vite.config.ts @@ -37,7 +37,9 @@ export default defineConfig({ ] }, workbox: { - navigateFallbackDenylist: [/^\/app\//, /^\/rpc\//, /^\/ws/, /^\/aiui\//], + // /packages/ must bypass the SPA fallback — otherwise clicking the + // companion APK download link gets index.html instead of the file. + navigateFallbackDenylist: [/^\/app\//, /^\/rpc\//, /^\/ws/, /^\/aiui\//, /^\/packages\//], cleanupOutdatedCaches: true, globPatterns: ['**/*.{js,css,html,ico,png,svg,jpg,jpeg,mp4,webp}'], globIgnores: [