import React from "react" import PropTypes from "prop-types" import ImPropTypes from "react-immutable-proptypes" import { Map, OrderedMap, List } from "immutable" import { getCommonExtensions, getSampleSchema, stringify, isEmptyValue } from "core/utils" function getDefaultRequestBodyValue(requestBody, mediaType, activeExamplesKey) { let mediaTypeValue = requestBody.getIn(["content", mediaType]) let schema = mediaTypeValue.get("schema").toJS() let example = mediaTypeValue.get("example") !== undefined ? stringify(mediaTypeValue.get("example")) : null let currentExamplesValue = mediaTypeValue.getIn([ "examples", activeExamplesKey, "value" ]) if (mediaTypeValue.get("examples")) { // the media type DOES have examples return stringify(currentExamplesValue) || "" } else { // the media type DOES NOT have examples return stringify( example || getSampleSchema(schema, mediaType, { includeWriteOnly: true }) || "" ) } } const RequestBody = ({ requestBody, requestBodyValue, requestBodyInclusionSetting, getComponent, getConfigs, specSelectors, fn, contentType, isExecute, specPath, onChange, onChangeIncludeEmpty, activeExamplesKey, updateActiveExamplesKey, }) => { const handleFile = (e) => { onChange(e.target.files[0]) } const Markdown = getComponent("Markdown", true) const ModelExample = getComponent("modelExample") const RequestBodyEditor = getComponent("RequestBodyEditor") const HighlightCode = getComponent("highlightCode") const ExamplesSelectValueRetainer = getComponent("ExamplesSelectValueRetainer") const Example = getComponent("Example") const ParameterIncludeEmpty = getComponent("ParameterIncludeEmpty") const { showCommonExtensions } = getConfigs() const requestBodyDescription = (requestBody && requestBody.get("description")) || null const requestBodyContent = (requestBody && requestBody.get("content")) || new OrderedMap() contentType = contentType || requestBodyContent.keySeq().first() || "" const mediaTypeValue = requestBodyContent.get(contentType, OrderedMap()) const schemaForMediaType = mediaTypeValue.get("schema", OrderedMap()) const examplesForMediaType = mediaTypeValue.get("examples", null) const handleExamplesSelect = (key /*, { isSyntheticChange } */) => { updateActiveExamplesKey(key) } if(!mediaTypeValue.size) { return null } const isObjectContent = mediaTypeValue.getIn(["schema", "type"]) === "object" if( contentType === "application/octet-stream" || contentType.indexOf("image/") === 0 || contentType.indexOf("audio/") === 0 || contentType.indexOf("video/") === 0 ) { const Input = getComponent("Input") if(!isExecute) { return Example values are not available for application/octet-stream media types. } return } if ( isObjectContent && ( contentType === "application/x-www-form-urlencoded" || contentType.indexOf("multipart/") === 0 ) && schemaForMediaType.get("properties", OrderedMap()).size > 0 ) { const JsonSchemaForm = getComponent("JsonSchemaForm") const ParameterExt = getComponent("ParameterExt") const bodyProperties = schemaForMediaType.get("properties", OrderedMap()) requestBodyValue = Map.isMap(requestBodyValue) ? requestBodyValue : OrderedMap() return
{ requestBodyDescription && } { bodyProperties.map((prop, key) => { let commonExt = showCommonExtensions ? getCommonExtensions(prop) : null const required = schemaForMediaType.get("required", List()).includes(key) const type = prop.get("type") const format = prop.get("format") const description = prop.get("description") const currentValue = requestBodyValue.get(key) let initialValue = prop.get("default") || prop.get("example") || "" if (initialValue === "" && type === "object") { initialValue = getSampleSchema(prop, false, { includeWriteOnly: true }) } if (typeof initialValue !== "string" && type === "object") { initialValue = stringify(initialValue) } const isFile = type === "string" && (format === "binary" || format === "base64") return }) }
{ key } { !required ? null :  * }
{ type } { format && (${format})} {!showCommonExtensions || !commonExt.size ? null : commonExt.map((v, key) => )}
{ prop.get("deprecated") ? "deprecated": null }
{isExecute ?
{ onChange(value, [key]) }} /> {required ? null : ( onChangeIncludeEmpty(key, value)} isIncluded={requestBodyInclusionSetting.get(key)} isDisabled={!isEmptyValue(currentValue)} /> )}
: null }
} return
{ requestBodyDescription && } { examplesForMediaType ? ( ) : null } { isExecute ? (
) : ( } /> ) } { examplesForMediaType ? ( ) : null }
} RequestBody.propTypes = { requestBody: ImPropTypes.orderedMap.isRequired, requestBodyValue: ImPropTypes.orderedMap.isRequired, requestBodyInclusionSetting: ImPropTypes.Map.isRequired, getComponent: PropTypes.func.isRequired, getConfigs: PropTypes.func.isRequired, fn: PropTypes.object.isRequired, specSelectors: PropTypes.object.isRequired, contentType: PropTypes.string, isExecute: PropTypes.bool.isRequired, onChange: PropTypes.func.isRequired, onChangeIncludeEmpty: PropTypes.func.isRequired, specPath: PropTypes.array.isRequired, activeExamplesKey: PropTypes.string, updateActiveExamplesKey: PropTypes.func, } export default RequestBody