From ca8a222fc50feeb005ef64b02bf6d3a26cb49cbe Mon Sep 17 00:00:00 2001 From: Jelle De Loecker Date: Sat, 17 Feb 2024 15:30:41 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20multiple=20custom-element?= =?UTF-8?q?=20rerenders=20causing=20the=20temporary=20width=20&=20height?= =?UTF-8?q?=20to=20stay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/element/custom_element.js | 39 +++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/lib/element/custom_element.js b/lib/element/custom_element.js index 227f4b08..0033aae4 100644 --- a/lib/element/custom_element.js +++ b/lib/element/custom_element.js @@ -975,14 +975,27 @@ function renderCustomTemplate(re_render) { let slot_data = _extractSlotData.call(this, true, re_render); + // If there already is a render in progress, resolve it + if (this[CURRENT_RENDER]) { + this[CURRENT_RENDER].resolve(false); + } + let pledge = new Classes.Pledge.Swift(); this[CURRENT_RENDER] = pledge; - function doEarlyResolve(value) { - pledge.resolve(value); - } + const doEarlyResolve = value => pledge.resolve(value), + alreadyDone = () => this[CURRENT_RENDER] != pledge || pledge.is_done; + + Hawkejs.series(next => { - Hawkejs.series(function getRenderVariables(next) { + // Force re-renders with non-compiled templates to be async + // This can help re-renders to be cancelled quicker + if (re_render && !this.constructor.compiled_template) { + Blast.setImmediate(next); + } else { + next(); + } + }, function getRenderVariables(next) { if (!has_prepare_logic) { return next(); @@ -1011,7 +1024,7 @@ function renderCustomTemplate(re_render) { next(); }, function renderTemplate(next) { - if (that[CURRENT_RENDER] != pledge) { + if (alreadyDone()) { doEarlyResolve(false); return; } @@ -1033,7 +1046,7 @@ function renderCustomTemplate(re_render) { renderer.renderTemplate(template, render_vars, String(render_counter++)).done(next); }, function assembleBlock(next, template) { - if (that[CURRENT_RENDER] != pledge) { + if (alreadyDone()) { doEarlyResolve(false); return; } @@ -1048,7 +1061,7 @@ function renderCustomTemplate(re_render) { }, function assembledBlock(next, block) { - if (that[CURRENT_RENDER] != pledge) { + if (alreadyDone()) { doEarlyResolve(false); return; } @@ -1069,7 +1082,7 @@ function renderCustomTemplate(re_render) { next(); }, function resolved(err) { - if (that[CURRENT_RENDER] != pledge) { + if (alreadyDone()) { doEarlyResolve(false); return; } @@ -2649,6 +2662,14 @@ Element.setMethod(function rerender() { // Remove the rendered time this.removeAttribute('he-rendered'); + // If there already is a render in progress, resolve it now. + // (We can't cancel it, because other areas of the code might be waiting for it) + // We have to do this now so any rerendering attributes will be undone + if (this[CURRENT_RENDER]) { + this[CURRENT_RENDER].resolve(false); + this[CURRENT_RENDER] = null; + } + // Get the current dimensions let client_rects = Blast.isBrowser ? this.getClientRects()?.[0] : null, previous_width, @@ -2668,7 +2689,7 @@ Element.setMethod(function rerender() { this.delayAssemble(pledge); } - Blast.Classes.Pledge.Swift.done(pledge, err => { + Classes.Pledge.Swift.done(pledge, err => { // Remove the rerendering attribute this.removeAttribute('data-he-rerendering');