UNPKG

@dotcms/analytics

Version:

Official JavaScript library for Content Analytics with DotCMS.

193 lines (192 loc) 5.65 kB
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 };