/** * Plugin para interceptar enlaces externos que apuntan a esta PWA * y navegarlos dentro de la misma ventana en lugar de abrir nuevas ventanas/pestañas * En desktop, permite que los enlaces con target="_blank" abran nuevas ventanas para * lanzar PWAs correspondientes */ export default defineNuxtPlugin(() => { if (import.meta.client && typeof window !== 'undefined') { // Detectar si la app está corriendo como PWA instalada const isPWA = window.matchMedia('(display-mode: standalone)').matches || window.matchMedia('(display-mode: window-controls-overlay)').matches || (window.navigator as any).standalone === true // Detectar si estamos en desktop usando pointer device (más confiable para PWAs) const pointerQuery = window.matchMedia('(pointer: fine)') const widthQuery = window.matchMedia('(min-width: 1024px)') const isDesktop = pointerQuery.matches || widthQuery.matches if (isPWA) { // Obtener el origin de la aplicación const appOrigin = window.location.origin // Interceptar clics en enlaces externos document.addEventListener('click', (event) => { const target = event.target as HTMLElement // Buscar el enlace más cercano (puede ser un elemento hijo del enlace) const link = target.closest('a') if (!link) return const href = link.getAttribute('href') if (!href) return // Si el enlace tiene target="_blank", NUNCA interceptar // Esto permite que en desktop los enlaces abran nuevas ventanas (PWAs) const linkTarget = link.getAttribute('target') if (linkTarget === '_blank') { console.debug('Permitiendo apertura de nueva ventana para:', href) return } try { const url = new URL(href, window.location.origin) // Solo interceptar enlaces que apunten a este origin if (url.origin === appOrigin) { // Prevenir comportamiento por defecto event.preventDefault() // Navegar usando el router de Nuxt si está dentro del scope const router = useRouter() const relativePath = url.pathname + url.search + url.hash // Usar el router de Nuxt para navegación interna router.push(relativePath) } } catch (error) { // Si no se puede parsear la URL, dejar que el navegador maneje el enlace console.debug('Error parsing link URL:', error) } }, { capture: true }) // Interceptar window.open para links que apunten a esta app // En desktop, permitimos nuevas ventanas con target="_blank" const originalWindowOpen = window.open window.open = function(url?: string | URL, target?: string, features?: string) { if (!url) { return originalWindowOpen.call(window, url, target, features) } try { const urlObj = typeof url === 'string' ? new URL(url, window.location.origin) : url // Si es un enlace a esta app y no tiene target especificado o es _self // Y NO estamos en desktop con target _blank (para permitir lanzar PWAs) if (urlObj.origin === appOrigin && (!target || target === '_self')) { const router = useRouter() const relativePath = urlObj.pathname + urlObj.search + urlObj.hash router.push(relativePath) return null } // En desktop con target="_blank", permitir la apertura normal if (isDesktop && target === '_blank') { console.debug('Permitiendo window.open en desktop para:', url) return originalWindowOpen.call(window, url, target, features) } } catch (error) { console.debug('Error parsing window.open URL:', error) } // Para otros casos, usar el comportamiento original return originalWindowOpen.call(window, url, target, features) } console.log('✅ PWA link handler initialized - capturing internal links (desktop mode:', isDesktop, ')') } } })