import React, {PropTypes, PureComponent} from 'react'; import autobind from 'autobind-decorator'; import {Tab, TabList, TabPanel, Tabs} from 'react-tabs'; import ContentTypeDropdown from './dropdowns/content-type-dropdown'; import AuthDropdown from './dropdowns/auth-dropdown'; import KeyValueEditor from './key-value-editor/editor'; import RequestHeadersEditor from './editors/request-headers-editor'; import RenderedQueryString from './rendered-query-string'; import BodyEditor from './editors/body/body-editor'; import AuthWrapper from './editors/auth/auth-wrapper'; import RequestUrlBar from './request-url-bar.js'; import {getAuthTypeName, getContentTypeName} from '../../common/constants'; import {debounce} from '../../common/misc'; import {trackEvent} from '../../analytics/index'; import * as querystring from '../../common/querystring'; import * as db from '../../common/database'; import * as models from '../../models'; import Hotkey from './hotkey'; import {showModal} from './modals/index'; import RequestSettingsModal from './modals/request-settings-modal'; import MarkdownPreview from './markdown-preview'; @autobind class RequestPane extends PureComponent { constructor (props) { super(props); this._handleUpdateRequestUrl = debounce(this._handleUpdateRequestUrl); } _handleEditDescriptionAdd () { this._handleEditDescription(true); } _handleEditDescription (addDescription) { showModal(RequestSettingsModal, { request: this.props.request, forceEditMode: addDescription }); } async _autocompleteUrls () { const docs = await db.withDescendants( this.props.workspace, models.request.type ); const requestId = this.props.request ? this.props.request._id : 'n/a'; const urls = docs.filter(d => ( d.type === models.request.type && // Only requests d._id !== requestId && // Not current request d.url // Only ones with non-empty URLs )).map(r => r.url); return Array.from(new Set(urls)); } _handleUpdateSettingsUseBulkHeaderEditor () { const {useBulkHeaderEditor, updateSettingsUseBulkHeaderEditor} = this.props; updateSettingsUseBulkHeaderEditor(!useBulkHeaderEditor); trackEvent('Headers', 'Toggle Bulk', !useBulkHeaderEditor ? 'On' : 'Off'); } _handleImportFile () { this.props.handleImportFile(); trackEvent('Request Pane', 'CTA', 'Import'); } _handleCreateRequest () { this.props.handleCreateRequest(this.props.request); trackEvent('Request Pane', 'CTA', 'New Request'); } _handleUpdateRequestUrl (url) { this.props.updateRequestUrl(url); } _handleImportQueryFromUrl () { const {request} = this.props; let query; try { query = querystring.extractFromUrl(request.url); } catch (e) { console.warn('Failed to parse url to import querystring'); return; } // Remove the search string (?foo=bar&...) from the Url const url = request.url.replace(query, ''); const parameters = [ ...request.parameters, ...querystring.deconstructToParams(query) ]; // Only update if url changed if (url !== request.url) { this.props.forceUpdateRequest({url, parameters}); } } _trackQueryToggle (pair) { trackEvent('Query', 'Toggle', pair.disabled ? 'Disable' : 'Enable'); } _trackQueryCreate () { trackEvent('Query', 'Create'); } _trackQueryDelete () { trackEvent('Query', 'Delete'); } _trackTabBody () { trackEvent('Request Pane', 'View', 'Body'); } _trackTabHeaders () { trackEvent('Request Pane', 'View', 'Headers'); } _trackTabDescription () { trackEvent('Request Pane', 'View', 'Description'); } _trackTabAuthentication () { trackEvent('Request Pane', 'View', 'Authentication'); } _trackTabQuery () { trackEvent('Request Pane', 'View', 'Query'); } render () { const { editorFontSize, editorIndentSize, editorKeyMap, editorLineWrapping, forceRefreshCounter, handleGenerateCode, handleGetRenderContext, handleImport, handleRender, handleSend, handleSendAndDownload, oAuth2Token, request, showPasswords, updateRequestAuthentication, updateRequestBody, updateRequestHeaders, updateRequestMethod, updateRequestMimeType, updateRequestParameters, updateSettingsShowPasswords, useBulkHeaderEditor } = this.props; if (!request) { return (
New Request
Switch Requests
Edit Environments
); } let numBodyParams = 0; if (request.body && request.body.params) { numBodyParams = request.body.params.filter(p => !p.disabled).length; } const numParameters = request.parameters.filter(p => !p.disabled).length; const numHeaders = request.headers.filter(h => !h.disabled).length; const urlHasQueryParameters = request.url.indexOf('?') >= 0; const uniqueKey = `${forceRefreshCounter}::${request._id}`; return (
{getContentTypeName(request.body.mimeType) || 'Body'} {numBodyParams ? {numBodyParams} : null} {getAuthTypeName(request.authentication.type) || 'Auth'}
{request.description ? (
) : (



)}
); } } RequestPane.propTypes = { // Functions forceUpdateRequest: PropTypes.func.isRequired, handleSend: PropTypes.func.isRequired, handleSendAndDownload: PropTypes.func.isRequired, handleCreateRequest: PropTypes.func.isRequired, handleGenerateCode: PropTypes.func.isRequired, handleRender: PropTypes.func.isRequired, handleGetRenderContext: PropTypes.func.isRequired, updateRequestUrl: PropTypes.func.isRequired, updateRequestMethod: PropTypes.func.isRequired, updateRequestBody: PropTypes.func.isRequired, updateRequestParameters: PropTypes.func.isRequired, updateRequestAuthentication: PropTypes.func.isRequired, updateRequestHeaders: PropTypes.func.isRequired, updateRequestMimeType: PropTypes.func.isRequired, updateSettingsShowPasswords: PropTypes.func.isRequired, updateSettingsUseBulkHeaderEditor: PropTypes.func.isRequired, handleImport: PropTypes.func.isRequired, handleImportFile: PropTypes.func.isRequired, // Other useBulkHeaderEditor: PropTypes.bool.isRequired, showPasswords: PropTypes.bool.isRequired, editorFontSize: PropTypes.number.isRequired, editorIndentSize: PropTypes.number.isRequired, editorKeyMap: PropTypes.string.isRequired, editorLineWrapping: PropTypes.bool.isRequired, workspace: PropTypes.object.isRequired, forceRefreshCounter: PropTypes.number.isRequired, // Optional request: PropTypes.object, oAuth2Token: PropTypes.object }; export default RequestPane;