Files
mcb-platform-monorepo/packages/sentry/ui/useSentry.ts
T
2025-11-25 09:43:22 +03:00

68 lines
2.7 KiB
TypeScript

import { useEffect } from 'react';
import { httpClientIntegration } from '@sentry/integrations';
import { init } from '@sentry/react';
import { beforeBreadcrumb, beforeSend, clientShutdown, customTransport, useToken, useSentryStore, sentryConfig } from '../model';
/**
* Инициализирует Sentry SDK и настраивает интеграции, transport и другие параметры.
*
* @param releaseVersion - Версия релиза приложения.
*/
const useSentry = (releaseVersion: string): void => {
const { token, attempts, isSendingAllowed, setState } = useSentryStore(state => ({
token: state.token,
attempts: state.attempts,
isSendingAllowed: state.isSendingAllowed,
setState: state.setState,
}));
const { dsn, enabledTokenGeneration, url } = sentryConfig;
// Признак активности механизма генерации токена для отправляемых данных
const isTokenGenerationAvailable = Boolean(enabledTokenGeneration && url);
// Включаем Sentry только в production среде и при доступности генерации токена.
const enabled = Boolean(process.env.NODE_ENV === 'production' && releaseVersion && isTokenGenerationAvailable);
const renewToken = useToken({ enabled, token, isSendingAllowed, attempts, setState });
useEffect(() => {
if (!enabled) return;
// Инициализация подключения к Sentry
init({
dsn,
integrations: [
httpClientIntegration({
// Логируем ошибки запросов с кодами ответов 400-599
failedRequestStatusCodes: [[400, 599]],
// Не логируем ошибки запросов к Sentry, если указан URL для генерации токена
failedRequestTargets: url ? [new RegExp(`^((?!${url}).)*$`)] : undefined,
}),
],
sendDefaultPii: true,
tracesSampleRate: 1.0,
release: releaseVersion,
environment: process.env.NODE_ENV,
ignoreErrors: [/ResizeObserver/],
transport: customTransport({
token,
attempts,
setState,
renewToken,
}),
// Коллбэк для обработки breadcrumbs перед отправкой в Sentry.
beforeBreadcrumb: (breadcrumb, hint) => beforeBreadcrumb(breadcrumb, hint, isSendingAllowed),
// Коллбэк для обработки событий перед отправкой в Sentry.
beforeSend: event => beforeSend(event, isSendingAllowed),
});
return () => {
// Завершение работы Sentry
clientShutdown();
};
}, [dsn, enabled, releaseVersion, renewToken, url]);
};
export { useSentry };