React / Next.js SDK
@trektik/react v0.1.2 — тонкая React-обёртка. Свой мини-клиент (~2 KB gzip), независимый от @trektik/browser. Только track / identify / reset.
Установка
React SDK выдаётся приватно — аккаунт-менеджер пришлёт trektik-react-0.1.2.tgz после активации подписки. Установка из локального пути:
# положите присланный файл в ./vendor/
npm install ./vendor/trektik-react-0.1.2.tgzPeer dependency: react >= 18. @trektik/browser подтянется автоматически из публичного npm.
<TrektikProvider>
Оборачивает дерево и создаёт SDK-инстанс один раз через useRef.
import { TrektikProvider } from '@trektik/react';
export default function App() {
return (
<TrektikProvider
apiKey="pk_..."
endpoint="https://collect.trektik.ru" // необязательно
debug={false} // необязательно
trackPageViews={true} // необязательно, по умолчанию true
>
<YourApp />
</TrektikProvider>
);
}При trackPageViews (true по умолчанию) провайдер шлёт $pageview c title при монтировании. Он не подписывается на SPA-навигацию — для этого есть <TrackPageView />.
useTrektik()
import { useTrektik } from '@trektik/react';
function CheckoutButton() {
const { track, identify, reset } = useTrektik();
return (
<button onClick={() => track('checkout_clicked', { plan: 'pro' })}>
Pay
</button>
);
}Бросает ошибку, если вызван вне <TrektikProvider>.
<TrackPageView /> для Next.js App Router
Автотрекинг SPA-навигации. Ставьте в layout.tsx:
// app/layout.tsx
import { TrektikProvider, TrackPageView } from '@trektik/react';
export default function RootLayout({ children }) {
return (
<html>
<body>
<TrektikProvider apiKey="pk_..." trackPageViews={false}>
<TrackPageView />
{children}
</TrektikProvider>
</body>
</html>
);
}Слушает popstate, патчит pushState / replaceState. Дедуплицирует подряд идущие одинаковые пути. Поставьте trackPageViews={false} на провайдере, чтобы первая страница не трекалась дважды.
Только client-side
// components/trektik-wrapper.tsx
'use client';
import { TrektikProvider, TrackPageView } from '@trektik/react';
export function TrektikWrapper({ children }: { children: React.ReactNode }) {
return (
<TrektikProvider apiKey={process.env.NEXT_PUBLIC_TREKTIK_KEY!} trackPageViews={false}>
<TrackPageView />
{children}
</TrektikProvider>
);
}Когда брать @trektik/browser напрямую
React-обёртка умышленно тонкая: нет автозахвата, записей сессий, тепловых карт, подсказок и опросов. Если вам это нужно — подключайте @trektik/browser в useEffect:
'use client';
import { useEffect } from 'react';
import { init } from '@trektik/browser';
export function TrektikProviderFull({ children }: { children: React.ReactNode }) {
useEffect(() => {
init({ apiKey: process.env.NEXT_PUBLIC_TREKTIK_KEY!, replay: true, guides: true });
}, []);
return <>{children}</>;
}