bigbuffet-rw/app/soapbox/components/error_boundary.js

92 lines
2.4 KiB
JavaScript
Raw Normal View History

2020-03-27 13:59:38 -07:00
import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
export default class ErrorBoundary extends React.PureComponent {
static propTypes = {
children: PropTypes.node,
};
state = {
hasError: false,
componentStack: undefined,
}
componentDidCatch(error, info) {
this.setState({
hasError: true,
error,
2020-03-27 13:59:38 -07:00
componentStack: info && info.componentStack,
});
}
setTextareaRef = c => {
this.textarea = c;
}
handleCopy = e => {
if (!this.textarea) return;
this.textarea.select();
this.textarea.setSelectionRange(0, 99999);
document.execCommand('copy');
}
getErrorText = () => {
const { error, componentStack } = this.state;
return error + componentStack;
}
clearCookies = e => {
localStorage.clear();
sessionStorage.clear();
}
2020-03-27 13:59:38 -07:00
render() {
const { hasError } = this.state;
if (!hasError) {
return this.props.children;
}
const errorText = this.getErrorText();
2020-03-27 13:59:38 -07:00
return (
<div className='error-boundary'>
<div>
<i className='fa fa-frown-o' aria-hidden='true' />
2020-03-27 13:59:38 -07:00
<FormattedMessage id='alert.unexpected.message' defaultMessage='An unexpected error occurred.' />
<a href='/' className='return-home'>
<i className='fa fa-reply' aria-hidden='true' />&nbsp;
<FormattedMessage id='alert.unexpected.return_home' defaultMessage='Return Home' />
</a>
{errorText && <textarea
ref={this.setTextareaRef}
className='error-boundary__component-stack'
value={errorText}
onClick={this.handleCopy}
readOnly
/>}
<p className='help-text'>
<FormattedMessage
id='alert.unexpected.help_text'
defaultMessage='If the problem persists, please notify a site admin with a screenshot and information about your web browser. You may also {clear_cookies} (this will log you out).'
values={{ clear_cookies: (
<a href='/' onClick={this.clearCookies}>
<FormattedMessage
id='alert.unexpected.clear_cookies'
defaultMessage='clear cookies and browser data'
/>
</a>
) }}
/>
</p>
2020-03-27 13:59:38 -07:00
</div>
</div>
);
}
}