From 6dd772bf00459fe5165140e4e756e2b3096686e8 Mon Sep 17 00:00:00 2001 From: Jacky Zhao Date: Mon, 21 Apr 2025 23:55:38 -0700 Subject: [PATCH] fix(popover): properly clear popover on racing fetch --- quartz/components/scripts/popover.inline.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/quartz/components/scripts/popover.inline.ts b/quartz/components/scripts/popover.inline.ts index d8f1e1a..989af7e 100644 --- a/quartz/components/scripts/popover.inline.ts +++ b/quartz/components/scripts/popover.inline.ts @@ -3,12 +3,13 @@ import { normalizeRelativeURLs } from "../../util/path" import { fetchCanonical } from "./util" const p = new DOMParser() +let activeAnchor: HTMLAnchorElement | null = null async function mouseEnterHandler( this: HTMLAnchorElement, { clientX, clientY }: { clientX: number; clientY: number }, ) { - const link = this + const link = (activeAnchor = this) if (link.dataset.noPopover === "true") { return } @@ -44,10 +45,9 @@ async function mouseEnterHandler( targetUrl.search = "" const popoverId = `popover-${link.pathname}` const prevPopoverElement = document.getElementById(popoverId) - const hasAlreadyBeenFetched = () => !!document.getElementById(popoverId) // dont refetch if there's already a popover - if (hasAlreadyBeenFetched()) { + if (!!document.getElementById(popoverId)) { showPopover(prevPopoverElement as HTMLElement) return } @@ -56,11 +56,6 @@ async function mouseEnterHandler( console.error(err) }) - // bailout if another popover exists - if (hasAlreadyBeenFetched()) { - return - } - if (!response) return const [contentType] = response.headers.get("Content-Type")!.split(";") const [contentTypeCategory, typeInfo] = contentType.split("/") @@ -107,11 +102,20 @@ async function mouseEnterHandler( elts.forEach((elt) => popoverInner.appendChild(elt)) } + if (!!document.getElementById(popoverId)) { + return + } + document.body.appendChild(popoverElement) + if (activeAnchor !== this) { + return + } + showPopover(popoverElement) } function clearActivePopover() { + activeAnchor = null const allPopoverElements = document.querySelectorAll(".popover") allPopoverElements.forEach((popoverElement) => popoverElement.classList.remove("active-popover")) }