// PWA Install Prompt Manager for SecureBit.chat // Enhanced Security Edition v4.01.212 class PWAInstallPrompt { constructor() { this.deferredPrompt = null; this.isInstalled = false; this.installButton = null; this.installBanner = null; this.dismissedCount = 0; this.maxDismissals = 3; this.init(); } init() { console.log('💿 PWA Install Prompt initializing...'); this.checkInstallationStatus(); this.setupEventListeners(); this.createInstallButton(); this.loadInstallPreferences(); console.log('✅ PWA Install Prompt initialized'); } checkInstallationStatus() { // Check if app is already installed if (window.matchMedia('(display-mode: standalone)').matches || window.navigator.standalone === true) { this.isInstalled = true; console.log('📱 App is already installed as PWA'); document.body.classList.add('pwa-installed'); return true; } // Check for iOS Safari specific installation if (this.isIOSSafari()) { this.isInstalled = window.navigator.standalone === true; } document.body.classList.add(this.isInstalled ? 'pwa-installed' : 'pwa-browser'); return this.isInstalled; } setupEventListeners() { // Capture the install prompt event window.addEventListener('beforeinstallprompt', (event) => { console.log('💿 Install prompt event captured'); event.preventDefault(); this.deferredPrompt = event; if (!this.isInstalled && this.shouldShowPrompt()) { this.showInstallOptions(); } }); // Handle successful installation window.addEventListener('appinstalled', () => { console.log('✅ PWA installed successfully'); this.isInstalled = true; this.hideInstallPrompts(); this.showInstallSuccess(); this.saveInstallPreference('installed', true); // Update UI for installed state document.body.classList.remove('pwa-browser'); document.body.classList.add('pwa-installed'); }); // Handle iOS installation detection if (this.isIOSSafari()) { window.addEventListener('visibilitychange', () => { if (document.hidden) return; setTimeout(() => { if (window.navigator.standalone && !this.isInstalled) { this.isInstalled = true; this.hideInstallPrompts(); this.showInstallSuccess(); } }, 1000); }); } } createInstallButton() { // Create floating install button this.installButton = document.createElement('button'); this.installButton.id = 'pwa-install-button'; this.installButton.className = 'hidden fixed bottom-6 right-6 bg-gradient-to-r from-orange-500 to-orange-600 hover:from-orange-600 hover:to-orange-700 text-white px-6 py-3 rounded-full shadow-lg transition-all duration-300 z-50 flex items-center space-x-3 group'; this.installButton.innerHTML = ` Install App
`; this.installButton.addEventListener('click', () => { this.handleInstallClick(); }); document.body.appendChild(this.installButton); } createInstallBanner() { if (this.installBanner) return; this.installBanner = document.createElement('div'); this.installBanner.id = 'pwa-install-banner'; this.installBanner.className = 'pwa-install-banner fixed bottom-0 left-0 right-0 transform translate-y-full transition-transform duration-300 z-40'; this.installBanner.innerHTML = `
Install SecureBit.chat
Get the native app experience with enhanced security
`; // Handle banner actions this.installBanner.addEventListener('click', (event) => { const action = event.target.closest('[data-action]')?.dataset.action; if (action === 'install') { this.handleInstallClick(); } else if (action === 'dismiss') { this.dismissInstallPrompt(); } }); document.body.appendChild(this.installBanner); } showInstallOptions() { if (this.isInstalled) return; // For mobile devices, show banner if (this.isMobileDevice()) { this.showInstallBanner(); } else { // For desktop, show floating button this.showInstallButton(); } } showInstallButton() { if (this.installButton && !this.isInstalled) { this.installButton.classList.remove('hidden'); // Add entrance animation setTimeout(() => { this.installButton.style.transform = 'scale(1.1)'; setTimeout(() => { this.installButton.style.transform = 'scale(1)'; }, 200); }, 100); console.log('💿 Install button shown'); } } showInstallBanner() { if (!this.installBanner) { this.createInstallBanner(); } if (this.installBanner && !this.isInstalled) { setTimeout(() => { this.installBanner.classList.add('show'); }, 1000); console.log('💿 Install banner shown'); } } hideInstallPrompts() { if (this.installButton) { this.installButton.classList.add('hidden'); } if (this.installBanner) { this.installBanner.classList.remove('show'); } } async handleInstallClick() { if (this.isIOSSafari()) { this.showIOSInstructions(); return; } if (!this.deferredPrompt) { console.warn('⚠️ Install prompt not available'); this.showFallbackInstructions(); return; } try { console.log('💿 Showing install prompt...'); // Show the install prompt const result = await this.deferredPrompt.prompt(); console.log('💿 Install prompt result:', result.outcome); if (result.outcome === 'accepted') { console.log('✅ User accepted install prompt'); this.hideInstallPrompts(); this.saveInstallPreference('accepted', true); } else { console.log('❌ User dismissed install prompt'); this.handleInstallDismissal(); } // Clear the deferred prompt this.deferredPrompt = null; } catch (error) { console.error('❌ Install prompt failed:', error); this.showFallbackInstructions(); } } showIOSInstructions() { const modal = document.createElement('div'); modal.className = 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4'; modal.innerHTML = `

