UNPKG

@wener/console

Version:

Base console UI toolkit

105 lines (104 loc) 3.06 kB
import { getGlobalThis } from "@wener/utils"; import { createStore } from "zustand"; import { mutative } from "zustand-mutative"; function setupMatomo({ global = getGlobalThis(), url, siteId, queue = [] } = {}) { if (!url || !siteId) { return; } const G = global; if (typeof G === 'undefined' || G['Matomo']?.initialized) { return; } const _paq = G._paq = G._paq || queue; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push([ 'trackPageView' ]); _paq.push([ 'enableLinkTracking' ]); const u = url; _paq.push([ 'setTrackerUrl', u + 'matomo.php' ]); _paq.push([ 'setSiteId', siteId ]); return new Promise((resolve, reject)=>{ const doc = document; const ele$ = doc.createElement('script'); const parent$ = doc.getElementsByTagName('script')[0]; ele$.onload = ()=>{ resolve(window.Matomo); }; ele$.onerror = reject; ele$.type = 'text/javascript'; ele$.async = true; ele$.defer = true; ele$.src = u + 'matomo.js'; parent$.parentNode?.insertBefore(ele$, parent$); }); } export const TrackerStore = createStore()(mutative((setState, getState, store)=>{ const g = getGlobalThis(); const queue = []; let pending; return { init: ({ baseUrl, siteId })=>{ pending ||= setupMatomo({ url: baseUrl, siteId: siteId }); }, tracker: createProxyTracker({ queue, invoke: ({ method, args })=>{} }) }; })); function createProxyTracker({ queue = [], invoke }) { return new Proxy({ _paq: queue }, { get (target, prop) { switch(prop){ case '_paq': return target._paq; } return (...args)=>{ switch(prop){ case 'push': queue.push(...args); return; default: if (typeof prop !== 'string') { throw new Error(`Invalid tracker method ${String(prop)}`); } } let skip = false; if (invoke) { skip = invoke?.({ method: prop, args, queue }) === true; } if (!skip) { queue.push([ prop, ...args ]); } // Limit queue size if (queue.length > 1000) { queue.splice(0, 1000 - queue.length); } }; } }); } export function getTracker() { return TrackerStore.getState().tracker; } //# sourceMappingURL=MatomoTrackerStore.js.map