diff --git a/public/js/version-manager.js b/public/js/version-manager.js index 9bf2d6f3..79739cb3 100644 --- a/public/js/version-manager.js +++ b/public/js/version-manager.js @@ -134,14 +134,14 @@ class VersionManager {
${versionInfo.forceUpdate ? ` - ` : ` - - `} @@ -151,6 +151,21 @@ class VersionManager { document.body.appendChild(notification); + // Add event listeners (CSP compliant) + const updateNowBtn = document.getElementById('update-now-btn'); + const updateLaterBtn = document.getElementById('update-later-btn'); + const updateReloadBtn = document.getElementById('update-reload-btn'); + + if (updateNowBtn) { + updateNowBtn.addEventListener('click', () => this.applyUpdate()); + } + if (updateLaterBtn) { + updateLaterBtn.addEventListener('click', () => this.dismissUpdate()); + } + if (updateReloadBtn) { + updateReloadBtn.addEventListener('click', () => this.applyUpdate()); + } + // Animate in setTimeout(() => { notification.classList.remove('translate-y-full'); @@ -250,10 +265,10 @@ class VersionManager {
- -
@@ -262,6 +277,17 @@ class VersionManager { document.body.appendChild(prompt); + // Add event listeners (CSP compliant) + const dismissBtn = document.getElementById('dismiss-install-btn'); + const installBtn = document.getElementById('install-app-btn'); + + if (dismissBtn) { + dismissBtn.addEventListener('click', () => this.dismissInstallPrompt()); + } + if (installBtn) { + installBtn.addEventListener('click', () => this.installApp()); + } + // Animate in setTimeout(() => { prompt.classList.remove('translate-y-full'); @@ -270,6 +296,8 @@ class VersionManager { async installApp() { if (!this.deferredInstallPrompt) { + // Show helpful feedback if installation isn't available + this.showInstallUnavailableMessage(); return; } @@ -287,6 +315,88 @@ class VersionManager { this.dismissInstallPrompt(); } + showInstallUnavailableMessage() { + // Check if app is already installed + const isInstalled = window.matchMedia('(display-mode: standalone)').matches; + + // Don't show message if it already exists + if (document.getElementById('tractatus-install-unavailable')) { + return; + } + + const message = document.createElement('div'); + message.id = 'tractatus-install-unavailable'; + message.className = 'fixed bottom-0 left-0 right-0 bg-gray-800 text-white px-4 py-3 shadow-lg z-50 transform transition-transform duration-300 translate-y-full'; + + if (isInstalled) { + message.innerHTML = ` +
+
+ + + +
+

Already Installed

+

+ Tractatus is already installed on your device. You're using it right now! +

+
+
+ +
+ `; + } else { + message.innerHTML = ` +
+
+ + + +
+

Installation Not Available

+

+ Your browser doesn't currently support app installation. Try using Chrome, Edge, or Safari on a supported device. +

+
+
+ +
+ `; + } + + document.body.appendChild(message); + + // Add event listener for dismiss button + const dismissBtn = document.getElementById('dismiss-unavailable-btn'); + if (dismissBtn) { + dismissBtn.addEventListener('click', () => { + message.classList.add('translate-y-full'); + setTimeout(() => { + message.remove(); + }, 300); + }); + } + + // Animate in + setTimeout(() => { + message.classList.remove('translate-y-full'); + }, 100); + + // Auto-dismiss after 8 seconds + setTimeout(() => { + if (message.parentElement) { + message.classList.add('translate-y-full'); + setTimeout(() => { + message.remove(); + }, 300); + } + }, 8000); + } + dismissInstallPrompt() { const prompt = document.getElementById('tractatus-install-prompt'); if (prompt) {