Skip to content

Commit

Permalink
fix(refactor): refactor error boundary
Browse files Browse the repository at this point in the history
Signed-off-by: Sudhanshu Dasgupta <[email protected]>
  • Loading branch information
sudhanshutech committed Nov 15, 2023
1 parent 7e32aa5 commit 797122f
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 70 deletions.
3 changes: 2 additions & 1 deletion packages/components/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
"lint:fix": "eslint --fix"
},
"dependencies": {
"@layer5/sistent-svg": "^0.14.0"
"@layer5/sistent-svg": "^0.14.0",
"react-error-boundary": "^4.0.11"
},
"devDependencies": {
"@emotion/react": "^11.11.1",
Expand Down
126 changes: 58 additions & 68 deletions packages/components/src/custom/ErrorBoundary/ErrorBoundary.tsx
Original file line number Diff line number Diff line change
@@ -1,88 +1,78 @@
/*
import {
ErrorBoundaryProps,
FallbackProps,
ErrorBoundary as ReactErrorBoundary
} from 'react-error-boundary';
import React, { ComponentType, ReactNode } from 'react';
import { FallbackProps, ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary';
import { Button } from '../../base/Button';
import React from 'react';

function Fallback({ error, resetErrorBoundary }: FallbackProps): JSX.Element {
if (error instanceof Error) {
// Check if error is an instance of Error
return (
<div role="alert">
<h2>Uh-oh!😔 Please pardon the mesh.</h2>
<div
style={{
backgroundColor: '#1E2117',
color: '#FFFFFF',
padding: '.85rem',
borderRadius: '.2rem',
marginBlock: '.5rem'
}}
>
<code>{error.message}</code>
</div>
<Button color="primary" variant="contained" onClick={resetErrorBoundary}>
Try again
</Button>
</div>
);
} else {
// Handle the case where error is not an instance of Error
return (
<div role="alert">
<h2>Uh-oh!😔 An unknown error occurred.</h2>
<Button color="primary" variant="contained" onClick={resetErrorBoundary}>
Try again
</Button>
interface FallbackComponentProps extends FallbackProps {
resetErrorBoundary: () => void;
}

function Fallback({ error, resetErrorBoundary }: FallbackComponentProps): JSX.Element {
return (
<div role="alert">
<h2>Uh-oh!😔 Please pardon the mesh.</h2>
<div
style={{
backgroundColor: '#1E2117',
color: '#FFFFFF',
padding: '.85rem',
borderRadius: '.2rem',
marginBlock: '.5rem'
}}
>
<code>{(error as Error).message}</code>
</div>
);
}
<Button color="primary" variant="contained" onClick={resetErrorBoundary}>
Try again
</Button>
</div>
);
}

function reportError(error: Error, info: React.ErrorInfo): void {
// This is where you'd send the error to Sentry, etc.
const reportError = (error: Error, info: { componentStack: string }): void => {
// This is where you'd send the error to Sentry, etc
console.log('Error Caught Inside Boundary --reportError', error, 'Info', info);
};

interface ErrorBoundaryProps {
children: ReactNode;
}

function ErrorBoundary({ children, ...props }: ErrorBoundaryProps): JSX.Element {
export const ErrorBoundary: React.FC<ErrorBoundaryProps> = ({ children }) => {
return (
<ReactErrorBoundary FallbackComponent={Fallback} onError={reportError} {...props}>
<ReactErrorBoundary FallbackComponent={Fallback} onError={reportError}>
{children}
</ReactErrorBoundary>
);
}
function withErrorBoundary<P extends object>(
Component: React.ComponentType<P>,
errorHandlingProps: ErrorBoundaryProps | null
): JSX.Element {
const WrappedWithErrorBoundary = (props: P): JSX.Element => (
<ErrorBoundary {...(errorHandlingProps ? errorHandlingProps : {})}>
<Component {...props} />
</ErrorBoundary>
);
return WrappedWithErrorBoundary;
}
};

interface Props {
children: React.ReactNode;
interface WithErrorBoundaryProps {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Component: ComponentType<any>;
errorHandlingProps?: ErrorBoundaryProps;
}

function withSuppressedErrorBoundary<P extends object>(
Component: React.ComponentType<P>
): JSX.Element {
const WrappedWithErrorBoundary = (props: P & Props): JSX.Element => (
<ErrorBoundary FallbackComponent={() => null}>
<Component {...props} />
export const WithErrorBoundary: React.FC<WithErrorBoundaryProps> = ({
Component,
errorHandlingProps = { children: null }
}: WithErrorBoundaryProps): JSX.Element => {
return (
<ErrorBoundary {...errorHandlingProps}>
<Component />
</ErrorBoundary>
);
};

return WrappedWithErrorBoundary;
interface WithSuppressedErrorBoundaryProps {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
Component: ComponentType<any>;
}

export { ErrorBoundary, withErrorBoundary, withSuppressedErrorBoundary };
*/
export const withSuppressedErrorBoundary: React.FC<WithSuppressedErrorBoundaryProps> = ({
Component
}: WithSuppressedErrorBoundaryProps): JSX.Element => {
return (
<ReactErrorBoundary FallbackComponent={Fallback} onError={reportError}>
<Component />
</ReactErrorBoundary>
);
};
2 changes: 1 addition & 1 deletion packages/components/src/custom/ErrorBoundary/index.tsx
Original file line number Diff line number Diff line change
@@ -1 +1 @@
// export { ErrorBoundary, withErrorBoundary, withSuppressedErrorBoundary } from './ErrorBoundary';
export { ErrorBoundary, WithErrorBoundary, withSuppressedErrorBoundary } from './ErrorBoundary';

0 comments on commit 797122f

Please sign in to comment.