From 269de581547362253afdcd52daf8c3d29ddb12cb Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Mon, 15 Sep 2025 21:09:56 +0300 Subject: [PATCH] chore(utm): override utm tags --- composables/useUTM.ts | 36 +++++++++++++++++++++++++++++++++--- package.json | 2 +- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/composables/useUTM.ts b/composables/useUTM.ts index 9b28704..32cb194 100644 --- a/composables/useUTM.ts +++ b/composables/useUTM.ts @@ -9,15 +9,45 @@ export const useUTM = (baseUrl: string, content: string) => { /** * Generates a URL with UTM tracking parameters * - * @returns The URL with UTM parameters + * @returns {string} The URL with UTM parameters */ const getUrl = (): string => { - const url = new URL(baseUrl); + let url: URL; - /* Add UTM parameters */ + try { + url = new URL(baseUrl); + } catch (error) { + return baseUrl; + } + + /* Default UTM parameters */ url.searchParams.set('utm_source', 'hawk-tracker.ru'); url.searchParams.set('utm_content', content); + /* If current page has utm_* params, override defaults with those */ + if (process.client && typeof window !== 'undefined') { + const currentSearchParams = new URLSearchParams(window.location.search || ''); + + /** + * If utm_content is overridden, we will add original button content to utm_place + */ + let isUtmContentOverridden = false; + + currentSearchParams.forEach((value, key) => { + if (key.toLowerCase().startsWith('utm_')) { + if (key.toLowerCase() === 'utm_content') { + isUtmContentOverridden = true; + } + + url.searchParams.set(key, value); + } + }); + + if (isUtmContentOverridden && !url.searchParams.has('utm_place')) { + url.searchParams.set('utm_place', content); + } + } + return url.toString(); }; diff --git a/package.json b/package.json index f5feb95..75cd6d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk-yard", - "version": "2.0.0", + "version": "2.0.1", "private": true, "engines": { "node": ">=20.11.0",