{"version":3,"file":"QueryErrorBoundary.mjs","sources":["../../../src/lib/monitoring/QueryErrorBoundary.tsx"],"sourcesContent":["/* @refresh reset */\n/**\n * @file Query Error Boundary\n * @description Boundary specifically for data-fetch errors\n */\n\n/* eslint-disable react-refresh/only-export-components */\n\nimport React, { Component, type ErrorInfo, type ReactNode } from 'react';\nimport { ErrorReporter } from './ErrorReporter';\nimport type { AppError } from './errorTypes';\nimport { normalizeError, getUserFriendlyMessage, isRetryableError } from './errorTypes';\n\n/**\n * Query error boundary props\n */\nexport interface QueryErrorBoundaryProps {\n  children: ReactNode;\n  fallback?: ReactNode | ((props: QueryErrorFallbackProps) => ReactNode);\n  onError?: (error: AppError) => void;\n  onRetry?: () => void;\n  queryKey?: string;\n}\n\n/**\n * Query error fallback props\n */\nexport interface QueryErrorFallbackProps {\n  error: AppError;\n  reset: () => void;\n  retry: () => void;\n  isRetryable: boolean;\n}\n\n/**\n * Query error boundary state\n */\ninterface QueryErrorBoundaryState {\n  hasError: boolean;\n  error: AppError | null;\n}\n\n/**\n * Default query error fallback UI\n */\nfunction DefaultQueryErrorFallback({\n  error,\n  reset,\n  retry,\n  isRetryable,\n}: QueryErrorFallbackProps): React.ReactElement {\n  return (\n    <div\n      role=\"alert\"\n      style={{\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center',\n        padding: '2rem',\n        textAlign: 'center',\n        backgroundColor: '#fff7ed',\n        borderRadius: '0.5rem',\n        border: '1px solid #fed7aa',\n      }}\n    >\n      <svg\n        style={{\n          width: '3rem',\n          height: '3rem',\n          color: '#f97316',\n          marginBottom: '1rem',\n        }}\n        fill=\"none\"\n        viewBox=\"0 0 24 24\"\n        stroke=\"currentColor\"\n      >\n        <path\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          strokeWidth={2}\n          d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n        />\n      </svg>\n\n      <h2\n        style={{\n          fontSize: '1.125rem',\n          fontWeight: '600',\n          color: '#c2410c',\n          marginBottom: '0.5rem',\n        }}\n      >\n        Failed to load data\n      </h2>\n\n      <p\n        style={{\n          color: '#9a3412',\n          marginBottom: '1rem',\n          fontSize: '0.875rem',\n        }}\n      >\n        {getUserFriendlyMessage(error)}\n      </p>\n\n      <div style={{ display: 'flex', gap: '0.5rem' }}>\n        {isRetryable && (\n          <button\n            onClick={retry}\n            style={{\n              padding: '0.5rem 1rem',\n              backgroundColor: '#f97316',\n              color: 'white',\n              border: 'none',\n              borderRadius: '0.375rem',\n              cursor: 'pointer',\n              fontWeight: '500',\n              fontSize: '0.875rem',\n            }}\n          >\n            Retry\n          </button>\n        )}\n\n        <button\n          onClick={reset}\n          style={{\n            padding: '0.5rem 1rem',\n            backgroundColor: 'white',\n            color: '#c2410c',\n            border: '1px solid #fed7aa',\n            borderRadius: '0.375rem',\n            cursor: 'pointer',\n            fontWeight: '500',\n            fontSize: '0.875rem',\n          }}\n        >\n          Dismiss\n        </button>\n      </div>\n    </div>\n  );\n}\n\n/**\n * Query error boundary component\n */\nexport class QueryErrorBoundary extends Component<\n  QueryErrorBoundaryProps,\n  QueryErrorBoundaryState\n> {\n  constructor(props: QueryErrorBoundaryProps) {\n    super(props);\n    this.state = { hasError: false, error: null };\n  }\n\n  static getDerivedStateFromError(error: Error): QueryErrorBoundaryState {\n    const appError = normalizeError(error);\n    return { hasError: true, error: appError };\n  }\n\n  override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n    const appError = normalizeError(error);\n\n    // Report to error monitoring\n    ErrorReporter.reportError(error, {\n      action: 'query_error',\n      metadata: {\n        queryKey: this.props.queryKey,\n        componentStack: errorInfo.componentStack,\n      },\n    });\n\n    // Call custom error handler\n    this.props.onError?.(appError);\n  }\n\n  handleReset = (): void => {\n    this.setState({ hasError: false, error: null });\n  };\n\n  handleRetry = (): void => {\n    this.setState({ hasError: false, error: null });\n    this.props.onRetry?.();\n  };\n\n  override render(): ReactNode {\n    const { hasError, error } = this.state;\n    const { children, fallback } = this.props;\n\n    if (hasError && error) {\n      const fallbackProps: QueryErrorFallbackProps = {\n        error,\n        reset: this.handleReset,\n        retry: this.handleRetry,\n        isRetryable: isRetryableError(error),\n      };\n\n      if (typeof fallback === 'function') {\n        return fallback(fallbackProps);\n      }\n\n      if (fallback != null) {\n        return fallback;\n      }\n\n      return <DefaultQueryErrorFallback {...fallbackProps} />;\n    }\n\n    return children;\n  }\n}\n\n/**\n * Hook-based error boundary wrapper for functional components\n */\nexport function withQueryErrorBoundary<P extends object>(\n  Component: React.ComponentType<P>,\n  boundaryProps?: Omit<QueryErrorBoundaryProps, 'children'>\n): React.FC<P> {\n  return function WrappedComponent(props: P) {\n    return (\n      <QueryErrorBoundary {...boundaryProps}>\n        <Component {...props} />\n      </QueryErrorBoundary>\n    );\n  };\n}\n"],"names":["DefaultQueryErrorFallback","error","reset","retry","isRetryable","jsxs","jsx","QueryErrorBoundary","Component","props","normalizeError","errorInfo","appError","ErrorReporter","hasError","children","fallback","fallbackProps","isRetryableError","withQueryErrorBoundary","boundaryProps"],"mappings":"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"}