From 35782233ef2054d35849b196520cd9b6fc4e609e Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 26 Mar 2025 11:14:22 +0300 Subject: [PATCH] fix download cv, ym --- compose.yml | 2 - package-lock.json | 16 +++-- package.json | 1 + ...veloper.docx => Крылов_Сергей-Frontend_Developer.docx} | Bin ...Developer.pdf => Крылов_Сергей-Frontend_Developer.pdf} | Bin src/app/layout.tsx | 10 +-- src/app/page.tsx | 4 +- src/components/metrika.tsx | 65 +++++++++++------- 8 files changed, 58 insertions(+), 40 deletions(-) rename public/docs/{Крылов Сергей, Frontend Developer.docx => Крылов_Сергей-Frontend_Developer.docx} (100%) rename public/docs/{Крылов Сергей, Frontend Developer.pdf => Крылов_Сергей-Frontend_Developer.pdf} (100%) diff --git a/compose.yml b/compose.yml index ffc6b18..0d98009 100644 --- a/compose.yml +++ b/compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: nextjs: image: node:18-alpine diff --git a/package-lock.json b/package-lock.json index 1cbd312..a09f465 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "next": "15.2.4", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-yandex-metrika": "^2.6.0", "tailwind-merge": "^3.0.2", "tw-animate-css": "^1.2.4" }, @@ -4374,7 +4375,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -4750,7 +4750,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -4943,7 +4942,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5242,7 +5240,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -5306,7 +5303,6 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, "node_modules/react-remove-scroll": { @@ -5378,6 +5374,16 @@ } } }, + "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/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", diff --git a/package.json b/package.json index bb82640..c382aae 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "next": "15.2.4", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-yandex-metrika": "^2.6.0", "tailwind-merge": "^3.0.2", "tw-animate-css": "^1.2.4" }, diff --git a/public/docs/Крылов Сергей, Frontend Developer.docx b/public/docs/Крылов_Сергей-Frontend_Developer.docx similarity index 100% rename from public/docs/Крылов Сергей, Frontend Developer.docx rename to public/docs/Крылов_Сергей-Frontend_Developer.docx diff --git a/public/docs/Крылов Сергей, Frontend Developer.pdf b/public/docs/Крылов_Сергей-Frontend_Developer.pdf similarity index 100% rename from public/docs/Крылов Сергей, Frontend Developer.pdf rename to public/docs/Крылов_Сергей-Frontend_Developer.pdf diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 4a9a146..a4e7d8e 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,4 +1,4 @@ -import { Metrika } from '@/components/metrika'; +import YandexMetrikaContainer, { Metrika } from '@/components/metrika'; import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; @@ -26,6 +26,8 @@ export const metadata: Metadata = { } }; +const analyticsEnabled = (process.env.NODE_ENV === "production"); + export default function RootLayout({ children, }: Readonly<{ @@ -38,10 +40,8 @@ export default function RootLayout({ > {children} - - - - + + ); } diff --git a/src/app/page.tsx b/src/app/page.tsx index bca71cb..d5eaaa6 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -61,14 +61,14 @@ export default function Home() { Download CV - + pdf icon PDF - + docx icon DOCX diff --git a/src/components/metrika.tsx b/src/components/metrika.tsx index 910991e..94779d0 100644 --- a/src/components/metrika.tsx +++ b/src/components/metrika.tsx @@ -1,34 +1,47 @@ "use client"; -import { useEffect } from "react"; -import { usePathname, useSearchParams } from "next/navigation"; -import Script from "next/script"; +import Router from "next/router"; +import React, { useCallback, useEffect } from "react"; +import ym, { YMInitializer } from "react-yandex-metrika"; -export function Metrika() { - const pathName = usePathname(); - const searchParams = useSearchParams(); +type Props = { + enabled: boolean; +}; + +const YM_COUNTER_ID = 100593564; + +const YandexMetrikaContainer: React.FC = ({ enabled }) => { + const hit = useCallback( + (url: string) => { + if (enabled) { + ym("hit", url); + } else { + console.log(`%c[YandexMetrika](HIT)`, `color: orange`, url); + } + }, + [enabled], + ); useEffect(() => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - window.ym(100593564, "hit", window.location.href); - }, [pathName, searchParams]); + hit(window.location.pathname + window.location.search); + Router.events.on("routeChangeComplete", (url: string) => hit(url)); + }, [hit]); + + if (!enabled) return null; return ( - + ); -} +}; + +export default YandexMetrikaContainer;