insomnia/packages/insomnia-app/app/ui/components/modals/request-render-error-modal.js
2018-12-12 12:36:11 -05:00

96 lines
2.5 KiB
JavaScript

import React, { PureComponent } from 'react';
import autobind from 'autobind-decorator';
import jq from 'jsonpath';
import RequestSettingsModal from '../modals/request-settings-modal';
import Modal from '../base/modal';
import ModalBody from '../base/modal-body';
import ModalHeader from '../base/modal-header';
import { showModal } from './index';
import Link from '../base/link';
@autobind
class RequestRenderErrorModal extends PureComponent {
constructor(props) {
super(props);
this.state = {
error: null,
};
}
_setModalRef(n) {
this.modal = n;
}
_handleShowRequestSettings() {
this.hide();
showModal(RequestSettingsModal, { request: this.state.request });
}
show({ request, error }) {
this.setState({ request, error });
this.modal.show();
}
hide() {
this.modal.hide();
}
renderModalBody(request, error) {
const fullPath = `Request.${error.path}`;
const result = jq.query(request, `$.${error.path}`);
const template = result && result.length ? result[0] : null;
const locationLabel =
template && template.includes('\n') ? `line ${error.location.line} of` : null;
return (
<div className="pad">
<div className="notice warning">
<p>
Failed to render <strong>{fullPath}</strong> prior to sending
</p>
<div className="pad-top-sm">
{error.path.match(/^body/) && (
<button
className="btn btn--clicky margin-right-sm"
onClick={this._handleShowRequestSettings}>
Adjust Render Settings
</button>
)}
<Link
button
href="https://support.insomnia.rest/article/40-template-tags"
className="btn btn--clicky">
Templating Documentation <i className="fa fa-external-link" />
</Link>
</div>
</div>
<p>
<strong>Render error</strong>
<code className="block selectable">{error.message}</code>
</p>
<p>
<strong>Caused by the following field</strong>
<code className="block">
{locationLabel} {fullPath}
</code>
</p>
</div>
);
}
render() {
const { request, error } = this.state;
return (
<Modal ref={this._setModalRef} freshState>
<ModalHeader>Failed to Render Request</ModalHeader>
<ModalBody>{request && error ? this.renderModalBody(request, error) : null}</ModalBody>
</Modal>
);
}
}
export default RequestRenderErrorModal;