Desktop: Abrir app-items en nueva ventana para lanzar PWAs
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 58s
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 58s
- Crear composable useDeviceType para detectar desktop/móvil - Modificar ApplicationsList para usar target='_blank' en desktop - Ajustar pwa-link-handler para permitir nuevas ventanas en desktop - En móvil mantener comportamiento original según openInNewTab
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
/**
|
||||
* 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') {
|
||||
@@ -9,6 +11,9 @@ export default defineNuxtPlugin(() => {
|
||||
window.matchMedia('(display-mode: window-controls-overlay)').matches ||
|
||||
(window.navigator as any).standalone === true
|
||||
|
||||
// Detectar si estamos en desktop
|
||||
const isDesktop = window.matchMedia('(min-width: 1024px)').matches
|
||||
|
||||
if (isPWA) {
|
||||
// Obtener el origin de la aplicación
|
||||
const appOrigin = window.location.origin
|
||||
@@ -31,8 +36,12 @@ export default defineNuxtPlugin(() => {
|
||||
// Solo interceptar enlaces que apunten a este origin
|
||||
if (url.origin === appOrigin) {
|
||||
// Si el enlace tiene target="_blank", no interceptar
|
||||
// Esto permite que en desktop los enlaces abran nuevas ventanas (PWAs)
|
||||
const linkTarget = link.getAttribute('target')
|
||||
if (linkTarget === '_blank') return
|
||||
if (linkTarget === '_blank') {
|
||||
console.debug('Permitiendo apertura de nueva ventana para:', href)
|
||||
return
|
||||
}
|
||||
|
||||
// Prevenir comportamiento por defecto
|
||||
event.preventDefault()
|
||||
@@ -51,6 +60,7 @@ export default defineNuxtPlugin(() => {
|
||||
}, { 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) {
|
||||
@@ -61,12 +71,19 @@ export default defineNuxtPlugin(() => {
|
||||
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)
|
||||
}
|
||||
@@ -75,7 +92,7 @@ export default defineNuxtPlugin(() => {
|
||||
return originalWindowOpen.call(window, url, target, features)
|
||||
}
|
||||
|
||||
console.log('✅ PWA link handler initialized - capturing internal links')
|
||||
console.log('✅ PWA link handler initialized - capturing internal links (desktop mode:', isDesktop, ')')
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user