From 103309966339f115996d99ab5fca27db3d3fd6b3 Mon Sep 17 00:00:00 2001 From: Jules Neny Date: Mon, 11 May 2026 19:52:57 +0200 Subject: [PATCH] fix(v13-p0): iframe AEP skeleton timeout fallback (resolves loading stuck) Le @load event ne fire pas (ou tardivement) sur l'iframe AEP enfermee dans un wrapper avec transform scale(0.42) + viewport simulee 1440px. Resultat : skeleton 'Chargement de la carte AEP...' reste affiche indefiniment, masquant l'iframe meme si elle se charge. Fix : - setTimeout 2.5s dans onMounted qui force revealIframe() inconditionnellement - onIframeLoad clear le timer si l'event fire dans les temps (cas nominal) - retrait du z-10 sur le skeleton (defense en profondeur : si bug residuel, l'iframe sera quand meme visible derriere) - factorisation revealIframe() partagee entre @load et fallback - cleanup du timer dans onUnmounted Build SSR : 5 pages, 0 warning, ~4s. Tests browser manuels a faire par Jules pour confirmer disparition skeleton. --- src/components/vue/EmbedDynamique.vue | 29 ++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/components/vue/EmbedDynamique.vue b/src/components/vue/EmbedDynamique.vue index bf53d6e..1be71fc 100644 --- a/src/components/vue/EmbedDynamique.vue +++ b/src/components/vue/EmbedDynamique.vue @@ -23,24 +23,43 @@ const iframeStyle = computed(() => ({ transformOrigin: '0 0', })) +let fallbackTimer: ReturnType | null = null + +const revealIframe = () => { + if (iframeRef.value) { + iframeRef.value.classList.remove('opacity-0') + iframeRef.value.classList.add('opacity-100') + } + skeletonHidden.value = true +} + onMounted(() => { if (wrapperRef.value && typeof ResizeObserver !== 'undefined') { updateScale() resizeObs = new ResizeObserver(updateScale) resizeObs.observe(wrapperRef.value) } + // Fallback : si @load ne fire pas dans 2.5s (transform/scale peut bloquer l'event), + // on revele quand meme l'iframe pour ne pas laisser le skeleton infini. + fallbackTimer = setTimeout(() => { + revealIframe() + }, 2500) }) onUnmounted(() => { resizeObs?.disconnect() resizeObs = null + if (fallbackTimer) { + clearTimeout(fallbackTimer) + fallbackTimer = null + } }) const onIframeLoad = () => { - if (iframeRef.value) { - iframeRef.value.classList.remove('opacity-0') - iframeRef.value.classList.add('opacity-100') + if (fallbackTimer) { + clearTimeout(fallbackTimer) + fallbackTimer = null } - skeletonHidden.value = true + revealIframe() } @@ -51,7 +70,7 @@ const onIframeLoad = () => {
Chargement de la carte AEP...