diff --git a/src/core/plugins/oas31/components/info.jsx b/src/core/plugins/oas31/components/info.jsx index 3eb72df9..d81f911e 100644 --- a/src/core/plugins/oas31/components/info.jsx +++ b/src/core/plugins/oas31/components/info.jsx @@ -3,154 +3,90 @@ */ import React from "react" import PropTypes from "prop-types" -import ImPropTypes from "react-immutable-proptypes" import { sanitizeUrl } from "core/utils" -import { safeBuildUrl } from "core/utils/url" -export class InfoBasePath extends React.Component { - static propTypes = { - host: PropTypes.string, - basePath: PropTypes.string, - } +const Info = ({ getComponent, specSelectors }) => { + const version = specSelectors.version() + const url = specSelectors.url() + 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 { host, basePath } = this.props + 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", true) + const Contact = getComponent("Contact", true) - return ( -
-        [ Base URL: {host}
-        {basePath} ]
-      
- ) - } -} + return ( +
+
+

+ {title} + {version && } +

-export class InfoUrl extends React.PureComponent { - static propTypes = { - url: PropTypes.string.isRequired, - getComponent: PropTypes.func.isRequired, - } + {(host || basePath) && } + {url && } +
- render() { - const { url, getComponent } = this.props - const Link = getComponent("Link") + {summary &&

{summary}

} - return ( - - {url} - - ) - } -} - -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 ( -
-
-

- {title} - {version && } -

- {host || basePath ? ( - - ) : null} - {url && } -
- {summary && ( -
- -
- )} -
- -
- {termsOfServiceUrl && ( -
- - Terms of service - -
- )} - {contactData?.size > 0 && ( - - )} - {licenseData?.size > 0 && ( - - )} - {externalDocsUrl ? ( - - {externalDocsDescription || externalDocsUrl} - - ) : null} +
+
- ) - } + + {termsOfServiceUrl && ( +
+ + Terms of service + +
+ )} + + {contact.size > 0 && } + + {license.size > 0 && } + + {externalDocsUrl && ( + + {externalDocsDesc || externalDocsUrl} + + )} +
+ ) +} + +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 diff --git a/src/core/plugins/oas31/index.js b/src/core/plugins/oas31/index.js index 131502d1..d01378cd 100644 --- a/src/core/plugins/oas31/index.js +++ b/src/core/plugins/oas31/index.js @@ -21,6 +21,14 @@ import { makeSelectContactUrl, makeIsOAS31, makeSelectLicenseUrl, + selectInfoTitleField, + selectInfoSummaryField, + selectInfoDescriptionField, + selectInfoTermsOfServiceField, + makeSelectInfoTermsOfServiceUrl as makeSelectTosUrl, + selectExternalDocsDescriptionField, + selectExternalDocsUrlField, + makeSelectExternalDocsUrl, } from "./spec-extensions/selectors" import { isOAS3 as isOAS3Wrapper, @@ -37,6 +45,8 @@ const OAS31Plugin = () => { specSelectors.isOAS31 = makeIsOAS31(system) specSelectors.selectLicenseUrl = makeSelectLicenseUrl(system) specSelectors.selectContactUrl = makeSelectContactUrl(system) + specSelectors.selectInfoTermsOfServiceUrl = makeSelectTosUrl(system) + specSelectors.selectExternalDocsUrl = makeSelectExternalDocsUrl(system) oas31Selectors.selectLicenseUrl = makeOAS31SelectLicenseUrl(system) }, @@ -47,7 +57,7 @@ const OAS31Plugin = () => { OAS31Contact: Contact, }, wrapComponents: { - info: InfoWrapper, + InfoContainer: InfoWrapper, License: LicenseWrapper, Contact: ContactWrapper, }, @@ -58,10 +68,20 @@ const OAS31Plugin = () => { selectLicenseNameField, selectLicenseUrlField, selectLicenseIdentifierField, + contact, selectContactNameField, selectContactEmailField, selectContactUrlField, + + selectInfoTitleField, + selectInfoSummaryField, + selectInfoDescriptionField, + selectInfoTermsOfServiceField, + + selectExternalDocsDescriptionField, + selectExternalDocsUrlField, + webhooks, }, wrapSelectors: { diff --git a/src/core/plugins/oas31/spec-extensions/selectors.js b/src/core/plugins/oas31/spec-extensions/selectors.js index 86e40c8d..363cc958 100644 --- a/src/core/plugins/oas31/spec-extensions/selectors.js +++ b/src/core/plugins/oas31/spec-extensions/selectors.js @@ -20,10 +20,6 @@ export const license = () => (system) => { return system.specSelectors.info().get("license", map) } -export const contact = () => (system) => { - return system.specSelectors.info().get("contact", map) -} - export const selectLicenseNameField = () => (system) => { return system.specSelectors.license().get("name", "License") } @@ -50,6 +46,10 @@ export const selectLicenseIdentifierField = onlyOAS31(() => (system) => { return system.specSelectors.license().get("identifier") }) +export const contact = () => (system) => { + return system.specSelectors.info().get("contact", map) +} + export const selectContactNameField = () => (system) => { return system.specSelectors.contact().get("name", "the developer") } @@ -75,3 +75,55 @@ export const makeSelectContactUrl = (system) => 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 + } + ) diff --git a/src/core/plugins/oas31/wrap-components/info.jsx b/src/core/plugins/oas31/wrap-components/info.jsx index 3530044c..4c03388e 100644 --- a/src/core/plugins/oas31/wrap-components/info.jsx +++ b/src/core/plugins/oas31/wrap-components/info.jsx @@ -5,9 +5,9 @@ import React from "react" const InfoWrapper = (Original, system) => (props) => { if (system.specSelectors.isOAS31()) { - const OAS31Info = system.getComponent("OAS31Info") + const OAS31Info = system.getComponent("OAS31Info", true) - return + return } return