@jaseeey/vue-umami-plugin
Version:
A plugin designed for Vue 3 which enables the use of Umami Analytics
71 lines (70 loc) • 2.47 kB
JavaScript
const queuedEvents = [];
export function VueUmamiPlugin(options) {
return {
install: () => {
if (window.location.hostname.includes('localhost') && !options.allowLocalhost) {
console.warn('Umami plugin not installed due to being on localhost.');
return;
}
const { scriptSrc = 'https://us.umami.is/script.js', websiteID, router } = options;
if (!websiteID) {
return console.warn('Website ID not provided for Umami plugin, skipping.');
}
if (router) {
attachUmamiToRouter(router);
}
onDocumentReady(() => initUmamiScript(scriptSrc, websiteID));
}
};
}
function attachUmamiToRouter(router) {
router.afterEach((to) => trackUmamiPageView({ url: to.fullPath }));
}
function onDocumentReady(callback) {
document.readyState !== 'loading'
? callback()
: document.addEventListener('DOMContentLoaded', callback);
}
function initUmamiScript(scriptSrc, websiteID) {
const script = document.createElement('script');
script.defer = true;
script.src = scriptSrc;
script.onload = () => {
console.log('Umami plugin loaded');
processQueuedEvents();
};
script.setAttribute('data-website-id', websiteID);
script.setAttribute('data-auto-track', 'false');
document.head.appendChild(script);
}
function processQueuedEvents() {
while (queuedEvents.length) {
const item = queuedEvents.shift();
if (!item) {
continue;
}
typeof item === 'function'
? window.umami.track(item)
: item.type === 'identify'
? window.umami.identify(item.args[0])
: window.umami.track(item.type, item.args[0]);
}
}
export function trackUmamiPageView(options) {
const trackPageViewOptionsFn = (props) => {
return { ...props, ...options };
};
window.umami
? window.umami.track(trackPageViewOptionsFn)
: queuedEvents.push(trackPageViewOptionsFn);
}
export function trackUmamiEvent(event, eventParams) {
window.umami
? window.umami.track(event, eventParams)
: queuedEvents.push({ type: event, args: [eventParams] });
}
export function identifyUmamiSession(sessionData) {
window.umami
? window.umami.identify(sessionData)
: queuedEvents.push({ type: 'identify', args: [sessionData] });
}