|
|
|
/* eslint-env browser */
|
|
|
|
import { getCLS, getFCP, getFID, getLCP, getTTFB } from 'web-vitals';
|
|
|
|
|
|
|
|
const vitalsUrl = 'https://vitals.vercel-analytics.com/v1/vitals';
|
|
|
|
|
|
|
|
function getConnectionSpeed() {
|
|
|
|
return 'connection' in navigator &&
|
|
|
|
navigator['connection'] &&
|
|
|
|
'effectiveType' in navigator['connection']
|
|
|
|
? navigator['connection']['effectiveType']
|
|
|
|
: '';
|
|
|
|
}
|
|
|
|
|
|
|
|
export function sendToVercelAnalytics(metric) {
|
|
|
|
const analyticsId = process.env.VERCEL_ANALYTICS_ID;
|
|
|
|
if (!analyticsId) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const body = {
|
|
|
|
dsn: analyticsId,
|
|
|
|
id: metric.id,
|
|
|
|
page: window.location.pathname,
|
|
|
|
href: window.location.href,
|
|
|
|
event_name: metric.name,
|
|
|
|
value: metric.value.toString(),
|
|
|
|
speed: getConnectionSpeed(),
|
|
|
|
};
|
|
|
|
|
|
|
|
const blob = new Blob([new URLSearchParams(body).toString()], {
|
|
|
|
// This content type is necessary for `sendBeacon`
|
|
|
|
type: 'application/x-www-form-urlencoded',
|
|
|
|
});
|
|
|
|
if (navigator.sendBeacon) {
|
|
|
|
navigator.sendBeacon(vitalsUrl, blob);
|
|
|
|
} else
|
|
|
|
fetch(vitalsUrl, {
|
|
|
|
body: blob,
|
|
|
|
method: 'POST',
|
|
|
|
credentials: 'omit',
|
|
|
|
keepalive: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
const reportWebVitals = () => {
|
|
|
|
try {
|
|
|
|
getFID(sendToVercelAnalytics);
|
|
|
|
getTTFB(sendToVercelAnalytics);
|
|
|
|
getLCP(sendToVercelAnalytics);
|
|
|
|
getCLS(sendToVercelAnalytics);
|
|
|
|
getFCP(sendToVercelAnalytics);
|
|
|
|
} catch (err) {
|
|
|
|
console.error('[Analytics]', err);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
export default reportWebVitals;
|