1
- import { ref } from "vue" ;
1
+ import { Ref , ref } from "vue" ;
2
2
import { defineNuxtPlugin } from "#app" ;
3
+ import { LocationQuery } from "vue-router" ;
4
+ import { UTMParams , AdditionalInfo , DataObject } from "nuxt-utm" ;
3
5
4
6
const LOCAL_STORAGE_KEY = "nuxt-utm-data" ;
5
7
const SESSION_ID_KEY = "nuxt-utm-session-id" ;
6
8
7
- interface UTMParams {
8
- utm_source ?: string ;
9
- utm_medium ?: string ;
10
- utm_campaign ?: string ;
11
- utm_term ?: string ;
12
- utm_content ?: string ;
13
- }
14
-
15
- interface AdditionalInfo {
16
- referrer : string ;
17
- userAgent : string ;
18
- language : string ;
19
- screen : {
20
- width : number ;
21
- height : number ;
22
- } ;
23
- }
9
+ const generateSessionId = ( ) => {
10
+ return Math . random ( ) . toString ( 36 ) . substring ( 2 , 15 ) ;
11
+ } ;
24
12
25
- interface DataObject {
26
- timestamp : string ;
27
- utmParams : UTMParams ;
28
- additionalInfo : AdditionalInfo ;
29
- sessionId : string ;
30
- }
13
+ const readLocalData = ( ) => {
14
+ const localData = localStorage . getItem ( LOCAL_STORAGE_KEY ) ;
31
15
32
- function generateSessionId ( ) {
33
- return Math . random ( ) . toString ( 36 ) . substring ( 2 , 15 ) ;
34
- }
16
+ try {
17
+ if ( localData ) {
18
+ return JSON . parse ( localData ) ;
19
+ }
20
+ } catch ( error ) {
21
+ console . error ( "Error parsing local storage data" , error ) ;
22
+ return ;
23
+ }
24
+ } ;
25
+
26
+ const getSessionID = ( ) => {
27
+ const sessionID = sessionStorage . getItem ( SESSION_ID_KEY ) || "" ;
28
+ if ( sessionID == "" ) {
29
+ const newSessionID = generateSessionId ( ) ;
30
+ sessionStorage . setItem ( SESSION_ID_KEY , newSessionID ) ;
31
+ return newSessionID ;
32
+ }
33
+ return sessionID ;
34
+ } ;
35
+
36
+ const urlHasUtmParams = ( query : LocationQuery ) => {
37
+ return (
38
+ query . utm_source ||
39
+ query . utm_medium ||
40
+ query . utm_campaign ||
41
+ query . utm_term ||
42
+ query . utm_content
43
+ ) ;
44
+ } ;
45
+
46
+ const getUtmParams = ( query : LocationQuery ) => {
47
+ const utmParams : UTMParams = {
48
+ utm_source : query . utm_source ?. toString ( ) ,
49
+ utm_medium : query . utm_medium ?. toString ( ) ,
50
+ utm_campaign : query . utm_campaign ?. toString ( ) ,
51
+ utm_term : query . utm_term ?. toString ( ) ,
52
+ utm_content : query . utm_content ?. toString ( ) ,
53
+ } ;
54
+ return utmParams ;
55
+ } ;
56
+
57
+ const generateAdditionalInfo = ( ) => {
58
+ const additionalInfo : AdditionalInfo = {
59
+ referrer : document . referrer ,
60
+ userAgent : navigator . userAgent ,
61
+ language : navigator . language ,
62
+ screen : {
63
+ width : screen . width ,
64
+ height : screen . height ,
65
+ } ,
66
+ } ;
67
+ return additionalInfo ;
68
+ } ;
35
69
36
- export default defineNuxtPlugin ( ( nuxtApp ) => {
37
- console . log ( "Plugin injected by my-module!" ) ;
70
+ const isRepeatedEntry = ( data : Ref < DataObject [ ] > , currentSessionID : string ) => {
71
+ const lastEntry = data . value [ 0 ] ;
72
+ return lastEntry && lastEntry . sessionId === currentSessionID ;
73
+ } ;
38
74
75
+ export default defineNuxtPlugin ( ( nuxtApp ) => {
39
76
const data = ref < DataObject [ ] > ( [ ] ) ;
40
77
41
78
nuxtApp . hook ( "app:mounted" , ( ) => {
42
- console . log ( "_route:" , nuxtApp . _route ) ;
43
- console . log ( "query:" , nuxtApp . _route . query ) ;
44
-
45
- const localData = localStorage . getItem ( LOCAL_STORAGE_KEY ) ;
79
+ data . value = readLocalData ( ) ;
46
80
47
- try {
48
- if ( localData ) {
49
- data . value = JSON . parse ( localData ) ;
50
- }
51
- } catch ( error ) {
52
- console . error ( "Error parsing local storage data" , error ) ;
53
- }
54
-
55
- let sessionId = sessionStorage . getItem ( SESSION_ID_KEY ) || "" ;
56
- if ( sessionId == "" ) {
57
- sessionId = generateSessionId ( ) ;
58
- sessionStorage . setItem ( SESSION_ID_KEY , sessionId ) ;
59
- }
81
+ const sessionId = getSessionID ( ) ;
60
82
61
83
const query = nuxtApp . _route . query ;
62
84
63
- if (
64
- ! query . utm_source &&
65
- ! query . utm_medium &&
66
- ! query . utm_campaign &&
67
- ! query . utm_term &&
68
- ! query . utm_content
69
- ) {
85
+ if ( ! urlHasUtmParams ( query ) ) {
70
86
return {
71
87
provide : {
72
88
utmData : data ,
73
89
} ,
74
90
} ; // Exit if no UTM parameters found
75
91
}
76
92
77
- const utmParams : UTMParams = {
78
- utm_source : query . utm_source ?. toString ( ) ,
79
- utm_medium : query . utm_medium ?. toString ( ) ,
80
- utm_campaign : query . utm_campaign ?. toString ( ) ,
81
- utm_term : query . utm_term ?. toString ( ) ,
82
- utm_content : query . utm_content ?. toString ( ) ,
83
- } ;
93
+ const utmParams = getUtmParams ( query ) ;
84
94
85
- const additionalInfo : AdditionalInfo = {
86
- referrer : document . referrer ,
87
- userAgent : navigator . userAgent ,
88
- language : navigator . language ,
89
- screen : {
90
- width : screen . width ,
91
- height : screen . height ,
92
- } ,
93
- } ;
95
+ const additionalInfo = generateAdditionalInfo ( ) ;
94
96
95
97
const timestamp = new Date ( ) . toISOString ( ) ;
96
98
@@ -101,16 +103,7 @@ export default defineNuxtPlugin((nuxtApp) => {
101
103
sessionId,
102
104
} ;
103
105
104
- const lastEntry = data . value [ 0 ] ;
105
- if (
106
- lastEntry &&
107
- lastEntry . utmParams . utm_source === utmParams . utm_source &&
108
- lastEntry . utmParams . utm_medium === utmParams . utm_medium &&
109
- lastEntry . utmParams . utm_campaign === utmParams . utm_campaign &&
110
- lastEntry . utmParams . utm_term === utmParams . utm_term &&
111
- lastEntry . utmParams . utm_content === utmParams . utm_content &&
112
- lastEntry . sessionId === sessionId
113
- ) {
106
+ if ( isRepeatedEntry ( data , sessionId ) ) {
114
107
// Exit if the last entry is the same as the new entry
115
108
return {
116
109
provide : {
0 commit comments