diff --git a/app/plugins/matomo.client.ts b/app/plugins/matomo.client.ts new file mode 100644 index 0000000..f4ccc75 --- /dev/null +++ b/app/plugins/matomo.client.ts @@ -0,0 +1,43 @@ +// @ts-expect-error +import VueMatomo from 'vue-matomo'; + +export default defineNuxtPlugin((nuxtApp) => { + const { user } = useUserSession(); + nuxtApp.vueApp.use(VueMatomo, { + host: 'https://analytics.syma.dev', + siteId: 12, + router: nuxtApp.$router, + trackInitialView: true, + preInitActions: [ + // Respect DNT + ['setDoNotTrack', true], + user.value ? ['setUserId', user.value.id.toString()] : ['resetUserId'], + user.value + ? ['setCustomDimension', 1, user.value.role] + : ['setCustomDimension', 1, 'guest'] + ] + }); + + // Update user state + watch(user, (u) => { + if (u) { + // Add users id to visit + window._paq?.push(['setUserId', u.id.toString()]); + // Add users role to visit + window._paq?.push(['setCustomDimension', 1, u.role]); + window._paq?.push(['trackPageView']); + } else { + window._paq?.push(['resetUserId']); + window._paq?.push(['setCustomDimension', 1, 'guest']); + window._paq?.push(['appendToTrackingUrl', 'new_visit=1']); + window._paq?.push(['trackPageView']); + window._paq?.push(['appendToTrackingUrl', '']); + } + }); +}); + +declare global { + interface Window { + _paq?: any[]; + } +} diff --git a/bun.lock b/bun.lock index ad450cf..82359a2 100644 --- a/bun.lock +++ b/bun.lock @@ -21,6 +21,7 @@ "superjson": "^2.2.2", "unique-names-generator": "^4.7.1", "vue": "^3.5.18", + "vue-matomo": "^4.2.0", "vue-router": "^4.5.1", "zod": "^4.0.0", }, @@ -1967,6 +1968,8 @@ "vue-i18n": ["vue-i18n@11.1.11", "", { "dependencies": { "@intlify/core-base": "11.1.11", "@intlify/shared": "11.1.11", "@vue/devtools-api": "^6.5.0" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-LvyteQoXeQiuILbzqv13LbyBna/TEv2Ha+4ZWK2AwGHUzZ8+IBaZS0TJkCgn5izSPLcgZwXy9yyTrewCb2u/MA=="], + "vue-matomo": ["vue-matomo@4.2.0", "", {}, "sha512-m5hCw7LH3wPDcERaF4sp/ojR9sEx7Rl8TpOyH/4jjQxMF2DuY/q5pO+i9o5Dx+BXLSa9+IQ0qhAbWYRyESQXmA=="], + "vue-router": ["vue-router@4.5.1", "", { "dependencies": { "@vue/devtools-api": "^6.6.4" }, "peerDependencies": { "vue": "^3.2.0" } }, "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw=="], "vue-tsc": ["vue-tsc@3.0.4", "", { "dependencies": { "@volar/typescript": "2.4.20", "@vue/language-core": "3.0.4" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "./bin/vue-tsc.js" } }, "sha512-kZmSEjGtROApVBuaIcoprrXZsFNGon5ggkTJokmhQ/H1hMzCFRPQ0Ed8IHYFsmYJYvHBcdmEQVGVcRuxzPzNbw=="], diff --git a/package.json b/package.json index b204e31..51ff6ad 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "superjson": "^2.2.2", "unique-names-generator": "^4.7.1", "vue": "^3.5.18", + "vue-matomo": "^4.2.0", "vue-router": "^4.5.1", "zod": "^4.0.0" },