From b1dc621212c24fe568e605dcbe967f5440056c61 Mon Sep 17 00:00:00 2001 From: Harjeet Singh Date: Fri, 6 Jul 2018 10:59:31 -0700 Subject: [PATCH] mediatype is properly picked and stuff like uuid in uri is also properly handlled, --- demo/playground/hmr-playground.tsx | 9 ++-- src/components/Console/ConsoleViewer.tsx | 67 ++++++++++++++++++------ src/components/Endpoint/Endpoint.tsx | 3 ++ src/components/Fields/Field.tsx | 8 ++- src/components/Operation/Operation.tsx | 2 +- src/services/RedocNormalizedOptions.ts | 9 ++++ src/services/models/Field.ts | 7 ++- src/utils/fetch.ts | 2 +- 8 files changed, 84 insertions(+), 23 deletions(-) diff --git a/demo/playground/hmr-playground.tsx b/demo/playground/hmr-playground.tsx index 786b8ab3..a89f1755 100644 --- a/demo/playground/hmr-playground.tsx +++ b/demo/playground/hmr-playground.tsx @@ -22,13 +22,16 @@ const big = window.location.search.indexOf('big') > -1; const swagger = window.location.search.indexOf('swagger') > -1; // compatibility mode ? let specUrl = swagger ? 'swagger.yaml' : big ? 'big-openapi.json' : 'openapi.yaml'; -// specUrl = 'intent.json'; +specUrl = 'intent.json'; // specUrl = 'swagger.yaml'; -specUrl = 'petstore.json'; +// specUrl = 'petstore.json'; let store; -const options: RedocRawOptions = { nativeScrollbars: false, enableConsole: true, providedByName: 'Intent ApiDocs by Nutanix', providedByUri: 'http://www.nutanix.com' }; +const headers = { + 'x-nutanix-client': 'ui', +}; +const options: RedocRawOptions = { nativeScrollbars: false, enableConsole: true, providedByName: 'Intent ApiDocs by Nutanix', providedByUri: 'http://www.nutanix.com', additionalHeaders: headers }; async function init() { const spec = await loadAndBundleSpec(specUrl); diff --git a/src/components/Console/ConsoleViewer.tsx b/src/components/Console/ConsoleViewer.tsx index 161d3a4d..2f585ce1 100644 --- a/src/components/Console/ConsoleViewer.tsx +++ b/src/components/Console/ConsoleViewer.tsx @@ -2,7 +2,7 @@ import { observer } from 'mobx-react'; import * as React from 'react'; import { SendButton } from '../../common-elements/buttons'; import { ConsoleActionsRow } from '../../common-elements/panels'; -import { OperationModel } from '../../services/models'; +import { FieldModel, OperationModel } from '../../services/models'; import { OpenAPISchema } from '../../types'; import { PayloadSamples } from '../PayloadSamples/PayloadSamples'; import { SourceCodeWithCopy } from '../SourceCode/SourceCode'; @@ -12,6 +12,9 @@ const qs = require('qs'); export interface ConsoleViewerProps { operation: OperationModel; + additionalHeaders?: object; + queryParamPrefix?: string; + queryParamSuffix?: string; } export interface ConsoleViewerState { @@ -26,6 +29,7 @@ export interface Schema { @observer export class ConsoleViewer extends React.Component { operation: OperationModel; + additionalHeaders: object; visited = new Set(); private consoleEditor: ConsoleEditor; @@ -39,46 +43,77 @@ export class ConsoleViewer extends React.Component) { + const queryParamPrefix = '{'; + const queryParamSuffix = '}'; + + for (const fieldModel of params) { + console.log(fieldModel.name + ' ' + url); + console.log(fieldModel.$value); + if (url.indexOf(`${queryParamPrefix}${fieldModel.name}${queryParamSuffix}`) > -1 && fieldModel.$value.length > 0) { + url = url.replace(`${queryParamPrefix}${fieldModel.name}${queryParamSuffix}`, fieldModel.$value); + } + } + + if (url.split(queryParamPrefix).length > 1) { + console.error('** we have missing query params ** ', url); + throw Error(`** we have missing query params ** ${url}`); + } + + return url; }; - async invoke(endpoint, body) { - const headers = { 'Content-Type': 'application/json' }; + async invoke(endpoint, body, headers = {}) { try { - let url = endpoint.path; + const { operation } = this.props; + let url = this.addParamsToUrl(endpoint.path, operation.parameters || []); if (endpoint.method.toLocaleLowerCase() === 'get') { url = url + '?' + qs.stringify(body || ''); } - const myHeaders = new Headers(); - myHeaders.append('Content-Type', 'application/json'); + for (const [key, value] of Object.entries(headers)) { + myHeaders.append(key, `${value}`); + } const request = new Request(url, { method: endpoint.method, diff --git a/src/components/Endpoint/Endpoint.tsx b/src/components/Endpoint/Endpoint.tsx index 734fa32b..0615fb47 100644 --- a/src/components/Endpoint/Endpoint.tsx +++ b/src/components/Endpoint/Endpoint.tsx @@ -41,6 +41,9 @@ export class Endpoint extends React.Component { const { operation, inverted, hideHostname } = this.props; const { expanded } = this.state; + if (operation && operation.parameters && operation.parameters.length > 0) { + console.log('USER INPUT VALUE:: ' + operation.parameters[0]['$value']); + } // TODO: highlight server variables, e.g. https://{user}.test.com return ( diff --git a/src/components/Fields/Field.tsx b/src/components/Fields/Field.tsx index e2fc2979..158004d4 100644 --- a/src/components/Fields/Field.tsx +++ b/src/components/Fields/Field.tsx @@ -30,6 +30,12 @@ export class Field extends React.PureComponent { toggle = () => { this.props.field.toggle(); }; + + onFieldChange = (e) => { + console.log('Textfield value is ' + e.target.placeholder + ' - ' + e.target.value); + this.props.field.setValue(e.target.value); + }; + render() { const { className, field, isLast } = this.props; const { name, expanded, deprecated, required, kind } = field; @@ -63,7 +69,7 @@ export class Field extends React.PureComponent { {field && field.in === 'path' && - + } {field.expanded && diff --git a/src/components/Operation/Operation.tsx b/src/components/Operation/Operation.tsx index 1ee827f1..37e413c5 100644 --- a/src/components/Operation/Operation.tsx +++ b/src/components/Operation/Operation.tsx @@ -100,7 +100,7 @@ export class Operation extends React.Component { {!options.pathInMiddlePanel && } {executeMode &&
- +
} {!executeMode && diff --git a/src/services/RedocNormalizedOptions.ts b/src/services/RedocNormalizedOptions.ts index b1b427ff..8d0608a9 100644 --- a/src/services/RedocNormalizedOptions.ts +++ b/src/services/RedocNormalizedOptions.ts @@ -7,6 +7,7 @@ export interface RedocRawOptions { scrollYOffset?: number | string | (() => number); hideHostname?: boolean | string; enableConsole?: boolean; + additionalHeaders?: object; expandResponses?: string | 'all'; requiredPropsFirst?: boolean | string; noAutoAuth?: boolean | string; @@ -18,6 +19,8 @@ export interface RedocRawOptions { providedByName?: string; providedByUri?: string; + queryParamPrefix?: string; + queryParamSuffix?: string; unstable_ignoreMimeParameters?: boolean; } @@ -98,8 +101,11 @@ export class RedocNormalizedOptions { untrustedSpec: boolean; hideDownloadButton: boolean; enableConsole: boolean; + additionalHeaders: object; providedByName: string; providedByUri: string; + queryParamPrefix: string; + queryParamSuffix: string; /* tslint:disable-next-line */ unstable_ignoreMimeParameters: boolean; @@ -116,8 +122,11 @@ export class RedocNormalizedOptions { this.untrustedSpec = argValueToBoolean(raw.untrustedSpec); this.hideDownloadButton = argValueToBoolean(raw.hideDownloadButton); this.enableConsole = argValueToBoolean(raw.enableConsole); + this.additionalHeaders = raw.additionalHeaders || {}; this.providedByName = raw.providedByName || 'Documentation Powered by ReDoc'; this.providedByUri = raw.providedByUri || 'https://github.com/Rebilly/ReDoc'; + this.queryParamPrefix = raw.queryParamPrefix || '{'; + this.queryParamSuffix = raw.queryParamSuffix || '}'; this.unstable_ignoreMimeParameters = argValueToBoolean(raw.unstable_ignoreMimeParameters); } diff --git a/src/services/models/Field.ts b/src/services/models/Field.ts index b2405844..2cbf9e6b 100644 --- a/src/services/models/Field.ts +++ b/src/services/models/Field.ts @@ -11,7 +11,7 @@ import { SchemaModel } from './Schema'; */ export class FieldModel { @observable expanded: boolean = false; - + @observable $value: string = ''; schema: SchemaModel; name: string; required: boolean; @@ -46,4 +46,9 @@ export class FieldModel { toggle() { this.expanded = !this.expanded; } + + @action + setValue(value: string) { + this.$value = value; + } } diff --git a/src/utils/fetch.ts b/src/utils/fetch.ts index 835e785a..b332d125 100644 --- a/src/utils/fetch.ts +++ b/src/utils/fetch.ts @@ -1 +1 @@ -parseparseFetchFetch \ No newline at end of file +//parseparseFetchFetch \ No newline at end of file