Install on iOS

1
Tap the Share button
2
Select "Add to Home Screen"
3
Tap "Add" to install
`; document.body.appendChild(modal); } showFallbackInstructions() { const modal = document.createElement('div'); modal.className = 'fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4'; modal.innerHTML = `

Install SecureBit.chat

To install this app, look for the install option in your browser menu or address bar. Different browsers have different install methods.

Chrome/Edge
Look for install icon in address bar
Firefox
Add bookmark to home screen
Safari
Share → Add to Home Screen
`; document.body.appendChild(modal); } showInstallSuccess() { const notification = document.createElement('div'); notification.className = 'fixed top-4 right-4 bg-green-500 text-white p-4 rounded-lg shadow-lg z-50 max-w-sm transform translate-x-full transition-transform duration-300'; notification.innerHTML = `
App Installed!
SecureBit.chat is now on your device
`; document.body.appendChild(notification); // Animate in setTimeout(() => { notification.classList.remove('translate-x-full'); }, 100); // Auto-remove after 4 seconds setTimeout(() => { notification.classList.add('translate-x-full'); setTimeout(() => notification.remove(), 300); }, 4000); } dismissInstallPrompt() { this.dismissedCount++; this.hideInstallPrompts(); this.saveInstallPreference('dismissed', this.dismissedCount); console.log(`💿 Install prompt dismissed (${this.dismissedCount}/${this.maxDismissals})`); // Show encouraging message on final dismissal if (this.dismissedCount >= this.maxDismissals) { this.showFinalDismissalMessage(); } } handleInstallDismissal() { this.dismissedCount++; this.saveInstallPreference('dismissed', this.dismissedCount); if (this.dismissedCount < this.maxDismissals) { // Show reminder after some time setTimeout(() => { if (!this.isInstalled && this.shouldShowPrompt()) { this.showInstallButton(); } }, 300000); // 5 minutes } } showFinalDismissalMessage() { const notification = document.createElement('div'); notification.className = 'fixed bottom-4 left-4 right-4 bg-blue-500/90 text-white p-4 rounded-lg shadow-lg z-50 backdrop-blur-sm'; notification.innerHTML = `
Install Anytime
You can still install SecureBit.chat from your browser's menu for the best experience.
`; document.body.appendChild(notification); setTimeout(() => { if (notification.parentElement) { notification.remove(); } }, 10000); } shouldShowPrompt() { const preferences = this.loadInstallPreferences(); // Don't show if already installed if (this.isInstalled) return false; // Don't show if dismissed too many times if (preferences.dismissed >= this.maxDismissals) return false; // Don't show if recently dismissed (less than 24 hours) const lastDismissed = preferences.lastDismissed; if (lastDismissed && Date.now() - lastDismissed < 24 * 60 * 60 * 1000) { return false; } return true; } saveInstallPreference(action, value) { const preferences = this.loadInstallPreferences(); preferences[action] = value; if (action === 'dismissed') { preferences.lastDismissed = Date.now(); } try { localStorage.setItem('pwa_install_prefs', JSON.stringify(preferences)); } catch (error) { console.warn('⚠️ Could not save install preferences:', error); } } loadInstallPreferences() { try { const saved = localStorage.getItem('pwa_install_prefs'); return saved ? JSON.parse(saved) : { dismissed: 0, installed: false }; } catch (error) { console.warn('⚠️ Could not load install preferences:', error); return { dismissed: 0, installed: false }; } } isMobileDevice() { return /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); } isIOSSafari() { const userAgent = navigator.userAgent; return /iPad|iPhone|iPod/.test(userAgent) && /Safari/.test(userAgent) && !/CriOS|FxiOS/.test(userAgent); } // Public API methods showInstallPrompt() { if (this.deferredPrompt && !this.isInstalled) { this.handleInstallClick(); } else { this.showFallbackInstructions(); } } hideInstallPrompt() { this.hideInstallPrompts(); } getInstallStatus() { return { isInstalled: this.isInstalled, canPrompt: !!this.deferredPrompt, dismissedCount: this.dismissedCount, shouldShowPrompt: this.shouldShowPrompt() }; } resetDismissals() { this.dismissedCount = 0; this.saveInstallPreference('dismissed', 0); console.log('💿 Install dismissals reset'); } } // Export for module use if (typeof module !== 'undefined' && module.exports) { module.exports = PWAInstallPrompt; } else { window.PWAInstallPrompt = PWAInstallPrompt; } // Auto-initialize if (typeof window !== 'undefined') { window.addEventListener('DOMContentLoaded', () => { if (!window.pwaInstallPrompt) { window.pwaInstallPrompt = new PWAInstallPrompt(); } }); }