feat(ux): enhance media-type switching experience in RequestBodyEditor (#6837)
* feat(ux): enhance media-type switching experience in RequestBodyEditor 1. When canceling the try-out mode the request body will be reset to its initial state. 2. When the user switches the media-type in the try-out mode, the experience is as follows: - If the user did edit the request body the body wont be touched and only media type is updated. This is to ensure that user content is NEVER accidentally overwritten with a default value. - If the user did not edit the request body it is safe to be replaced by the default value of the target media-type. Multiple example needed some care in order to allow the retain example value to function properly * fix(test): workaround cypress issue that can't be reproduced manually * test: added new feature to ensure enhanced user editing flow Signed-off-by: mathis-m <mathis.michel@outlook.de>
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
import { OrderedMap, Map } from "immutable"
|
||||
import { OrderedMap, Map, List } from "immutable"
|
||||
import { isOAS3 as isOAS3Helper } from "./helpers"
|
||||
import { getDefaultRequestBodyValue } from "./components/request-body"
|
||||
import { stringify } from "../../utils"
|
||||
|
||||
// Helpers
|
||||
|
||||
@@ -54,6 +56,43 @@ export const requestBodyValue = onlyOAS3((state, path, method) => {
|
||||
}
|
||||
)
|
||||
|
||||
export const shouldRetainRequestBodyValue = onlyOAS3((state, path, method) => {
|
||||
return state.getIn(["requestData", path, method, "retainBodyValue"]) || false
|
||||
}
|
||||
)
|
||||
|
||||
export const hasUserEditedBody = (state, path, method) => (system) => {
|
||||
const {oas3Selectors, specSelectors} = system.getSystem()
|
||||
const spec = specSelectors.specJson()
|
||||
if(isOAS3Helper(spec)) {
|
||||
let userHasEditedBody = false
|
||||
const currentMediaType = oas3Selectors.requestContentType(path, method)
|
||||
let userEditedRequestBody = oas3Selectors.requestBodyValue(path, method)
|
||||
if (Map.isMap(userEditedRequestBody)) {
|
||||
// context is not application/json media-type
|
||||
userEditedRequestBody = stringify(userEditedRequestBody.mapEntries((kv) => Map.isMap(kv[1]) ? [kv[0], kv[1].get("value")] : kv).toJS())
|
||||
}
|
||||
if(List.isList(userEditedRequestBody)) {
|
||||
userEditedRequestBody = stringify(userEditedRequestBody)
|
||||
}
|
||||
if (currentMediaType) {
|
||||
const currentMediaTypeDefaultBodyValue = getDefaultRequestBodyValue(
|
||||
specSelectors.specResolvedSubtree(["paths", path, method, "requestBody"]),
|
||||
currentMediaType,
|
||||
oas3Selectors.activeExamplesMember(
|
||||
path, method,
|
||||
"requestBody",
|
||||
"requestBody",
|
||||
)
|
||||
)
|
||||
userHasEditedBody = !!userEditedRequestBody && userEditedRequestBody !== currentMediaTypeDefaultBodyValue
|
||||
}
|
||||
return userHasEditedBody
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
export const requestBodyInclusionSetting = onlyOAS3((state, path, method) => {
|
||||
return state.getIn(["requestData", path, method, "bodyInclusion"]) || Map()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user