{"version":3,"file":"errorBoundary.mjs","names":[],"sources":["../../../../package/common/errorBoundary/errorBoundary.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { faTriangleExclamation, faArrowRotateRight } from '@fortawesome/free-solid-svg-icons';\n\nimport Button from '../button';\nimport Accordion from '../accordion';\nimport { showToast } from '../toast';\nimport CopyButton from '../copyButton';\nimport type { ErrorBoundaryLabels, ErrorBoundaryProps, ErrorBoundaryState } from './errorBoundary.types';\nimport styles from './errorBoundary.module.pcss';\nimport { ThemeColor } from '../themeProvider/color.types';\n\nconst DEFAULT_LABELS: Required<ErrorBoundaryLabels> = {\n  stackTrace: 'Stack trace',\n  copy: 'Copy',\n  copied: 'Copied',\n  reset: 'Try again',\n  copySuccessToast: 'Stack trace copied to clipboard',\n  copyErrorToast: 'Could not copy stack trace',\n};\n\nfunction formatStackTrace(error: Error, errorInfo: React.ErrorInfo | null): string {\n  const parts = [error.stack ?? `${error.name}: ${error.message}`];\n  if (errorInfo?.componentStack) parts.push(`Component stack:${errorInfo.componentStack}`);\n  return parts.join('\\n\\n');\n}\n\nclass ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n  state: ErrorBoundaryState = { error: null, errorInfo: null };\n\n  static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n    return { error };\n  }\n\n  componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n    this.setState({ errorInfo });\n    this.props.onError?.(error, errorInfo);\n  }\n\n  componentDidUpdate(prevProps: ErrorBoundaryProps): void {\n    if (!this.state.error) return;\n    const prevKeys = prevProps.resetKeys ?? [];\n    const nextKeys = this.props.resetKeys ?? [];\n    const changed = nextKeys.length !== prevKeys.length || nextKeys.some((key, i) => key !== prevKeys[i]);\n    if (changed) this.reset();\n  }\n\n  private reset = (): void => {\n    this.setState({ error: null, errorInfo: null });\n    this.props.onReset?.();\n  };\n\n  render(): React.ReactNode {\n    const { error, errorInfo } = this.state;\n    // onError/onReset/resetKeys are consumed elsewhere (getDerivedStateFromError,\n    // componentDidCatch, componentDidUpdate) and must not land on the root element via `rest`.\n    /* eslint-disable @typescript-eslint/no-unused-vars */\n    const {\n      children = null,\n      title = 'Something went wrong',\n      description,\n      labels: labelOverrides,\n      fallback,\n      hideStack = false,\n      className,\n      style,\n      classNames,\n      styles: slotStyles,\n      onError,\n      onReset,\n      resetKeys,\n      role = 'alert',\n      ...rest\n    } = this.props;\n\n    if (!error) return children;\n\n    const labels = { ...DEFAULT_LABELS, ...labelOverrides };\n\n    if (fallback) {\n      return typeof fallback === 'function' ? fallback({ error, errorInfo, resetErrorBoundary: this.reset }) : fallback;\n    }\n\n    return (\n      <div\n        {...rest}\n        role={role}\n        className={cx(styles.errorBoundary, className, classNames?.root)}\n        style={{ ...style, ...slotStyles?.root }}\n      >\n        <div className={cx(styles.errorBoundaryHeader, classNames?.header)} style={slotStyles?.header}>\n          <div className={cx(styles.errorBoundaryBadge, classNames?.badge)} style={slotStyles?.badge}>\n            <FontAwesomeIcon\n              icon={faTriangleExclamation}\n              className={cx(styles.errorBoundaryIcon, classNames?.icon)}\n              style={slotStyles?.icon as React.CSSProperties & Record<`--fa-font-${string}`, string>}\n            />\n          </div>\n          <div className={cx(styles.errorBoundaryTitle, classNames?.title)} style={slotStyles?.title}>\n            {title}\n          </div>\n          <div className={cx(styles.errorBoundaryDescription, classNames?.description)} style={slotStyles?.description}>\n            {description ?? error.message}\n          </div>\n        </div>\n\n        {!hideStack && (\n          <Accordion\n            title={labels.stackTrace}\n            className={cx(styles.errorBoundaryStack, classNames?.stack)}\n            style={slotStyles?.stack}\n          >\n            <div\n              className={cx(styles.errorBoundaryStackHeader, classNames?.stackHeader)}\n              style={slotStyles?.stackHeader}\n            >\n              <span\n                className={cx(styles.errorBoundaryStackLabel, classNames?.stackLabel)}\n                style={slotStyles?.stackLabel}\n              >\n                {error.name || 'Error'}\n              </span>\n              <CopyButton\n                value={formatStackTrace(error, errorInfo)}\n                labels={{ copy: labels.copy, copied: labels.copied }}\n                onCopy={() => showToast(labels.copySuccessToast, { color: ThemeColor.Success })}\n                onError={() => showToast(labels.copyErrorToast, { color: ThemeColor.Error })}\n                className={cx(styles.errorBoundaryCopyButton, classNames?.copyButton)}\n                style={slotStyles?.copyButton}\n              />\n            </div>\n            <pre className={cx(styles.errorBoundaryStackTrace, classNames?.stackTrace)} style={slotStyles?.stackTrace}>\n              {formatStackTrace(error, errorInfo)}\n            </pre>\n          </Accordion>\n        )}\n\n        <div className={cx(styles.errorBoundaryActions, classNames?.actions)} style={slotStyles?.actions}>\n          <Button\n            onClick={this.reset}\n            icon={faArrowRotateRight}\n            className={cx(styles.errorBoundaryResetButton, classNames?.resetButton)}\n            style={slotStyles?.resetButton}\n          >\n            {labels.reset}\n          </Button>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default ErrorBoundary;\n"],"mappings":"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"}