UNPKG

@carbon/react

Version:

React components for the Carbon Design System

68 lines (63 loc) 2.08 kB
/** * Copyright IBM Corp. 2016, 2023 * * This source code is licensed under the Apache-2.0 license found in the * LICENSE file in the root directory of this source tree. */ import { defineProperty as _defineProperty } from '../../_virtual/_rollupPluginBabelHelpers.js'; import React from 'react'; import PropTypes from 'prop-types'; import { ErrorBoundaryContext } from './ErrorBoundaryContext.js'; /** * React introduced additional lifecycle methods in v16 for capturing errors * that occur in a specific sub-tree of components. This component helps to * consolidate some of the duplication that occurs when using these lifecycle * methods across a codebase. In addition, it allows you to specify the fallback * UI to display when an error occurs in the sub-tree through the `fallback` * prop. * * This component roughly follows the React.js docs example code for these * methods. In addition, it takes advantage of an `ErrorBoundaryContext` so that * consumers can specify their own logic for logging errors. For example, * reporting an error in the UI to an external service for every `ErrorBoundary` * used. * * Reference: * https://reactjs.org/docs/error-boundaries.html#introducing-error-boundaries */ class ErrorBoundary extends React.Component { constructor(...args) { super(...args); _defineProperty(this, "context", void 0); _defineProperty(this, "state", { hasError: false }); } static getDerivedStateFromError() { return { hasError: true }; } componentDidCatch(error, info) { this.context.log(error, info); } componentDidUpdate(prevProps) { if (prevProps.children !== this.props.children) { this.setState({ hasError: false }); } } render() { if (this.state.hasError) { return this.props.fallback; } return this.props.children; } } _defineProperty(ErrorBoundary, "propTypes", { children: PropTypes.node, fallback: PropTypes.node }); _defineProperty(ErrorBoundary, "contextType", ErrorBoundaryContext); export { ErrorBoundary as default };