From c094c04713d65b887ccb1e24abacf735d41acc7d Mon Sep 17 00:00:00 2001 From: aleksandr-raw <104529174+aleksandr-raw@users.noreply.github.com> Date: Thu, 18 Apr 2024 19:23:27 +0400 Subject: [PATCH] added yandex metrica script --- .../ViewPublicationPage.tsx | 4 +++ lib/model/settingsData.ts | 1 + lib/utils/hooks/useYandexMetrica.tsx | 29 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 lib/utils/hooks/useYandexMetrica.tsx diff --git a/lib/components/ViewPublicationPage/ViewPublicationPage.tsx b/lib/components/ViewPublicationPage/ViewPublicationPage.tsx index 9b63002..f1b2090 100644 --- a/lib/components/ViewPublicationPage/ViewPublicationPage.tsx +++ b/lib/components/ViewPublicationPage/ViewPublicationPage.tsx @@ -14,6 +14,7 @@ import { StartPageViewPublication } from "./StartPageViewPublication"; import NextButton from "./tools/NextButton"; import PrevButton from "./tools/PrevButton"; import QuestionSelect from "./QuestionSelect"; +import {useYandexMetrica} from "@utils/hooks/useYandexMetrica.tsx"; export default function ViewPublicationPage() { const { settings, recentlyCompleted, quizId, preview, changeFaviconAndTitle } = useQuizData(); @@ -32,6 +33,9 @@ export default function ViewPublicationPage() { const isAnswer = answers.some(ans => ans.questionId === currentQuestion?.id); + const yandexMetricNumber = settings?.cfg?.yandexMetricNumber + useYandexMetrica(yandexMetricNumber); + useEffect(function setFaviconAndTitle() { if (!changeFaviconAndTitle) return; diff --git a/lib/model/settingsData.ts b/lib/model/settingsData.ts index e0d0428..0bb178c 100644 --- a/lib/model/settingsData.ts +++ b/lib/model/settingsData.ts @@ -108,6 +108,7 @@ export interface QuizConfig { law?: string; }; meta: string; + yandexMetricNumber: number | undefined; } export type FormContactFieldName = diff --git a/lib/utils/hooks/useYandexMetrica.tsx b/lib/utils/hooks/useYandexMetrica.tsx new file mode 100644 index 0000000..0a0e974 --- /dev/null +++ b/lib/utils/hooks/useYandexMetrica.tsx @@ -0,0 +1,29 @@ +import { useEffect } from "react"; + +export const useYandexMetrica = (yandexMetricNumber: number | undefined) => { + useEffect(() => { + if (yandexMetricNumber) { + const script = document.createElement("script"); + script.type = "text/javascript"; + script.innerHTML = ` + (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; + m[i].l=1*new Date(); + for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} + k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) + (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); + + ym(${yandexMetricNumber}, "init", { + clickmap:true, + trackLinks:true, + accurateTrackBounce:true, + webvisor:true + }); + `; + document.body.appendChild(script); + + const noscript = document.createElement("noscript"); + noscript.innerHTML = `