PromucFlow_constructor/app/client/src/AppErrorBoundry.tsx
2020-12-24 10:02:25 +05:30

73 lines
1.6 KiB
TypeScript

import React, { Component } from "react";
import styled from "styled-components";
import AppCrashImage from "assets/images/404-image.png";
import * as Sentry from "@sentry/react";
import log from "loglevel";
const Wrapper = styled.div`
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
height: calc(100vh - ${(props) => props.theme.headerHeight});
.bold-text {
font-weight: ${(props) => props.theme.fontWeights[3]};
font-size: 24px;
}
.page-unavailable-img {
width: 35%;
}
.button-position {
margin: auto;
}
`;
const RetryButton = styled.button`
background-color: #f3672a;
color: white;
height: 40px;
width: 300px;
border: none;
cursor: pointer;
font-weight: 600;
font-size: 17px;
`;
class AppErrorBoundary extends Component {
state = {
hasError: false,
};
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
log.error({ error, errorInfo });
Sentry.captureException(error);
this.setState({
hasError: true,
});
}
render() {
if (this.state.hasError) {
return (
<Wrapper>
<img src={AppCrashImage} alt="App crashed" />
<div>
<p className="bold-text">Oops! Something went wrong</p>
<p>
Please try again using the button below. <br />
If the issue persists, please contact us
</p>
<RetryButton onClick={() => window.location.reload()}>
{"Retry"}
</RetryButton>
</div>
</Wrapper>
);
}
return this.props.children;
}
}
export default AppErrorBoundary;