request code samples could fetch the sample files

This commit is contained in:
kyle 2019-08-13 18:30:37 +08:00
parent 121bf640fa
commit 2415c2a50e

View File

@ -1,6 +1,7 @@
import { observer } from 'mobx-react'; import { observer } from 'mobx-react';
import * as React from 'react'; import * as React from 'react';
import { OperationModel, RedocNormalizedOptions } from '../../services'; import { OperationModel, RedocNormalizedOptions } from '../../services';
import { OpenAPIXCodeSample } from '../../types';
import { PayloadSamples } from '../PayloadSamples/PayloadSamples'; import { PayloadSamples } from '../PayloadSamples/PayloadSamples';
import { SourceCodeWithCopy } from '../SourceCode/SourceCode'; import { SourceCodeWithCopy } from '../SourceCode/SourceCode';
@ -11,17 +12,64 @@ export interface RequestSamplesProps {
operation: OperationModel; operation: OperationModel;
} }
export interface RequestSamplesState {
codeSamples: OpenAPIXCodeSample[];
}
@observer @observer
export class RequestSamples extends React.Component<RequestSamplesProps> { export class RequestSamples extends React.Component<RequestSamplesProps, RequestSamplesState> {
static contextType = OptionsContext; static contextType = OptionsContext;
context: RedocNormalizedOptions; context: RedocNormalizedOptions;
operation: OperationModel; operation: OperationModel;
constructor(props) {
super(props);
const { operation } = this.props;
const codeSamples = operation.codeSamples;
this.state = {
codeSamples,
};
}
componentWillMount() {
const { codeSamples } = this.state;
codeSamples.forEach(codeSample => {
if (codeSample.source && codeSample.source.startsWith('@url:')) {
const fileURL = codeSample.source.substr(5);
this.fetchOriginSample(fileURL)
.then(source => {
codeSample.source = source;
this.setState({ codeSamples });
});
}
});
}
fetchOriginSample = async fileURL => {
try {
const utf8Decoder = new TextDecoder('utf-8');
const response = await fetch(fileURL,
{
headers: { 'Content-type': 'text/plain' },
},
);
if (response && response.body) {
const reader = response.body.getReader();
const { value } = await reader.read();
const source = value ? utf8Decoder.decode(value) : '';
return source ? source : '';
}
} catch (e) {
console.error(e.stack);
}
return '';
}
render() { render() {
const { operation } = this.props; const { operation } = this.props;
const requestBodyContent = operation.requestBody && operation.requestBody.content; const requestBodyContent = operation.requestBody && operation.requestBody.content;
const hasBodySample = requestBodyContent && requestBodyContent.hasSample; const hasBodySample = requestBodyContent && requestBodyContent.hasSample;
const samples = operation.codeSamples; const { codeSamples: samples } = this.state;
const hasSamples = hasBodySample || samples.length > 0; const hasSamples = hasBodySample || samples.length > 0;
const hideTabList = const hideTabList =