From 448b1b48c8f5ae82af2b66156458f26f7aba5736 Mon Sep 17 00:00:00 2001 From: Roman Hotsiy Date: Thu, 12 Dec 2019 18:37:47 +0200 Subject: [PATCH] chore: refactor request samples --- .../RequestSamples/RequestSamples.tsx | 29 +++++++---------- src/services/models/Operation.ts | 31 +++++++++++++++++-- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/components/RequestSamples/RequestSamples.tsx b/src/components/RequestSamples/RequestSamples.tsx index 66a4db53..89b12d74 100644 --- a/src/components/RequestSamples/RequestSamples.tsx +++ b/src/components/RequestSamples/RequestSamples.tsx @@ -1,6 +1,6 @@ import { observer } from 'mobx-react'; import * as React from 'react'; -import { OperationModel, RedocNormalizedOptions } from '../../services'; +import { isPayloadSample, OperationModel, RedocNormalizedOptions } from '../../services'; import { PayloadSamples } from '../PayloadSamples/PayloadSamples'; import { SourceCodeWithCopy } from '../SourceCode/SourceCode'; @@ -19,15 +19,10 @@ export class RequestSamples extends React.Component { render() { const { operation } = this.props; - const requestBodyContent = operation.requestBody && operation.requestBody.content; - const hasBodySample = requestBodyContent && requestBodyContent.hasSample; const samples = operation.codeSamples; - const hasSamples = hasBodySample || samples.length > 0; - const hideTabList = - samples.length + (hasBodySample ? 1 : 0) === 1 - ? this.context.hideSingleRequestSampleTab - : false; + const hasSamples = samples.length > 0; + const hideTabList = samples.length === 1 ? this.context.hideSingleRequestSampleTab : false; return ( (hasSamples && (
@@ -35,23 +30,21 @@ export class RequestSamples extends React.Component { - {hasBodySample && ( - -
- -
-
- )} {samples.map(sample => ( - - + + {isPayloadSample(sample) ? ( +
+ +
+ ) : ( + + )}
))}
diff --git a/src/services/models/Operation.ts b/src/services/models/Operation.ts index 88640dc5..97a4b026 100644 --- a/src/services/models/Operation.ts +++ b/src/services/models/Operation.ts @@ -27,9 +27,23 @@ import { ContentItemModel, ExtendedOpenAPIOperation } from '../MenuBuilder'; import { OpenAPIParser } from '../OpenAPIParser'; import { RedocNormalizedOptions } from '../RedocNormalizedOptions'; import { FieldModel } from './Field'; +import { MediaContentModel } from './MediaContent'; import { RequestBodyModel } from './RequestBody'; import { ResponseModel } from './Response'; +interface XPayloadSample { + lang: 'payload'; + label: string; + requestBodyContent: MediaContentModel; + source: string; +} + +export function isPayloadSample( + sample: XPayloadSample | OpenAPIXCodeSample, +): sample is XPayloadSample { + return sample.lang === 'payload' && (sample as any).requestBodyContent; +} + /** * Operation model ready to be used by components */ @@ -62,7 +76,7 @@ export class OperationModel implements IMenuItem { path: string; servers: OpenAPIServer[]; security: SecurityRequirementModel[]; - codeSamples: OpenAPIXCodeSample[]; + codeSamples: Array; extensions: Dict; constructor( @@ -89,8 +103,21 @@ export class OperationModel implements IMenuItem { this.httpVerb = operationSpec.httpVerb; this.deprecated = !!operationSpec.deprecated; this.operationId = operationSpec.operationId; - this.codeSamples = operationSpec['x-code-samples'] || []; this.path = operationSpec.pathName; + this.codeSamples = operationSpec['x-code-samples'] || []; + + const requestBodyContent = this.requestBody && this.requestBody.content; + if (requestBodyContent && requestBodyContent.hasSample) { + this.codeSamples = [ + { + lang: 'payload', + label: 'Payload', + source: '', + requestBodyContent, + }, + ...this.codeSamples, + ]; + } const pathInfo = parser.byRef( JsonPointer.compile(['paths', operationSpec.pathName]),