misc_pterodactyl-panel/resources/scripts/components/elements/ErrorBoundary.tsx

47 lines
1.2 KiB
TypeScript
Raw Normal View History

2022-11-25 20:25:03 +00:00
import { faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
import type { ReactNode } from 'react';
import { Component } from 'react';
import tw from 'twin.macro';
2022-11-25 20:25:03 +00:00
import Icon from '@/components/elements/Icon';
2022-11-25 20:25:03 +00:00
interface Props {
children?: ReactNode;
}
interface State {
hasError: boolean;
}
2022-11-25 20:25:03 +00:00
class ErrorBoundary extends Component<Props, State> {
override state: State = {
hasError: false,
};
static getDerivedStateFromError() {
return { hasError: true };
}
2022-11-25 20:25:03 +00:00
override componentDidCatch(error: Error) {
console.error(error);
}
2022-11-25 20:25:03 +00:00
override render() {
return this.state.hasError ? (
<div css={tw`flex items-center justify-center w-full my-4`}>
<div css={tw`flex items-center bg-neutral-900 rounded p-3 text-red-500`}>
<Icon icon={faExclamationTriangle} css={tw`h-4 w-auto mr-2`} />
2022-11-25 20:25:03 +00:00
<p css={tw`text-sm text-neutral-100`}>
An error was encountered by the application while rendering this view. Try refreshing the page.
</p>
</div>
</div>
) : (
this.props.children
);
}
}
export default ErrorBoundary;