@@ -47,12 +47,28 @@ const getCookie = (name: string): string | null => {
4747 if ( ! value ) return null ;
4848
4949 try {
50- return decodeURIComponent ( value ) ;
50+ return normaliseReferrer ( value ) ;
5151 } catch {
5252 return value ;
5353 }
5454} ;
5555
56+ const normaliseReferrer = ( referrer : string ) : string => {
57+ let current = referrer ;
58+
59+ for ( let i = 0 ; i < 3 ; i += 1 ) {
60+ try {
61+ const decoded = decodeURIComponent ( current ) ;
62+ if ( decoded === current ) break ;
63+ current = decoded ;
64+ } catch {
65+ break ;
66+ }
67+ }
68+
69+ return current ;
70+ } ;
71+
5672const getExternalDocumentReferrer = ( ) : string | null => {
5773 const referrer = document . referrer ;
5874
@@ -72,7 +88,7 @@ const getExternalDocumentReferrer = (): string | null => {
7288} ;
7389
7490const storeInitialReferrer = ( referrer : string ) => {
75- localStorage . setItem ( INITIAL_REFERRER_KEY , referrer ) ;
91+ localStorage . setItem ( INITIAL_REFERRER_KEY , normaliseReferrer ( referrer ) ) ;
7692} ;
7793
7894export function captureAttributionParams ( ) {
@@ -125,10 +141,17 @@ export function getStoredAttributionParams(): StoredAttributionParams {
125141 const stored = localStorage . getItem ( UTM_STORAGE_KEY ) ;
126142 const storedInitialReferrer = localStorage . getItem ( INITIAL_REFERRER_KEY ) ;
127143 const cookieReferrer = getCookie ( INITIAL_REFERRER_COOKIE ) ;
128- const initialReferrer = storedInitialReferrer ?? cookieReferrer ;
144+ const initialReferrer = storedInitialReferrer
145+ ? normaliseReferrer ( storedInitialReferrer )
146+ : cookieReferrer ;
129147
130148 if ( ! storedInitialReferrer && initialReferrer ) {
131149 storeInitialReferrer ( initialReferrer ) ;
150+ } else if (
151+ storedInitialReferrer &&
152+ initialReferrer !== storedInitialReferrer
153+ ) {
154+ storeInitialReferrer ( initialReferrer ) ;
132155 }
133156
134157 return {
0 commit comments