import type { ErrorInfo } from 'react' import type { Context } from '@datadog/js-core/util' import { clocksNow } from '@datadog/js-core/time' import { callMonitored } from '@datadog/js-core/monitor' import { createHandlingStack } from '@datadog/browser-core' import { onRumStart } from '../reactPlugin' /** * Add a React error to the RUM session. * * @category Error * @example * ```ts * import { createRoot } from 'react-dom/client' * import { datadogRum } from '@datadog/browser-rum' * import { addReactError } from '@datadog/browser-rum-react' * * const container = document.getElementById('root') * const root = createRoot(container, { * onUncaughtError: (error, errorInfo) => { * // Report uncaught errors to Datadog * addReactError(error, errorInfo) * } * }) * // ... * ``` */ export function addReactError(error: unknown, info: ErrorInfo) { const handlingStack = createHandlingStack('react error') const startClocks = clocksNow() onRumStart((addError) => { callMonitored(() => { addError({ error, handlingStack, componentStack: info.componentStack ?? undefined, startClocks, context: { ...(typeof error === 'object' && error !== null ? (error as { dd_context?: Context }).dd_context : undefined), framework: 'react', }, }) }) }) }