export default class Piwik { constructor(opts) { const options = opts; options.enableLinkTracking = (options.enableLinkTracking !== undefined) ? options.enableLinkTracking : true; options.trackDocumentTitle = (options.trackDocumentTitle !== undefined) ? options.trackDocumentTitle : true; this.options = options; if (this.options.url === undefined || this.options.siteId === undefined) { throw new Error('PiwikTracker cannot be initialized! SiteId and url are mandatory.'); } this.initPiwik(); } initPiwik() { let url = this.options.url; if (url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1) { url = `${url}/`; } else { url = ((document.location.protocol === 'https:') ? `https://${url}/` : `http://${url}/`); } window._paq = window._paq || []; // eslint-disable-line no-underscore-dangle Piwik.push(['setSiteId', this.options.siteId]); Piwik.push(['setTrackerUrl', `${url}piwik.php`]); if (this.options.enableLinkTracking) { Piwik.push(['enableLinkTracking']); } const scriptElement = document.createElement('script'); const refElement = document.getElementsByTagName('script')[0]; scriptElement.type = 'text/javascript'; scriptElement.defer = true; scriptElement.async = true; scriptElement.src = `${url}piwik.js`; refElement.parentNode.insertBefore(scriptElement, refElement); return { push: this.push, track: this.track, connectToHistory: this.connectToHistory, disconnectFromHistory: this.disconnectFromHistory, }; } static push(args) { window._paq.push(args); // eslint-disable-line no-underscore-dangle } connectToHistory(history) { this.unlistenFromHistory = history.listen((loc) => { this.track(loc); }); return history; } disconnectFromHistory() { if (this.unlistenFromHistory) { this.unlistenFromHistory(); return true; } return false; } track(loc) { const currentPath = loc.path || (loc.pathname + loc.search)/*.replace(/^\//, '')*/; if (this.previousPath === currentPath) { return; } if (this.options.trackDocumentTitle) { Piwik.push(['setDocumentTitle', document.title]); } Piwik.push(['setCustomUrl', currentPath]); Piwik.push(['trackPageView']); this.previousPath = currentPath; } }