Fix hot reloading stylesheets with an existing query parameter and deduplicate random query param (#3315)

This commit is contained in:
Evan Almloff authored and GitHub committed 2024-12-09 09:09:57 -08:00
1 parent 3326e6b2fa
commit b643461129
4 files changed
+48 -12

No files matched your search

+34 -9
View File
@@ -170,7 +170,10 @@ export class NativeInterpreter extends JSChannel_ {
// Windows drag-n-drop fix code. Called by wry drag-n-drop handler over the event loop.
handleWindowsDragDrop() {
if (window.dxDragLastElement) {
const dragLeaveEvent = new DragEvent("dragleave", { bubbles: true, cancelable: true });
const dragLeaveEvent = new DragEvent("dragleave", {
bubbles: true,
cancelable: true,
});
window.dxDragLastElement.dispatchEvent(dragLeaveEvent);
let data = new DataTransfer();
@@ -179,7 +182,11 @@ export class NativeInterpreter extends JSChannel_ {
const file = new File(["content"], "file.txt", { type: "text/plain" });
data.items.add(file);
const dragDropEvent = new DragEvent("drop", { bubbles: true, cancelable: true, dataTransfer: data });
const dragDropEvent = new DragEvent("drop", {
bubbles: true,
cancelable: true,
dataTransfer: data,
});
window.dxDragLastElement.dispatchEvent(dragDropEvent);
window.dxDragLastElement = null;
}
@@ -190,11 +197,17 @@ export class NativeInterpreter extends JSChannel_ {
if (element != window.dxDragLastElement) {
if (window.dxDragLastElement) {
const dragLeaveEvent = new DragEvent("dragleave", { bubbles: true, cancelable: true });
const dragLeaveEvent = new DragEvent("dragleave", {
bubbles: true,
cancelable: true,
});
window.dxDragLastElement.dispatchEvent(dragLeaveEvent);
}
const dragOverEvent = new DragEvent("dragover", { bubbles: true, cancelable: true });
const dragOverEvent = new DragEvent("dragover", {
bubbles: true,
cancelable: true,
});
element.dispatchEvent(dragOverEvent);
window.dxDragLastElement = element;
}
@@ -202,7 +215,10 @@ export class NativeInterpreter extends JSChannel_ {
handleWindowsDragLeave() {
if (window.dxDragLastElement) {
const dragLeaveEvent = new DragEvent("dragleave", { bubbles: true, cancelable: true });
const dragLeaveEvent = new DragEvent("dragleave", {
bubbles: true,
cancelable: true,
});
window.dxDragLastElement.dispatchEvent(dragLeaveEvent);
window.dxDragLastElement = null;
}
@@ -382,10 +398,19 @@ export class NativeInterpreter extends JSChannel_ {
let stylesheets = document.querySelectorAll("link[rel=stylesheet]");
for (let i = 0; i < stylesheets.length; i++) {
let sheet = stylesheets[i] as HTMLLinkElement;
// Using `cache: reload` will force the browser to re-fetch the stylesheet and bust the cache
fetch(sheet.href, { cache: "reload" }).then(() => {
sheet.href = sheet.href + "?" + Math.random();
});
// Split up the url and add a extra random query param to force the browser to reload he asset
const splitByQuery = sheet.href.split("?");
let url = splitByQuery[0];
let query = splitByQuery[1];
if (!query) {
query = "";
}
let queryParams = new URLSearchParams(query);
// Delete the existing dx_force_reload entry if it exists
queryParams.delete("dx_force_reload");
// And add a new random dx_force_reload query param to force the browser to reload the asset
queryParams.append("dx_force_reload", Math.random().toString());
sheet.href = `${url}?${queryParams}`;
}
}