@grafana/ui
Version:
Grafana Components Library
1 lines • 6.89 kB
Source Map (JSON)
{"version":3,"file":"ErrorBoundary.mjs","sources":["../../../../src/components/ErrorBoundary/ErrorBoundary.tsx"],"sourcesContent":["import { PureComponent, ReactNode, ComponentType, ErrorInfo } from 'react';\n\nimport { faro } from '@grafana/faro-web-sdk';\n\nimport { Alert } from '../Alert/Alert';\n\nimport { ErrorWithStack } from './ErrorWithStack';\n\nexport type { ErrorInfo };\n\nexport interface ErrorBoundaryApi {\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\ninterface Props {\n children: (r: ErrorBoundaryApi) => ReactNode;\n /** Will re-render children after error if recover values changes */\n dependencies?: unknown[];\n /** Callback called on error */\n onError?: (error: Error) => void;\n /** Callback error state is cleared due to recover props change */\n onRecover?: () => void;\n /** Default error logger - Faro by default */\n errorLogger?: (error: Error) => void;\n}\n\ninterface State {\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\nexport class ErrorBoundary extends PureComponent<Props, State> {\n readonly state: State = {\n error: null,\n errorInfo: null,\n };\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n const logger = this.props.errorLogger ?? faro?.api?.pushError;\n\n if (logger) {\n logger(error);\n }\n\n this.setState({ error, errorInfo });\n\n if (this.props.onError) {\n this.props.onError(error);\n }\n }\n\n componentDidUpdate(prevProps: Props) {\n const { dependencies, onRecover } = this.props;\n\n if (this.state.error) {\n if (dependencies && prevProps.dependencies) {\n for (let i = 0; i < dependencies.length; i++) {\n if (dependencies[i] !== prevProps.dependencies[i]) {\n this.setState({ error: null, errorInfo: null });\n if (onRecover) {\n onRecover();\n }\n break;\n }\n }\n }\n }\n }\n\n render() {\n const { children } = this.props;\n const { error, errorInfo } = this.state;\n\n return children({\n error,\n errorInfo,\n });\n }\n}\n\n/**\n * Props for the ErrorBoundaryAlert component\n *\n * @public\n */\nexport interface ErrorBoundaryAlertProps {\n /** Title for the error boundary alert */\n title?: string;\n\n /** Component to be wrapped with an error boundary */\n children: ReactNode;\n\n /** 'page' will render full page error with stacktrace. 'alertbox' will render an <Alert />. Default 'alertbox' */\n style?: 'page' | 'alertbox';\n\n /** Will re-render children after error if recover values changes */\n dependencies?: unknown[];\n /** Default error logger - Faro by default */\n errorLogger?: (error: Error) => void;\n}\n\nexport class ErrorBoundaryAlert extends PureComponent<ErrorBoundaryAlertProps> {\n static defaultProps: Partial<ErrorBoundaryAlertProps> = {\n title: 'An unexpected error happened',\n style: 'alertbox',\n };\n\n render() {\n const { title, children, style, dependencies, errorLogger } = this.props;\n\n return (\n <ErrorBoundary dependencies={dependencies} errorLogger={errorLogger}>\n {({ error, errorInfo }) => {\n if (!errorInfo) {\n return children;\n }\n\n if (style === 'alertbox') {\n return (\n <Alert title={title || ''}>\n <details style={{ whiteSpace: 'pre-wrap' }}>\n {error && error.toString()}\n <br />\n {errorInfo.componentStack}\n </details>\n </Alert>\n );\n }\n\n return <ErrorWithStack title={title || ''} error={error} errorInfo={errorInfo} />;\n }}\n </ErrorBoundary>\n );\n }\n}\n\n/**\n * HOC for wrapping a component in an error boundary.\n *\n * @param Component - the react component to wrap in error boundary\n * @param errorBoundaryProps - error boundary options\n *\n * @public\n */\nexport function withErrorBoundary<P extends {} = {}>(\n Component: ComponentType<P>,\n errorBoundaryProps: Omit<ErrorBoundaryAlertProps, 'children'> = {}\n): ComponentType<P> {\n const comp = (props: P) => (\n <ErrorBoundaryAlert {...errorBoundaryProps}>\n <Component {...props} />\n </ErrorBoundaryAlert>\n );\n comp.displayName = 'WithErrorBoundary';\n\n return comp;\n}\n"],"names":[],"mappings":"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"}