diff --git a/package.json b/package.json index a697ef03..081c9919 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "@iconscout/unicons": "^4.0.1", "@masscode/json-server": "^0.18.0", "@sipec/vue3-tags-input": "^3.0.4", + "@types/universal-analytics": "^0.4.5", "@vueuse/core": "^8.1.2", "ace-builds": "^1.4.14", "electron-store": "^8.0.1", @@ -41,6 +42,7 @@ "mitt": "^3.0.0", "nanoid": "^3.3.1", "pinia": "^2.0.12", + "universal-analytics": "^0.5.3", "vue": "^3.2.26", "vue-router": "^4.0.12", "vue3-perfect-scrollbar": "^1.6.0" diff --git a/src/main/preload.ts b/src/main/preload.ts index d4dec540..c57cc1f1 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -2,6 +2,11 @@ import { contextBridge, ipcRenderer } from 'electron' import { isDbExist, migrate, move } from './services/db' import { store } from './store' import type { ElectronBridge } from '@shared/types/main' +import { version } from '../../package.json' +import type { TrackEvents } from '@shared/types/main/analytics' +import { analytics } from './services/analytics' + +const isDev = process.env.NODE_ENV === 'development' contextBridge.exposeInMainWorld('electron', { ipc: { @@ -25,5 +30,14 @@ contextBridge.exposeInMainWorld('electron', { migrate: path => migrate(path), move: (from, to) => move(from, to), isExist: path => isDbExist(path) + }, + track: (event: TrackEvents, payload?: string) => { + if (isDev) return + + const path = payload + ? `${version}/${event}/${payload}` + : `${version}/${event}` + + analytics.pageview(path).send() } } as ElectronBridge) diff --git a/src/main/services/analytics/index.ts b/src/main/services/analytics/index.ts new file mode 100644 index 00000000..a4e12bdf --- /dev/null +++ b/src/main/services/analytics/index.ts @@ -0,0 +1,4 @@ +import ua from 'universal-analytics' +const analytics = ua('UA-56182454-13') + +export { analytics } diff --git a/src/renderer/components/editor/TheEditor.vue b/src/renderer/components/editor/TheEditor.vue index 1e304532..51aac0a1 100644 --- a/src/renderer/components/editor/TheEditor.vue +++ b/src/renderer/components/editor/TheEditor.vue @@ -36,6 +36,7 @@ import type { Language } from '@shared/types/renderer/editor' import { languages } from './languages' import { useAppStore } from '@/store/app' import { useSnippetStore } from '@/store/snippets' +import { track } from '@/electron' interface Props { lang: Language @@ -143,6 +144,7 @@ const setValue = () => { const setLang = () => { editor.session.setMode(`ace/mode/${localLang.value}`) + track('snippets/set-language', localLang.value) } const setTheme = () => { diff --git a/src/renderer/components/preferences/Storage.vue b/src/renderer/components/preferences/Storage.vue index 0a0003df..f3c1ff2d 100644 --- a/src/renderer/components/preferences/Storage.vue +++ b/src/renderer/components/preferences/Storage.vue @@ -33,7 +33,7 @@