63 lines
1.4 KiB
JavaScript
63 lines
1.4 KiB
JavaScript
const React = require("react");
|
|
const { ScreenErrorBoundary } = require("../common");
|
|
const { enhanceError, logError } = require("../../utils/errorHandler");
|
|
|
|
/**
|
|
* Higher-order component that wraps screens with error boundaries
|
|
* Requirements: 4.5, 16.1
|
|
*/
|
|
function withErrorBoundary(
|
|
WrappedComponent,
|
|
screenName,
|
|
screenSpecificTips = []
|
|
) {
|
|
const WrappedScreenComponent = (props) => {
|
|
const handleError = (error, errorInfo) => {
|
|
// Log the error with screen context
|
|
logError(error, {
|
|
screen: screenName,
|
|
errorInfo,
|
|
props: Object.keys(props),
|
|
});
|
|
};
|
|
|
|
const handleRetry = (retryCount) => {
|
|
console.info(`Retrying ${screenName}, attempt ${retryCount}`);
|
|
};
|
|
|
|
const handleReset = () => {
|
|
console.info(`Resetting ${screenName} after error`);
|
|
};
|
|
|
|
const handleExit = () => {
|
|
// Navigate back to main menu
|
|
if (props.navigateBack) {
|
|
props.navigateBack();
|
|
} else if (props.onExit) {
|
|
props.onExit();
|
|
}
|
|
};
|
|
|
|
return React.createElement(
|
|
ScreenErrorBoundary,
|
|
{
|
|
screenName,
|
|
screenSpecificTips,
|
|
onError: handleError,
|
|
onRetry: handleRetry,
|
|
onReset: handleReset,
|
|
onExit: handleExit,
|
|
maxRetries: 3,
|
|
},
|
|
React.createElement(WrappedComponent, props)
|
|
);
|
|
};
|
|
|
|
// Set display name for debugging
|
|
WrappedScreenComponent.displayName = `withErrorBoundary(${screenName})`;
|
|
|
|
return WrappedScreenComponent;
|
|
}
|
|
|
|
module.exports = withErrorBoundary;
|