refactor(oas31): change License component to be smart (#8476)
Refs #8474
This commit is contained in:
@@ -6,6 +6,8 @@ import { isSwagger2 as isSwagger2Helper, isOAS30 as isOAS30Helper } from "../hel
|
|||||||
* Helpers
|
* Helpers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const map = Map()
|
||||||
|
|
||||||
export const isSwagger2 = () => (system) => {
|
export const isSwagger2 = () => (system) => {
|
||||||
const spec = system.getSystem().specSelectors.specJson()
|
const spec = system.getSystem().specSelectors.specJson()
|
||||||
return isSwagger2Helper(spec)
|
return isSwagger2Helper(spec)
|
||||||
@@ -34,6 +36,5 @@ function onlyOAS3(selector) {
|
|||||||
|
|
||||||
export const servers = onlyOAS3(() => (system) => {
|
export const servers = onlyOAS3(() => (system) => {
|
||||||
const spec = system.specSelectors.specJson()
|
const spec = system.specSelectors.specJson()
|
||||||
return spec.get("servers", servers.mapConst)
|
return spec.get("servers", map)
|
||||||
})
|
})
|
||||||
servers.mapConst = Map()
|
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ import { Map } from "immutable"
|
|||||||
/**
|
/**
|
||||||
* Helpers
|
* Helpers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const map = Map()
|
||||||
|
|
||||||
function onlyOAS3(selector) {
|
function onlyOAS3(selector) {
|
||||||
return (ori, system) =>
|
return (ori, system) =>
|
||||||
(...args) => {
|
(...args) => {
|
||||||
@@ -31,9 +34,8 @@ const OAS3NullSelector = onlyOAS3(nullSelector)
|
|||||||
export const definitions = onlyOAS3(() => (system) => {
|
export const definitions = onlyOAS3(() => (system) => {
|
||||||
const spec = system.getSystem().specSelectors.specJson()
|
const spec = system.getSystem().specSelectors.specJson()
|
||||||
const schemas = spec.getIn(["components", "schemas"])
|
const schemas = spec.getIn(["components", "schemas"])
|
||||||
return Map.isMap(schemas) ? schemas : definitions.mapConst
|
return Map.isMap(schemas) ? schemas : map
|
||||||
})
|
})
|
||||||
definitions.mapConst = Map()
|
|
||||||
|
|
||||||
export const hasHost = onlyOAS3(() => (system) => {
|
export const hasHost = onlyOAS3(() => (system) => {
|
||||||
const spec = system.getSystem().specSelectors.specJson()
|
const spec = system.getSystem().specSelectors.specJson()
|
||||||
|
|||||||
@@ -3,50 +3,35 @@
|
|||||||
*/
|
*/
|
||||||
import React from "react"
|
import React from "react"
|
||||||
import PropTypes from "prop-types"
|
import PropTypes from "prop-types"
|
||||||
import { safeBuildUrl } from "core/utils/url"
|
|
||||||
import { sanitizeUrl } from "core/utils"
|
import { sanitizeUrl } from "core/utils"
|
||||||
|
|
||||||
class License extends React.Component {
|
const License = ({ getComponent, oas31Selectors }) => {
|
||||||
static propTypes = {
|
const name = oas31Selectors.selectLicenseNameField()
|
||||||
license: PropTypes.object,
|
const url = oas31Selectors.selectLicenseUrl()
|
||||||
getComponent: PropTypes.func.isRequired,
|
const Link = getComponent("Link")
|
||||||
selectedServer: PropTypes.string,
|
|
||||||
url: PropTypes.string.isRequired,
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
return (
|
||||||
const { license, getComponent, selectedServer, url: specUrl } = this.props
|
<div className="info__license">
|
||||||
const name = license.get("name", "License")
|
{url ? (
|
||||||
const url = sanitizeUrl(
|
<div className="info__license__url">
|
||||||
safeBuildUrl(license.get("url"), specUrl, { selectedServer })
|
<Link target="_blank" href={sanitizeUrl(url)}>
|
||||||
)
|
{name}
|
||||||
const identifier = license.get("identifier", "")
|
</Link>
|
||||||
const spdxURL = sanitizeUrl(`https://spdx.org/licenses/${identifier}.html`)
|
</div>
|
||||||
|
) : (
|
||||||
|
<span>{name}</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
const Link = getComponent("Link")
|
License.propTypes = {
|
||||||
|
getComponent: PropTypes.func.isRequired,
|
||||||
return (
|
oas31Selectors: PropTypes.shape({
|
||||||
<div className="info__license">
|
selectLicenseNameField: PropTypes.func.isRequired,
|
||||||
{identifier && (
|
selectLicenseUrl: PropTypes.func.isRequired,
|
||||||
<div className="info__license__url">
|
}).isRequired,
|
||||||
<Link target="_blank" href={spdxURL}>
|
|
||||||
{name}
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{url && !identifier && (
|
|
||||||
<div className="info__license__url">
|
|
||||||
<Link target="_blank" href={url}>
|
|
||||||
{name}
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{!url && !identifier && <span>{name}</span>}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default License
|
export default License
|
||||||
|
|||||||
@@ -6,11 +6,22 @@ import License from "./components/license"
|
|||||||
import Info from "./components/info"
|
import Info from "./components/info"
|
||||||
import LicenseWrapper from "./wrap-components/license"
|
import LicenseWrapper from "./wrap-components/license"
|
||||||
import InfoWrapper from "./wrap-components/info"
|
import InfoWrapper from "./wrap-components/info"
|
||||||
import { isOAS31, webhooks } from "./spec-extensions/selectors"
|
import { isOAS31, license, webhooks } from "./spec-extensions/selectors"
|
||||||
import { isOAS3 } from "./spec-extensions/wrap-selectors"
|
import { isOAS3 } from "./spec-extensions/wrap-selectors"
|
||||||
|
import {
|
||||||
|
makeSelectLicenseUrl,
|
||||||
|
selectLicenseIdentifierField,
|
||||||
|
selectLicenseNameField,
|
||||||
|
selectLicenseUrlField,
|
||||||
|
} from "./selectors"
|
||||||
|
|
||||||
const OAS31Plugin = () => {
|
const OAS31Plugin = () => {
|
||||||
return {
|
return {
|
||||||
|
afterLoad(system) {
|
||||||
|
const oas31Selectors = this.statePlugins.oas31.selectors
|
||||||
|
|
||||||
|
oas31Selectors.selectLicenseUrl = makeSelectLicenseUrl(system)
|
||||||
|
},
|
||||||
components: {
|
components: {
|
||||||
Webhooks,
|
Webhooks,
|
||||||
OAS31Info: Info,
|
OAS31Info: Info,
|
||||||
@@ -24,12 +35,20 @@ const OAS31Plugin = () => {
|
|||||||
spec: {
|
spec: {
|
||||||
selectors: {
|
selectors: {
|
||||||
isOAS31,
|
isOAS31,
|
||||||
|
license,
|
||||||
webhooks,
|
webhooks,
|
||||||
},
|
},
|
||||||
wrapSelectors: {
|
wrapSelectors: {
|
||||||
isOAS3,
|
isOAS3,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
oas31: {
|
||||||
|
selectors: {
|
||||||
|
selectLicenseNameField,
|
||||||
|
selectLicenseUrlField,
|
||||||
|
selectLicenseIdentifierField,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
37
src/core/plugins/oas31/selectors.js
Normal file
37
src/core/plugins/oas31/selectors.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* @prettier
|
||||||
|
*/
|
||||||
|
import { createSelector } from "reselect"
|
||||||
|
|
||||||
|
import { safeBuildUrl } from "core/utils/url"
|
||||||
|
|
||||||
|
export const selectLicenseNameField = () => (system) => {
|
||||||
|
return system.specSelectors.license().get("name", "License")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const selectLicenseUrlField = () => (system) => {
|
||||||
|
return system.specSelectors.license().get("url")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const selectLicenseIdentifierField = () => (system) => {
|
||||||
|
return system.specSelectors.license().get("identifier")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const makeSelectLicenseUrl = (system) =>
|
||||||
|
createSelector(
|
||||||
|
() => system.specSelectors.url(),
|
||||||
|
() => system.oas3Selectors.selectedServer(),
|
||||||
|
() => system.oas31Selectors.selectLicenseUrlField(),
|
||||||
|
() => system.oas31Selectors.selectLicenseIdentifierField(),
|
||||||
|
(specUrl, selectedServer, url, identifier) => {
|
||||||
|
if (url) {
|
||||||
|
return safeBuildUrl(url, specUrl, { selectedServer })
|
||||||
|
}
|
||||||
|
|
||||||
|
if (identifier) {
|
||||||
|
return `https://spdx.org/licenses/${identifier}.html`
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -5,6 +5,8 @@ import { Map } from "immutable"
|
|||||||
|
|
||||||
import { isOAS31 as isOAS31Helper } from "../helpers"
|
import { isOAS31 as isOAS31Helper } from "../helpers"
|
||||||
|
|
||||||
|
const map = Map()
|
||||||
|
|
||||||
export const isOAS31 = () => (system) => {
|
export const isOAS31 = () => (system) => {
|
||||||
const spec = system.specSelectors.specJson()
|
const spec = system.specSelectors.specJson()
|
||||||
return isOAS31Helper(spec)
|
return isOAS31Helper(spec)
|
||||||
@@ -23,7 +25,9 @@ const onlyOAS31 =
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const webhooks = onlyOAS31(() => (system) => {
|
export const webhooks = onlyOAS31(() => (system) => {
|
||||||
const spec = system.specSelectors.specJson()
|
return system.specSelectors.specJson().get("webhooks", map)
|
||||||
return spec.get("webhooks", webhooks.mapConst)
|
|
||||||
})
|
})
|
||||||
webhooks.mapConst = Map()
|
|
||||||
|
export const license = () => (system) => {
|
||||||
|
return system.specSelectors.info().get("license", map)
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import React from "react"
|
|||||||
|
|
||||||
const LicenseWrapper = (Original, system) => (props) => {
|
const LicenseWrapper = (Original, system) => (props) => {
|
||||||
if (system.specSelectors.isOAS31()) {
|
if (system.specSelectors.isOAS31()) {
|
||||||
const OAS31License = system.getComponent("OAS31License")
|
const OAS31License = system.getComponent("OAS31License", true)
|
||||||
|
|
||||||
return <OAS31License {...props} />
|
return <OAS31License />
|
||||||
}
|
}
|
||||||
|
|
||||||
return <Original {...props} />
|
return <Original {...props} />
|
||||||
|
|||||||
Reference in New Issue
Block a user