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 ? `
-
-
+
Not Now
-
+
Install
@@ -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!
+
+
+
+
+ Okay
+
+
+ `;
+ } else {
+ message.innerHTML = `
+
+
+
+
+
Installation Not Available
+
+ Your browser doesn't currently support app installation. Try using Chrome, Edge, or Safari on a supported device.
+
+
+
+
+ Okay
+
+
+ `;
+ }
+
+ 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) {