@dotcms/analytics
Version:
Official JavaScript library for Content Analytics with DotCMS.
193 lines (192 loc) • 5.65 kB
JavaScript
import { UVEEventType as d } from "../../../types/src/lib/editor/public.js";
import { __DOTCMS_UVE_EVENT__ as f } from "../../../types/src/lib/events/internal.js";
import { DOT_SECTION_ID_PREFIX as g } from "./constants.js";
import { TEMP_EMPTY_CONTENTLET as C, TEMP_EMPTY_CONTENTLET_TYPE as w } from "./contentlet-sentinel.constants.js";
import { findDotCMSElement as _, readContentletDataset as b, findDotCMSVTLData as L, getClosestDotCMSContainerData as O, getDotCMSPageBounds as N } from "../lib/dom/dom.utils.js";
function M(s) {
const e = (t) => {
t.data.name === f.UVE_SET_PAGE_DATA && s(t.data.payload);
};
return window.addEventListener("message", e), {
unsubscribe: () => {
window.removeEventListener("message", e);
},
event: d.CONTENT_CHANGES
};
}
function P(s) {
const e = (t) => {
t.data.name === f.UVE_RELOAD_PAGE && s();
};
return window.addEventListener("message", e), {
unsubscribe: () => {
window.removeEventListener("message", e);
},
event: d.PAGE_RELOAD
};
}
const S = 100;
function R(s) {
let e = null, t = [];
const a = () => {
const r = Array.from(
document.querySelectorAll('[data-dot-object="container"]')
);
s(N(r));
}, n = () => {
e !== null && clearTimeout(e), e = setTimeout(() => {
e = null, a();
}, S);
}, o = new ResizeObserver(() => {
n();
}), v = () => {
for (const r of t)
o.unobserve(r);
t = Array.from(
document.querySelectorAll('[data-dot-object="container"]')
), o.observe(document.documentElement);
for (const r of t)
o.observe(r);
};
v();
const c = (r) => {
for (let i = 0; i < r.length; i++) {
const m = r[i];
if (m.nodeType !== Node.ELEMENT_NODE)
continue;
const T = m;
if (T.matches?.('[data-dot-object="container"]') || T.querySelector?.('[data-dot-object="container"]'))
return !0;
}
return !1;
}, l = new MutationObserver((r) => {
for (const i of r)
if (i.type === "childList" && (c(i.addedNodes) || c(i.removedNodes))) {
v(), n();
return;
}
});
l.observe(document.body ?? document.documentElement, {
childList: !0,
subtree: !0
});
const u = () => n();
window.addEventListener("scroll", u, { passive: !0 });
const E = (r) => {
r?.data?.name === f.UVE_FLUSH_BOUNDS && (e !== null && (clearTimeout(e), e = null), a());
};
return window.addEventListener("message", E), {
unsubscribe: () => {
e !== null && (clearTimeout(e), e = null), o.disconnect(), l.disconnect(), window.removeEventListener("scroll", u), window.removeEventListener("message", E), t = [];
},
event: d.AUTO_BOUNDS
};
}
function U(s) {
const e = (t) => {
if (t.data.name === f.UVE_SCROLL_INSIDE_IFRAME) {
const a = t.data.direction;
s(a);
}
};
return window.addEventListener("message", e), {
unsubscribe: () => {
window.removeEventListener("message", e);
},
event: d.IFRAME_SCROLL
};
}
function h(s) {
const e = (t) => {
if (t.data.name !== f.UVE_SCROLL_TO_SECTION)
return;
const a = t.data.sectionIndex, n = document.querySelector(`#${g}${a}`) ?? document.querySelector(`#section-${a}`);
n && s({ sectionIndex: a, offsetTop: n.offsetTop });
};
return window.addEventListener("message", e), {
unsubscribe: () => {
window.removeEventListener("message", e);
},
event: d.SCROLL_TO_SECTION
};
}
function V(s) {
let e = !1;
const t = (a) => {
const n = _(a.target);
if (!n) {
e && (e = !1, s(null));
return;
}
const { x: o, y: v, width: c, height: l } = n.getBoundingClientRect(), u = n.dataset?.dotObject === "container", E = {
identifier: C,
title: C,
contentType: w,
inode: "TEMPY_EMPTY_CONTENTLET_INODE",
widgetTitle: C,
baseType: C,
onNumberOfPages: 1
}, r = b(n), i = L(n), m = {
container: (
// Here extract dot-container from contentlet if it is Headless
// or search in parent container if it is VTL
n.dataset?.dotContainer ? JSON.parse(n.dataset?.dotContainer) : O(n)
),
contentlet: u ? E : r,
vtlFiles: i
}, T = {
x: o,
y: v,
width: c,
height: l,
payload: m
};
e = !0, s(T);
};
return document.addEventListener("pointermove", t), {
unsubscribe: () => {
document.removeEventListener("pointermove", t);
},
event: d.CONTENTLET_HOVERED
};
}
function k(s) {
let e;
const t = (n) => {
const o = _(n.target);
if (!o || o.dataset?.dotObject === "container") return;
const c = o.dataset?.dotInode;
if (c && c === e)
return;
n.preventDefault(), n.stopPropagation(), e = c;
const { x: l, y: u, width: E, height: r } = o.getBoundingClientRect(), i = b(o), m = L(o);
s({
x: l,
y: u,
width: E,
height: r,
payload: {
container: o.dataset?.dotContainer ? JSON.parse(o.dataset?.dotContainer) : O(o),
contentlet: i,
vtlFiles: m
}
});
}, a = (n) => {
n?.data?.name === f.UVE_SELECTION_CLEARED && (e = void 0);
};
return document.addEventListener("click", t, { capture: !0 }), window.addEventListener("message", a), {
unsubscribe: () => {
document.removeEventListener("click", t, { capture: !0 }), window.removeEventListener("message", a);
},
event: d.CONTENTLET_CLICKED
};
}
export {
R as onAutoBounds,
M as onContentChanges,
k as onContentletClicked,
V as onContentletHovered,
U as onIframeScroll,
P as onPageReload,
h as onScrollToSection
};