@@ -3,154 +3,90 @@
|
|||||||
*/
|
*/
|
||||||
import React from "react"
|
import React from "react"
|
||||||
import PropTypes from "prop-types"
|
import PropTypes from "prop-types"
|
||||||
import ImPropTypes from "react-immutable-proptypes"
|
|
||||||
|
|
||||||
import { sanitizeUrl } from "core/utils"
|
import { sanitizeUrl } from "core/utils"
|
||||||
import { safeBuildUrl } from "core/utils/url"
|
|
||||||
|
|
||||||
export class InfoBasePath extends React.Component {
|
const Info = ({ getComponent, specSelectors }) => {
|
||||||
static propTypes = {
|
const version = specSelectors.version()
|
||||||
host: PropTypes.string,
|
const url = specSelectors.url()
|
||||||
basePath: PropTypes.string,
|
const basePath = specSelectors.basePath()
|
||||||
}
|
const host = specSelectors.host()
|
||||||
|
const summary = specSelectors.selectInfoSummaryField()
|
||||||
|
const description = specSelectors.selectInfoDescriptionField()
|
||||||
|
const title = specSelectors.selectInfoTitleField()
|
||||||
|
const termsOfServiceUrl = specSelectors.selectInfoTermsOfServiceUrl()
|
||||||
|
const externalDocsUrl = specSelectors.selectExternalDocsUrl()
|
||||||
|
const externalDocsDesc = specSelectors.selectExternalDocsDescriptionField()
|
||||||
|
const contact = specSelectors.contact()
|
||||||
|
const license = specSelectors.license()
|
||||||
|
|
||||||
render() {
|
const Markdown = getComponent("Markdown", true)
|
||||||
const { host, basePath } = this.props
|
const Link = getComponent("Link")
|
||||||
|
const VersionStamp = getComponent("VersionStamp")
|
||||||
|
const InfoUrl = getComponent("InfoUrl")
|
||||||
|
const InfoBasePath = getComponent("InfoBasePath")
|
||||||
|
const License = getComponent("License", true)
|
||||||
|
const Contact = getComponent("Contact", true)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<pre className="base-url">
|
<div className="info">
|
||||||
[ Base URL: {host}
|
<hgroup className="main">
|
||||||
{basePath} ]
|
<h2 className="title">
|
||||||
</pre>
|
{title}
|
||||||
)
|
{version && <VersionStamp version={version}></VersionStamp>}
|
||||||
}
|
</h2>
|
||||||
}
|
|
||||||
|
|
||||||
export class InfoUrl extends React.PureComponent {
|
{(host || basePath) && <InfoBasePath host={host} basePath={basePath} />}
|
||||||
static propTypes = {
|
{url && <InfoUrl getComponent={getComponent} url={url} />}
|
||||||
url: PropTypes.string.isRequired,
|
</hgroup>
|
||||||
getComponent: PropTypes.func.isRequired,
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
{summary && <p className="info__summary">{summary}</p>}
|
||||||
const { url, getComponent } = this.props
|
|
||||||
const Link = getComponent("Link")
|
|
||||||
|
|
||||||
return (
|
<div className="info__description description">
|
||||||
<Link target="_blank" href={sanitizeUrl(url)}>
|
<Markdown source={description} />
|
||||||
<span className="url"> {url}</span>
|
|
||||||
</Link>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Info extends React.Component {
|
|
||||||
static propTypes = {
|
|
||||||
title: PropTypes.any,
|
|
||||||
description: PropTypes.any,
|
|
||||||
version: PropTypes.any,
|
|
||||||
info: PropTypes.object,
|
|
||||||
url: PropTypes.string,
|
|
||||||
host: PropTypes.string,
|
|
||||||
basePath: PropTypes.string,
|
|
||||||
externalDocs: ImPropTypes.map,
|
|
||||||
getComponent: PropTypes.func.isRequired,
|
|
||||||
oas3selectors: PropTypes.func,
|
|
||||||
selectedServer: PropTypes.string,
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const {
|
|
||||||
info,
|
|
||||||
url,
|
|
||||||
host,
|
|
||||||
basePath,
|
|
||||||
getComponent,
|
|
||||||
externalDocs,
|
|
||||||
selectedServer,
|
|
||||||
url: specUrl,
|
|
||||||
} = this.props
|
|
||||||
const version = info.get("version")
|
|
||||||
const summary = info.get("summary")
|
|
||||||
const description = info.get("description")
|
|
||||||
const title = info.get("title")
|
|
||||||
const termsOfServiceUrl = safeBuildUrl(
|
|
||||||
info.get("termsOfService"),
|
|
||||||
specUrl,
|
|
||||||
{ selectedServer }
|
|
||||||
)
|
|
||||||
const contactData = info.get("contact")
|
|
||||||
const licenseData = info.get("license")
|
|
||||||
const rawExternalDocsUrl = externalDocs && externalDocs.get("url")
|
|
||||||
const externalDocsUrl = safeBuildUrl(rawExternalDocsUrl, specUrl, {
|
|
||||||
selectedServer,
|
|
||||||
})
|
|
||||||
const externalDocsDescription =
|
|
||||||
externalDocs && externalDocs.get("description")
|
|
||||||
|
|
||||||
const Markdown = getComponent("Markdown", true)
|
|
||||||
const Link = getComponent("Link")
|
|
||||||
const VersionStamp = getComponent("VersionStamp")
|
|
||||||
const InfoUrl = getComponent("InfoUrl")
|
|
||||||
const InfoBasePath = getComponent("InfoBasePath")
|
|
||||||
const License = getComponent("License")
|
|
||||||
const Contact = getComponent("Contact")
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="info">
|
|
||||||
<hgroup className="main">
|
|
||||||
<h2 className="title">
|
|
||||||
{title}
|
|
||||||
{version && <VersionStamp version={version}></VersionStamp>}
|
|
||||||
</h2>
|
|
||||||
{host || basePath ? (
|
|
||||||
<InfoBasePath host={host} basePath={basePath} />
|
|
||||||
) : null}
|
|
||||||
{url && <InfoUrl getComponent={getComponent} url={url} />}
|
|
||||||
</hgroup>
|
|
||||||
{summary && (
|
|
||||||
<div className="info__summary">
|
|
||||||
<Markdown source={summary} />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<div className="description">
|
|
||||||
<Markdown source={description} />
|
|
||||||
</div>
|
|
||||||
{termsOfServiceUrl && (
|
|
||||||
<div className="info__tos">
|
|
||||||
<Link target="_blank" href={sanitizeUrl(termsOfServiceUrl)}>
|
|
||||||
Terms of service
|
|
||||||
</Link>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{contactData?.size > 0 && (
|
|
||||||
<Contact
|
|
||||||
getComponent={getComponent}
|
|
||||||
data={contactData}
|
|
||||||
selectedServer={selectedServer}
|
|
||||||
url={url}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{licenseData?.size > 0 && (
|
|
||||||
<License
|
|
||||||
getComponent={getComponent}
|
|
||||||
license={licenseData}
|
|
||||||
selectedServer={selectedServer}
|
|
||||||
url={url}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
{externalDocsUrl ? (
|
|
||||||
<Link
|
|
||||||
className="info__extdocs"
|
|
||||||
target="_blank"
|
|
||||||
href={sanitizeUrl(externalDocsUrl)}
|
|
||||||
>
|
|
||||||
{externalDocsDescription || externalDocsUrl}
|
|
||||||
</Link>
|
|
||||||
) : null}
|
|
||||||
</div>
|
</div>
|
||||||
)
|
|
||||||
}
|
{termsOfServiceUrl && (
|
||||||
|
<div className="info__tos">
|
||||||
|
<Link target="_blank" href={sanitizeUrl(termsOfServiceUrl)}>
|
||||||
|
Terms of service
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{contact.size > 0 && <Contact />}
|
||||||
|
|
||||||
|
{license.size > 0 && <License />}
|
||||||
|
|
||||||
|
{externalDocsUrl && (
|
||||||
|
<Link
|
||||||
|
className="info__extdocs"
|
||||||
|
target="_blank"
|
||||||
|
href={sanitizeUrl(externalDocsUrl)}
|
||||||
|
>
|
||||||
|
{externalDocsDesc || externalDocsUrl}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
Info.propTypes = {
|
||||||
|
getComponent: PropTypes.func.isRequired,
|
||||||
|
specSelectors: PropTypes.shape({
|
||||||
|
version: PropTypes.func.isRequired,
|
||||||
|
url: PropTypes.func.isRequired,
|
||||||
|
basePath: PropTypes.func.isRequired,
|
||||||
|
host: PropTypes.func.isRequired,
|
||||||
|
selectInfoSummaryField: PropTypes.func.isRequired,
|
||||||
|
selectInfoDescriptionField: PropTypes.func.isRequired,
|
||||||
|
selectInfoTitleField: PropTypes.func.isRequired,
|
||||||
|
selectInfoTermsOfServiceUrl: PropTypes.func.isRequired,
|
||||||
|
selectExternalDocsUrl: PropTypes.func.isRequired,
|
||||||
|
selectExternalDocsDescriptionField: PropTypes.func.isRequired,
|
||||||
|
contact: PropTypes.func.isRequired,
|
||||||
|
license: PropTypes.func.isRequired,
|
||||||
|
}).isRequired,
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Info
|
export default Info
|
||||||
|
|||||||
@@ -21,6 +21,14 @@ import {
|
|||||||
makeSelectContactUrl,
|
makeSelectContactUrl,
|
||||||
makeIsOAS31,
|
makeIsOAS31,
|
||||||
makeSelectLicenseUrl,
|
makeSelectLicenseUrl,
|
||||||
|
selectInfoTitleField,
|
||||||
|
selectInfoSummaryField,
|
||||||
|
selectInfoDescriptionField,
|
||||||
|
selectInfoTermsOfServiceField,
|
||||||
|
makeSelectInfoTermsOfServiceUrl as makeSelectTosUrl,
|
||||||
|
selectExternalDocsDescriptionField,
|
||||||
|
selectExternalDocsUrlField,
|
||||||
|
makeSelectExternalDocsUrl,
|
||||||
} from "./spec-extensions/selectors"
|
} from "./spec-extensions/selectors"
|
||||||
import {
|
import {
|
||||||
isOAS3 as isOAS3Wrapper,
|
isOAS3 as isOAS3Wrapper,
|
||||||
@@ -37,6 +45,8 @@ const OAS31Plugin = () => {
|
|||||||
specSelectors.isOAS31 = makeIsOAS31(system)
|
specSelectors.isOAS31 = makeIsOAS31(system)
|
||||||
specSelectors.selectLicenseUrl = makeSelectLicenseUrl(system)
|
specSelectors.selectLicenseUrl = makeSelectLicenseUrl(system)
|
||||||
specSelectors.selectContactUrl = makeSelectContactUrl(system)
|
specSelectors.selectContactUrl = makeSelectContactUrl(system)
|
||||||
|
specSelectors.selectInfoTermsOfServiceUrl = makeSelectTosUrl(system)
|
||||||
|
specSelectors.selectExternalDocsUrl = makeSelectExternalDocsUrl(system)
|
||||||
|
|
||||||
oas31Selectors.selectLicenseUrl = makeOAS31SelectLicenseUrl(system)
|
oas31Selectors.selectLicenseUrl = makeOAS31SelectLicenseUrl(system)
|
||||||
},
|
},
|
||||||
@@ -47,7 +57,7 @@ const OAS31Plugin = () => {
|
|||||||
OAS31Contact: Contact,
|
OAS31Contact: Contact,
|
||||||
},
|
},
|
||||||
wrapComponents: {
|
wrapComponents: {
|
||||||
info: InfoWrapper,
|
InfoContainer: InfoWrapper,
|
||||||
License: LicenseWrapper,
|
License: LicenseWrapper,
|
||||||
Contact: ContactWrapper,
|
Contact: ContactWrapper,
|
||||||
},
|
},
|
||||||
@@ -58,10 +68,20 @@ const OAS31Plugin = () => {
|
|||||||
selectLicenseNameField,
|
selectLicenseNameField,
|
||||||
selectLicenseUrlField,
|
selectLicenseUrlField,
|
||||||
selectLicenseIdentifierField,
|
selectLicenseIdentifierField,
|
||||||
|
|
||||||
contact,
|
contact,
|
||||||
selectContactNameField,
|
selectContactNameField,
|
||||||
selectContactEmailField,
|
selectContactEmailField,
|
||||||
selectContactUrlField,
|
selectContactUrlField,
|
||||||
|
|
||||||
|
selectInfoTitleField,
|
||||||
|
selectInfoSummaryField,
|
||||||
|
selectInfoDescriptionField,
|
||||||
|
selectInfoTermsOfServiceField,
|
||||||
|
|
||||||
|
selectExternalDocsDescriptionField,
|
||||||
|
selectExternalDocsUrlField,
|
||||||
|
|
||||||
webhooks,
|
webhooks,
|
||||||
},
|
},
|
||||||
wrapSelectors: {
|
wrapSelectors: {
|
||||||
|
|||||||
@@ -20,10 +20,6 @@ export const license = () => (system) => {
|
|||||||
return system.specSelectors.info().get("license", map)
|
return system.specSelectors.info().get("license", map)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const contact = () => (system) => {
|
|
||||||
return system.specSelectors.info().get("contact", map)
|
|
||||||
}
|
|
||||||
|
|
||||||
export const selectLicenseNameField = () => (system) => {
|
export const selectLicenseNameField = () => (system) => {
|
||||||
return system.specSelectors.license().get("name", "License")
|
return system.specSelectors.license().get("name", "License")
|
||||||
}
|
}
|
||||||
@@ -50,6 +46,10 @@ export const selectLicenseIdentifierField = onlyOAS31(() => (system) => {
|
|||||||
return system.specSelectors.license().get("identifier")
|
return system.specSelectors.license().get("identifier")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
export const contact = () => (system) => {
|
||||||
|
return system.specSelectors.info().get("contact", map)
|
||||||
|
}
|
||||||
|
|
||||||
export const selectContactNameField = () => (system) => {
|
export const selectContactNameField = () => (system) => {
|
||||||
return system.specSelectors.contact().get("name", "the developer")
|
return system.specSelectors.contact().get("name", "the developer")
|
||||||
}
|
}
|
||||||
@@ -75,3 +75,55 @@ export const makeSelectContactUrl = (system) =>
|
|||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
export const selectInfoTitleField = () => (system) => {
|
||||||
|
return system.specSelectors.info().get("title")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const selectInfoSummaryField = onlyOAS31(() => (system) => {
|
||||||
|
return system.specSelectors.info().get("summary")
|
||||||
|
})
|
||||||
|
|
||||||
|
export const selectInfoDescriptionField = () => (system) => {
|
||||||
|
return system.specSelectors.info().get("description")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const selectInfoTermsOfServiceField = () => (system) => {
|
||||||
|
return system.specSelectors.info().get("termsOfService")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const makeSelectInfoTermsOfServiceUrl = (system) =>
|
||||||
|
createSelector(
|
||||||
|
() => system.specSelectors.url(),
|
||||||
|
() => system.oas3Selectors.selectedServer(),
|
||||||
|
() => system.specSelectors.selectInfoTermsOfServiceField(),
|
||||||
|
(specUrl, selectedServer, termsOfService) => {
|
||||||
|
if (termsOfService) {
|
||||||
|
return safeBuildUrl(termsOfService, specUrl, { selectedServer })
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
export const selectExternalDocsDescriptionField = () => (system) => {
|
||||||
|
return system.specSelectors.externalDocs().get("description")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const selectExternalDocsUrlField = () => (system) => {
|
||||||
|
return system.specSelectors.externalDocs().get("url")
|
||||||
|
}
|
||||||
|
|
||||||
|
export const makeSelectExternalDocsUrl = (system) =>
|
||||||
|
createSelector(
|
||||||
|
() => system.specSelectors.url(),
|
||||||
|
() => system.oas3Selectors.selectedServer(),
|
||||||
|
() => system.specSelectors.selectExternalDocsUrlField(),
|
||||||
|
(specUrl, selectedServer, url) => {
|
||||||
|
if (url) {
|
||||||
|
return safeBuildUrl(url, specUrl, { selectedServer })
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import React from "react"
|
|||||||
|
|
||||||
const InfoWrapper = (Original, system) => (props) => {
|
const InfoWrapper = (Original, system) => (props) => {
|
||||||
if (system.specSelectors.isOAS31()) {
|
if (system.specSelectors.isOAS31()) {
|
||||||
const OAS31Info = system.getComponent("OAS31Info")
|
const OAS31Info = system.getComponent("OAS31Info", true)
|
||||||
|
|
||||||
return <OAS31Info {...props} />
|
return <OAS31Info />
|
||||||
}
|
}
|
||||||
|
|
||||||
return <Original {...props} />
|
return <Original {...props} />
|
||||||
|
|||||||
Reference in New Issue
Block a user