54 lines
1.7 KiB
JavaScript
54 lines
1.7 KiB
JavaScript
// packages/block-library/build-module/query/view.mjs
|
|
import {
|
|
store,
|
|
getContext,
|
|
getElement,
|
|
withSyncEvent
|
|
} from "@wordpress/interactivity";
|
|
var isValidLink = (ref) => ref && ref instanceof window.HTMLAnchorElement && ref.href && (!ref.target || ref.target === "_self") && ref.origin === window.location.origin;
|
|
var isValidEvent = (event) => event.button === 0 && // Left clicks only.
|
|
!event.metaKey && // Open in new tab (Mac).
|
|
!event.ctrlKey && // Open in new tab (Windows).
|
|
!event.altKey && // Download.
|
|
!event.shiftKey && !event.defaultPrevented;
|
|
store(
|
|
"core/query",
|
|
{
|
|
actions: {
|
|
navigate: withSyncEvent(function* (event) {
|
|
const ctx = getContext();
|
|
const { ref } = getElement();
|
|
const queryRef = ref.closest(
|
|
".wp-block-query[data-wp-router-region]"
|
|
);
|
|
if (isValidLink(ref) && isValidEvent(event)) {
|
|
event.preventDefault();
|
|
const { actions } = yield import("@wordpress/interactivity-router");
|
|
yield actions.navigate(ref.href);
|
|
ctx.url = ref.href;
|
|
const firstAnchor = `.wp-block-post-template a[href]`;
|
|
queryRef.querySelector(firstAnchor)?.focus();
|
|
}
|
|
}),
|
|
*prefetch() {
|
|
const { ref } = getElement();
|
|
if (isValidLink(ref)) {
|
|
const { actions } = yield import("@wordpress/interactivity-router");
|
|
yield actions.prefetch(ref.href);
|
|
}
|
|
}
|
|
},
|
|
callbacks: {
|
|
*prefetch() {
|
|
const { url } = getContext();
|
|
const { ref } = getElement();
|
|
if (url && isValidLink(ref)) {
|
|
const { actions } = yield import("@wordpress/interactivity-router");
|
|
yield actions.prefetch(ref.href);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{ lock: true }
|
|
);
|