fix: add tracking service

This commit is contained in:
2025-06-20 12:47:57 +03:00
parent 2d77844758
commit 29a1abea03
7 changed files with 52 additions and 7 deletions

16
package-lock.json generated
View File

@@ -19,6 +19,7 @@
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"react-hook-form": "^7.57.0", "react-hook-form": "^7.57.0",
"react-hot-toast": "^2.5.2", "react-hot-toast": "^2.5.2",
"react-yandex-metrika": "^2.6.0",
"swiper": "^11.2.8", "swiper": "^11.2.8",
"zod": "^3.25.56" "zod": "^3.25.56"
}, },
@@ -3957,7 +3958,6 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/js-yaml": { "node_modules/js-yaml": {
@@ -4238,7 +4238,6 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0" "js-tokens": "^3.0.0 || ^4.0.0"
@@ -4455,7 +4454,6 @@
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
@@ -4798,7 +4796,6 @@
"version": "15.8.1", "version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"loose-envify": "^1.4.0", "loose-envify": "^1.4.0",
@@ -4895,9 +4892,18 @@
"version": "16.13.1", "version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/react-yandex-metrika": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/react-yandex-metrika/-/react-yandex-metrika-2.6.0.tgz",
"integrity": "sha512-8K4wExsNZtY3DTxh1G8a+zWH9Pg8fw23MJcoJ4I/562qrHRnh7L5nteq3lnNL58dnNQbuuHIRoGgMjIo+r1GjA==",
"license": "MIT",
"peerDependencies": {
"prop-types": "*",
"react": "*"
}
},
"node_modules/readdirp": { "node_modules/readdirp": {
"version": "3.6.0", "version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",

View File

@@ -22,6 +22,7 @@
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"react-hook-form": "^7.57.0", "react-hook-form": "^7.57.0",
"react-hot-toast": "^2.5.2", "react-hot-toast": "^2.5.2",
"react-yandex-metrika": "^2.6.0",
"swiper": "^11.2.8", "swiper": "^11.2.8",
"zod": "^3.25.56" "zod": "^3.25.56"
}, },

View File

@@ -1,10 +1,11 @@
import type { Metadata } from 'next'; import type { Metadata } from 'next';
import { ReactNode } from 'react';
import { Open_Sans } from 'next/font/google'; import { Open_Sans } from 'next/font/google';
import '@core/styles/reset.scss'; import '@core/styles/reset.scss';
import '@core/styles/globals.scss'; import '@core/styles/globals.scss';
import { Toaster } from 'react-hot-toast'; import { Toaster } from 'react-hot-toast';
import { ModalProvider } from '@core/providers/modal-provider'; import { ModalProvider } from '@core/providers/modal-provider';
import { CookieNotice } from '@/widgets'; import { CookieNotice, YandexMetrika } from '@/widgets';
const openSans = Open_Sans({ const openSans = Open_Sans({
subsets: ['cyrillic'], subsets: ['cyrillic'],
@@ -32,10 +33,11 @@ export const metadata: Metadata = {
export default function RootLayout({ export default function RootLayout({
children, children,
}: Readonly<{ children: React.ReactNode }>) { }: Readonly<{ children: ReactNode }>) {
return ( return (
<html lang='en'> <html lang='en'>
<body className={`${openSans.variable}`}> <body className={`${openSans.variable}`}>
<YandexMetrika />
<ModalProvider>{children}</ModalProvider> <ModalProvider>{children}</ModalProvider>
<Toaster /> <Toaster />
<CookieNotice /> <CookieNotice />

View File

@@ -0,0 +1,3 @@
const YM_COUNTER_ID = 102875868; // ID счетчика YM
export { YM_COUNTER_ID };

View File

@@ -6,3 +6,4 @@ export { OfferForm } from './offer-form';
export { OfferRequestForm } from './offer-request'; export { OfferRequestForm } from './offer-request';
export { AdvancedPhoneInput } from './advanced-phone-input'; export { AdvancedPhoneInput } from './advanced-phone-input';
export { CookieNotice } from './cookie-notice'; export { CookieNotice } from './cookie-notice';
export { YandexMetrika } from './yandex-metrika';

View File

@@ -0,0 +1 @@
export { default as YandexMetrika } from './ui';

View File

@@ -0,0 +1,31 @@
'use client';
import { usePathname } from 'next/navigation';
import { useEffect } from 'react';
import ym, { YMInitializer } from 'react-yandex-metrika';
import { YM_COUNTER_ID } from '@core/constants/tracking-service';
export default function YandexMetrika() {
const pathname = usePathname();
// Отправляем событие "hit" при изменении маршрута
useEffect(() => {
if (pathname) {
ym('hit', pathname);
}
}, [pathname]);
return (
<YMInitializer
accounts={[YM_COUNTER_ID]}
options={{
defer: true,
webvisor: true,
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
}}
version='2'
/>
);
}