50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
|
import { useEffect } from 'react';
|
||
|
|
||
|
/** Hook to start Sentry. Should only be called once. */
|
||
|
function useSentry(dsn: string | undefined) {
|
||
|
useEffect(() => {
|
||
|
if (dsn) {
|
||
|
startSentry(dsn).catch(console.error);
|
||
|
}
|
||
|
}, [dsn]);
|
||
|
}
|
||
|
|
||
|
/** Start Sentry. */
|
||
|
async function startSentry(dsn: string): Promise<void> {
|
||
|
const [Sentry, { Integrations: Integrations }] = await Promise.all([
|
||
|
import('@sentry/react'),
|
||
|
import('@sentry/tracing'),
|
||
|
]);
|
||
|
|
||
|
Sentry.init({
|
||
|
dsn,
|
||
|
debug: false,
|
||
|
integrations: [new Integrations.BrowserTracing()],
|
||
|
|
||
|
// Filter events.
|
||
|
// https://docs.sentry.io/platforms/javascript/configuration/filtering/
|
||
|
ignoreErrors: [
|
||
|
// Network errors.
|
||
|
'AxiosError',
|
||
|
// sw.js couldn't be downloaded.
|
||
|
'Failed to update a ServiceWorker for scope',
|
||
|
// Useful for try/catch, useless as a Sentry error.
|
||
|
'AbortError',
|
||
|
// localForage error in FireFox private browsing mode (which doesn't support IndexedDB).
|
||
|
// We only use IndexedDB as a cache, so we can safely ignore the error.
|
||
|
'No available storage method found',
|
||
|
],
|
||
|
denyUrls: [
|
||
|
// Browser extensions.
|
||
|
/extensions\//i,
|
||
|
/^chrome:\/\//i,
|
||
|
/^moz-extension:\/\//i,
|
||
|
],
|
||
|
|
||
|
// We recommend adjusting this value in production, or using tracesSampler
|
||
|
// for finer control
|
||
|
tracesSampleRate: 1.0,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export { useSentry };
|