36 lines
1.1 KiB
JavaScript
36 lines
1.1 KiB
JavaScript
import { useEffect } from 'react';
|
||
import { API_URL } from '../config/authConstants';
|
||
import { getAdSessionId } from '../utils/adSession';
|
||
import { apiFetch } from '../api/apiClient';
|
||
|
||
export function useAdImpressionTracking(ref, advertisingId) {
|
||
useEffect(() => {
|
||
const node = ref.current;
|
||
if (!node || !advertisingId) return;
|
||
|
||
let sent = false;
|
||
const observer = new IntersectionObserver(
|
||
([entry]) => {
|
||
if (!entry.isIntersecting || sent) return;
|
||
sent = true;
|
||
observer.disconnect();
|
||
|
||
const payload = JSON.stringify({
|
||
advertisingId,
|
||
sessionId: getAdSessionId(),
|
||
});
|
||
|
||
apiFetch(`${API_URL}/api/ads/impression`, {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: payload,
|
||
keepalive: true, // отправка при уходе со страницы, как sendBeacon
|
||
}).catch(() => {});
|
||
},
|
||
{ threshold: 0.25 }
|
||
);
|
||
|
||
observer.observe(node);
|
||
return () => observer.disconnect();
|
||
}, [ref, advertisingId]);
|
||
} |