From eb5b2a876ec49d4cfbdce20aa43b3657856994df Mon Sep 17 00:00:00 2001 From: Kelly Date: Sat, 13 Dec 2025 19:52:51 -0700 Subject: [PATCH] feat(pwa): Add update prompt for new versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change registerType from 'autoUpdate' to 'prompt' - Add UpdatePrompt component that shows when new version available - Users see banner with "Update" or "Later" buttons - Service worker checks for updates every hour 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- cannaiq/src/App.tsx | 2 ++ cannaiq/src/components/UpdatePrompt.tsx | 45 +++++++++++++++++++++++++ cannaiq/src/vite-env.d.ts | 1 + cannaiq/vite.config.ts | 2 +- 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 cannaiq/src/components/UpdatePrompt.tsx diff --git a/cannaiq/src/App.tsx b/cannaiq/src/App.tsx index 4c9de26c..bd292159 100755 --- a/cannaiq/src/App.tsx +++ b/cannaiq/src/App.tsx @@ -54,10 +54,12 @@ import { SeoOrchestrator } from './pages/admin/seo/SeoOrchestrator'; import { StatePage } from './pages/public/StatePage'; import { SeoPage } from './pages/public/SeoPage'; import { PrivateRoute } from './components/PrivateRoute'; +import { UpdatePrompt } from './components/UpdatePrompt'; export default function App() { return ( + } /> } /> diff --git a/cannaiq/src/components/UpdatePrompt.tsx b/cannaiq/src/components/UpdatePrompt.tsx new file mode 100644 index 00000000..aa8e5a67 --- /dev/null +++ b/cannaiq/src/components/UpdatePrompt.tsx @@ -0,0 +1,45 @@ +/** + * PWA Update Prompt + * + * Shows a banner when a new version of the app is available. + * Uses the virtual:pwa-register/react hook from vite-plugin-pwa. + */ + +import { useRegisterSW } from 'virtual:pwa-register/react'; + +export function UpdatePrompt() { + const { + needRefresh: [needRefresh, setNeedRefresh], + updateServiceWorker, + } = useRegisterSW({ + onRegistered(r) { + // Check for updates every hour + r && setInterval(() => r.update(), 60 * 60 * 1000); + }, + }); + + if (!needRefresh) return null; + + return ( +
+
+

New version available

+

Refresh to update CannaIQ

+
+
+ + +
+
+ ); +} diff --git a/cannaiq/src/vite-env.d.ts b/cannaiq/src/vite-env.d.ts index c57d674b..79b1f623 100644 --- a/cannaiq/src/vite-env.d.ts +++ b/cannaiq/src/vite-env.d.ts @@ -1,4 +1,5 @@ /// +/// interface ImportMetaEnv { readonly VITE_API_URL?: string; diff --git a/cannaiq/vite.config.ts b/cannaiq/vite.config.ts index 5a33e98c..5bd48be4 100755 --- a/cannaiq/vite.config.ts +++ b/cannaiq/vite.config.ts @@ -6,7 +6,7 @@ export default defineConfig({ plugins: [ react(), VitePWA({ - registerType: 'autoUpdate', + registerType: 'prompt', includeAssets: ['favicon.svg'], manifest: { name: 'CannaIQ',