Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | import React from 'react';
import type {ChartKitError} from '../../libs';
import {CHARTKIT_ERROR_CODE} from '../../libs';
import type {ChartKitOnError, ChartKitType, ChartKitWidget, RenderError} from '../../types';
import {getErrorMessage} from '../../utils/getErrorMessage';
type Props = {
children: React.ReactNode;
onError?: ChartKitOnError;
data: ChartKitWidget[ChartKitType]['data'];
renderError?: RenderError;
};
type State = {
error?: ChartKitError | Error;
};
export class ErrorBoundary extends React.Component<Props, State> {
static getDerivedStateFromError(error: Error) {
return {error};
}
state: State = {
error: undefined,
};
componentDidUpdate(prevProps: Readonly<Props>) {
if (prevProps.data !== this.props.data) {
const {error} = this.state;
if (
error &&
'code' in error &&
[CHARTKIT_ERROR_CODE.NO_DATA, CHARTKIT_ERROR_CODE.INVALID_DATA].includes(
String(error.code),
)
) {
this.resetError();
}
}
}
componentDidCatch() {
const {error} = this.state;
if (error) {
this.props.onError?.({error});
}
}
render() {
const {error} = this.state;
if (error) {
const message = getErrorMessage(error);
if (this.props.renderError) {
return this.props.renderError({
error,
message,
resetError: this.resetError,
});
}
return <div>{message}</div>;
}
return this.props.children;
}
resetError = () => {
if (this.state.error) {
this.setState({error: undefined});
}
};
}
|