@mrr_97/next-yandex-metrika
Version:
Yandex Metrika for Next.js >= 14
114 lines (111 loc) • 3.41 kB
JavaScript
import Script from 'next/script';
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
import { useEffect } from 'react';
import { usePathname, useSearchParams } from 'next/navigation';
// src/components/YandexMetrika.tsx
function YandexMetrikaTag({
yid,
clickmap = true,
trackLinks = true,
accurateTrackBounce = true,
webvisor = false,
strategy = "afterInteractive"
}) {
return /* @__PURE__ */ jsx(Script, { id: "yandex-metrika-tag", strategy, children: `
(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.webvisor.org/metrika/tag_ww.js", "ym");
ym(${yid}, "init", {
clickmap:${clickmap},
trackLinks:${trackLinks},
accurateTrackBounce:${accurateTrackBounce},
webvisor:${webvisor}
});
` });
}
function YandexMetrikaPixel({ yid }) {
const src = `https://mc.yandex.ru/watch/${yid}`;
return /* @__PURE__ */ jsx("noscript", { id: "yandex-metrika-pixel", children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(
"img",
{
src,
style: { position: "absolute", left: "-9999px" },
alt: ""
}
) }) });
}
function YandexMetrika({
yid,
clickmap = true,
trackLinks = true,
accurateTrackBounce = true,
webvisor = false,
strategy = "afterInteractive"
}) {
yid = yid ?? Number(process.env.NEXT_PUBLIC_YANDEX_ID);
if (!yid) {
if (process.env.NODE_ENV !== "production") {
console.warn("Yandex Metrika ID is not set");
}
return null;
}
return /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx(
YandexMetrikaTag,
{
yid,
clickmap,
trackLinks,
accurateTrackBounce,
webvisor,
strategy
}
),
/* @__PURE__ */ jsx(YandexMetrikaPixel, { yid })
] });
}
var trackPageView = (url, options) => {
if (typeof window !== "undefined" && window.ym) {
const yid = Number(process.env.NEXT_PUBLIC_YANDEX_ID);
if (!window.ym || !yid) {
return;
}
window.ym(yid, "hit", url, {
...options,
title: document.title
});
}
};
function usePageViews({
ignoreHashChange = false,
disabled = false
} = {}) {
const pathname = usePathname();
const searchParams = useSearchParams();
useEffect(() => {
if (disabled) {
return;
}
const url = searchParams.toString() ? `${pathname}?${searchParams.toString()}` : pathname;
trackPageView(url);
}, [pathname, searchParams, disabled]);
useEffect(() => {
if (disabled || ignoreHashChange) {
return;
}
const handleHashChange = () => {
if (typeof window !== "undefined") {
trackPageView(window.location.pathname + window.location.search + window.location.hash);
}
};
if (typeof window !== "undefined") {
window.addEventListener("hashchange", handleHashChange);
return () => window.removeEventListener("hashchange", handleHashChange);
}
}, [disabled, ignoreHashChange]);
}
export { YandexMetrika, usePageViews };
//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map