@mrr_97/next-yandex-metrika
Version:
Yandex Metrika for Next.js >= 14
1 lines • 7.41 kB
Source Map (JSON)
{"version":3,"sources":["../src/components/YandexMetrika.tsx","../src/hooks/usePageViews.tsx"],"names":["jsx","Script","jsxs","Fragment","usePathname","useSearchParams","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import Script from 'next/script'\n\nfunction YandexMetrikaTag({\n yid,\n clickmap = true,\n trackLinks = true,\n accurateTrackBounce = true,\n webvisor = false,\n strategy = 'afterInteractive',\n}: {\n yid: number,\n clickmap?: boolean,\n trackLinks?: boolean,\n accurateTrackBounce?: boolean,\n webvisor?: boolean,\n strategy?: 'lazyOnload' | 'afterInteractive' | 'beforeInteractive'\n}) {\n return (\n <Script id=\"yandex-metrika-tag\" strategy={strategy}>\n {`\n (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};\n m[i].l=1*new Date();\n for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}\n k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})\n (window, document, \"script\", \"https://mc.webvisor.org/metrika/tag_ww.js\", \"ym\");\n\n ym(${yid}, \"init\", {\n clickmap:${clickmap},\n trackLinks:${trackLinks},\n accurateTrackBounce:${accurateTrackBounce},\n webvisor:${webvisor}\n });\n `}\n </Script>\n );\n}\n\nfunction YandexMetrikaPixel({ yid }: { yid: number }) {\n const src = `https://mc.yandex.ru/watch/${yid}`;\n\n return (\n <noscript id=\"yandex-metrika-pixel\">\n <div>\n <img\n src={src}\n style={{ position: \"absolute\", left: \"-9999px\" }}\n alt=\"\"\n />\n </div>\n </noscript>\n );\n}\n\nexport function YandexMetrika({\n yid,\n clickmap = true,\n trackLinks = true,\n accurateTrackBounce = true,\n webvisor = false,\n strategy = 'afterInteractive'\n}: {\n yid?: number,\n clickmap?: boolean,\n trackLinks?: boolean,\n accurateTrackBounce?: boolean,\n webvisor?: boolean,\n strategy?: 'lazyOnload' | 'afterInteractive' | 'beforeInteractive'\n}) {\n yid = yid ?? Number(process.env.NEXT_PUBLIC_YANDEX_ID)\n\n if (!yid) {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn('Yandex Metrika ID is not set')\n }\n return null\n }\n\n return (\n <>\n <YandexMetrikaTag\n yid={yid}\n clickmap={clickmap}\n trackLinks={trackLinks}\n accurateTrackBounce={accurateTrackBounce}\n webvisor={webvisor}\n strategy={strategy}\n />\n <YandexMetrikaPixel yid={yid} />\n </>\n );\n}\n","'use client'\n\nimport { useEffect } from 'react'\nimport { usePathname, useSearchParams } from 'next/navigation'\n\ntype HitOptions = {\n callback?: () => void\n ctx?: object\n params?: {\n order_price?: number\n currency?: string\n }\n referer?: string\n title?: string\n}\n\ninterface UsePageViewsOptions {\n ignoreHashChange?: boolean\n disabled?: boolean\n}\n\ndeclare global {\n interface Window {\n ym?: (yid: number, method: string, url: string, options?: HitOptions) => void\n }\n}\n\nconst trackPageView = (url: string, options?: HitOptions) => {\n if (typeof window !== 'undefined' && window.ym) {\n const yid = Number(process.env.NEXT_PUBLIC_YANDEX_ID)\n\n if (!window.ym || !yid) {\n return\n }\n\n // https://yandex.ru/support/metrica/code/counter-spa-setup.html\n window.ym(yid, 'hit', url, {\n ...options,\n title: options?.title || document.title\n })\n }\n}\n\nexport function usePageViews({\n ignoreHashChange = false,\n disabled = false\n}: UsePageViewsOptions = {}) {\n const pathname = usePathname()\n const searchParams = useSearchParams()\n\n useEffect(() => {\n if (disabled) {\n return\n }\n\n // Для App Router используем pathname и searchParams\n const url = searchParams.toString()\n ? `${pathname}?${searchParams.toString()}`\n : pathname\n\n trackPageView(url)\n }, [pathname, searchParams, disabled])\n\n useEffect(() => {\n if (disabled || ignoreHashChange) {\n return\n }\n\n const handleHashChange = () => {\n if (typeof window !== 'undefined') {\n trackPageView(window.location.pathname + window.location.search + window.location.hash)\n }\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('hashchange', handleHashChange)\n return () => window.removeEventListener('hashchange', handleHashChange)\n }\n }, [disabled, ignoreHashChange])\n}\n"]}