Fix video persistence regression (#8271)

* Fix video persistence regression

* Adding a changeset
This commit is contained in:
Matthew Phillips 2023-08-29 15:46:06 -04:00 committed by GitHub
parent 834a00d2d3
commit 16f09dfff7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 12 deletions

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Fix video persistence regression

View file

@ -165,18 +165,16 @@ const { fallback = 'animate' } = Astro.props as Props;
// Persist elements in the existing body
const oldBody = document.body;
document.body.replaceWith(doc.body);
for (const el of oldBody.querySelectorAll(`[${PERSIST_ATTR}]`)) {
const id = el.getAttribute(PERSIST_ATTR);
const newEl = doc.querySelector(`[${PERSIST_ATTR}="${id}"]`);
const newEl = document.querySelector(`[${PERSIST_ATTR}="${id}"]`);
if (newEl) {
// The element exists in the new page, replace it with the element
// from the old page so that state is preserved.
newEl.replaceWith(el);
}
}
// Only replace the existing body *AFTER* persistent elements are moved over
// This avoids disconnecting `astro-island` nodes multiple times
document.body.replaceWith(doc.body);
// Simulate scroll behavior of Safari and
// Chromium based browsers (Chrome, Edge, Opera, ...)

View file

@ -52,14 +52,8 @@ declare const Astro: {
public hydrator: any;
static observedAttributes = ['props'];
disconnectedCallback() {
document.addEventListener(
'astro:after-swap',
() => {
// If element wasn't persisted, fire unmount event
if (!this.isConnected) this.dispatchEvent(new CustomEvent('astro:unmount'));
},
{ once: true }
);
document.removeEventListener('astro:after-swap', this.unmount);
document.addEventListener('astro:after-swap', this.unmount, { once: true });
}
connectedCallback() {
if (!this.hasAttribute('await-children') || this.firstChild) {
@ -176,6 +170,10 @@ declare const Astro: {
attributeChangedCallback() {
this.hydrate();
}
unmount = () => {
// If element wasn't persisted, fire unmount event
if (!this.isConnected) this.dispatchEvent(new CustomEvent('astro:unmount'));
}
}
);
}