import { jsx as _jsx } from "react/jsx-runtime";
import React from 'react';
import { InternalErrorPlaceholder } from '../placeholders/InternalErrorPlaceholder';
import { OutdatedReleasePlaceholder } from '../placeholders/OutdatedReleasePlaceholder';
import { ErrorService } from '../services/ErrorService';
import { CONDITION_TYPE_ERROR } from './constants';
import { ErrorBoundaryTypeError } from './enums';
/**
 * Отображение при определенной ошибке
 */
const PLACEHOLDER_TYPE_ERROR = {
    [ErrorBoundaryTypeError.OutdatedRelease]: _jsx(OutdatedReleasePlaceholder, {}),
    [ErrorBoundaryTypeError.Default]: _jsx(InternalErrorPlaceholder, {}),
};
/**
 * Компонент, который перехватывает ошибки в обернутых в него компонентах.
 * При перехвате ошибки осуществляется ее отправка в captureException
 * @example <ErrorBoundary><InsecureComponent/></ErrorBoundary>
 */
class ErrorBoundary extends React.Component {
    constructor() {
        super(...arguments);
        this.state = {
            hasError: false,
            typeError: ErrorBoundaryTypeError.Default,
        };
    }
    componentDidCatch(error) {
        ErrorService.getInstance().captureException(error);
    }
    render() {
        if (this.state.hasError) {
            return PLACEHOLDER_TYPE_ERROR[this.state.typeError];
        }
        return this.props.children;
    }
    static getDerivedStateFromError(error) {
        return {
            hasError: true,
            typeError: CONDITION_TYPE_ERROR.find(({ condition }) => condition(error))?.type ??
                ErrorBoundaryTypeError.Default,
        };
    }
}
export { ErrorBoundary };
