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',