From 87812d02d3ec71111ca7b31f70922eb52be05727 Mon Sep 17 00:00:00 2001 From: Jonas Gerg Date: Tue, 21 Jul 2026 16:38:05 +0200 Subject: [PATCH] feat: show notification to install miniplan as app --- .gitignore | 3 +- public/.gitignore | 1 + public/src/App.vue | 36 +++++ .../components/dialog/InstallPWADialog.vue | 66 ++++++++ public/vite.config.ts | 150 +++++++++--------- 5 files changed, 181 insertions(+), 75 deletions(-) create mode 100644 public/src/components/dialog/InstallPWADialog.vue diff --git a/.gitignore b/.gitignore index 0e17624..6cf3e2a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .directory .idea node_modules -package-lock.json \ No newline at end of file +package-lock.json +/.idea/ diff --git a/public/.gitignore b/public/.gitignore index 38adffa..1b3a6ee 100644 --- a/public/.gitignore +++ b/public/.gitignore @@ -26,3 +26,4 @@ coverage *.njsproj *.sln *.sw? +/dev-dist/ diff --git a/public/src/App.vue b/public/src/App.vue index 1b95328..fd4003c 100644 --- a/public/src/App.vue +++ b/public/src/App.vue @@ -6,6 +6,8 @@ import {onMounted, ref} from "vue"; import {Auth} from "@/services/auth"; import DialogHost from "@/components/dialog/DialogHost.vue"; import {LoginService} from "@/services/LoginService"; +import {Dialogs} from "@/services/DialogService"; +import InstallPWADialog from "@/components/dialog/InstallPWADialog.vue"; let showPopup = ref(false) let loggedIn = ref(false) @@ -33,6 +35,40 @@ LoginService.subject.subscribe(() => { showPopup.value = true }) +const installEvent = ref() + +window.addEventListener('beforeinstallprompt', (e) => { + e.preventDefault() + console.log("beforeinstallprompt") + installEvent.value = e + scheduleInstallDialog() +}) + +function scheduleInstallDialog() { + if (isPwa()) return + if (localStorage.getItem('installPromptDismissed')) return + if (!installEvent.value) return + + Dialogs.createDialog(InstallPWADialog, { + onPositive(dontShowAgain: boolean) { + if (dontShowAgain) localStorage.setItem('installPromptDismissed', 'true') + ;(installEvent.value as any).prompt() + }, + onNegative(dontShowAgain: boolean) { + if (dontShowAgain) localStorage.setItem('installPromptDismissed', 'true') + }, + onDismiss() {} + }, {}) +} + +function isPwa() { + return window.matchMedia('(display-mode: standalone)').matches +} + +window.addEventListener('appinstalled', () => { + localStorage.setItem('installPromptDismissed', 'true') +}) +