scrivito
Version:
Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.
68 lines (51 loc) • 1.57 kB
text/typescript
// @rewire
import { MouseEvent } from 'react';
import { isOriginLocal } from 'scrivito_sdk/app_support/routing';
import { isModifierClick, urlResource } from 'scrivito_sdk/common';
export type LinkTarget = OpenInCurrentWindow | OpenInNewWindow | null;
export interface OpenInCurrentWindow {
openInCurrentWindow: string;
}
export interface OpenInNewWindow {
openInNewWindow: string;
}
export function isOpenInNewWindow(
target: LinkTarget
): target is OpenInNewWindow {
if (target) {
return !!(target as OpenInNewWindow).openInNewWindow;
}
return false;
}
export function findClickTarget(e: MouseEvent<HTMLElement>): LinkTarget {
const innermostNode = e.target as Node;
const outermostNode = e.currentTarget;
const isModifier = isModifierClick(e);
return findLinkTarget(innermostNode, outermostNode, isModifier);
}
function findLinkTarget(
currentNode: Node,
outermostNode: Node,
isModifier: boolean
): LinkTarget {
if (currentNode === outermostNode) {
return null;
}
if (isHTMLAnchorElement(currentNode)) {
const url = currentNode.href;
if (!isOriginLocal(url)) {
return null;
}
if (isModifier || currentNode.getAttribute('target') === '_blank') {
return { openInNewWindow: url };
}
return { openInCurrentWindow: urlResource(new URL(url)) };
}
if (!currentNode.parentNode) {
return null;
}
return findLinkTarget(currentNode.parentNode, outermostNode, isModifier);
}
function isHTMLAnchorElement(node: Node): node is HTMLAnchorElement {
return node.nodeName === 'A';
}