diff --git a/src/core/plugins/oas31/components/contact.jsx b/src/core/plugins/oas31/components/contact.jsx new file mode 100644 index 00000000..d1e9d359 --- /dev/null +++ b/src/core/plugins/oas31/components/contact.jsx @@ -0,0 +1,43 @@ +/** + * @prettier + */ +import React from "react" +import PropTypes from "prop-types" + +import { sanitizeUrl } from "core/utils" + +const Contact = ({ getComponent, specSelectors }) => { + const name = specSelectors.selectContactNameField() + const url = specSelectors.selectContactUrl() + const email = specSelectors.selectContactEmailField() + + const Link = getComponent("Link") + + return ( +
+ {url && ( +
+ + {name} - Website + +
+ )} + {email && ( + + {url ? `Send email to ${name}` : `Contact ${name}`} + + )} +
+ ) +} + +Contact.propTypes = { + getComponent: PropTypes.func.isRequired, + specSelectors: PropTypes.shape({ + selectContactNameField: PropTypes.func.isRequired, + selectContactUrl: PropTypes.func.isRequired, + selectContactEmailField: PropTypes.func.isRequired, + }).isRequired, +} + +export default Contact diff --git a/src/core/plugins/oas31/index.js b/src/core/plugins/oas31/index.js index 39e78051..131502d1 100644 --- a/src/core/plugins/oas31/index.js +++ b/src/core/plugins/oas31/index.js @@ -3,15 +3,22 @@ */ import Webhooks from "./components/webhooks" import License from "./components/license" +import Contact from "./components/contact" import Info from "./components/info" import LicenseWrapper from "./wrap-components/license" +import ContactWrapper from "./wrap-components/contact" import InfoWrapper from "./wrap-components/info" import { license, + contact, webhooks, selectLicenseNameField, selectLicenseUrlField, selectLicenseIdentifierField, + selectContactNameField, + selectContactEmailField, + selectContactUrlField, + makeSelectContactUrl, makeIsOAS31, makeSelectLicenseUrl, } from "./spec-extensions/selectors" @@ -27,18 +34,22 @@ const OAS31Plugin = () => { const oas31Selectors = this.statePlugins.oas31.selectors const specSelectors = this.statePlugins.spec.selectors - specSelectors.selectLicenseUrl = makeSelectLicenseUrl(system) specSelectors.isOAS31 = makeIsOAS31(system) + specSelectors.selectLicenseUrl = makeSelectLicenseUrl(system) + specSelectors.selectContactUrl = makeSelectContactUrl(system) + oas31Selectors.selectLicenseUrl = makeOAS31SelectLicenseUrl(system) }, components: { Webhooks, OAS31Info: Info, OAS31License: License, + OAS31Contact: Contact, }, wrapComponents: { - License: LicenseWrapper, info: InfoWrapper, + License: LicenseWrapper, + Contact: ContactWrapper, }, statePlugins: { spec: { @@ -47,6 +58,10 @@ const OAS31Plugin = () => { selectLicenseNameField, selectLicenseUrlField, selectLicenseIdentifierField, + contact, + selectContactNameField, + selectContactEmailField, + selectContactUrlField, webhooks, }, wrapSelectors: { diff --git a/src/core/plugins/oas31/spec-extensions/selectors.js b/src/core/plugins/oas31/spec-extensions/selectors.js index b232dcbb..86e40c8d 100644 --- a/src/core/plugins/oas31/spec-extensions/selectors.js +++ b/src/core/plugins/oas31/spec-extensions/selectors.js @@ -20,6 +20,10 @@ 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") } @@ -28,10 +32,6 @@ export const selectLicenseUrlField = () => (system) => { return system.specSelectors.license().get("url") } -export const selectLicenseIdentifierField = onlyOAS31(() => (system) => { - return system.specSelectors.license().get("identifier") -}) - export const makeSelectLicenseUrl = (system) => createSelector( () => system.specSelectors.url(), @@ -45,3 +45,33 @@ export const makeSelectLicenseUrl = (system) => return undefined } ) + +export const selectLicenseIdentifierField = onlyOAS31(() => (system) => { + return system.specSelectors.license().get("identifier") +}) + +export const selectContactNameField = () => (system) => { + return system.specSelectors.contact().get("name", "the developer") +} + +export const selectContactEmailField = () => (system) => { + return system.specSelectors.contact().get("email") +} + +export const selectContactUrlField = () => (system) => { + return system.specSelectors.contact().get("url") +} + +export const makeSelectContactUrl = (system) => + createSelector( + () => system.specSelectors.url(), + () => system.oas3Selectors.selectedServer(), + () => system.specSelectors.selectContactUrlField(), + (specUrl, selectedServer, url) => { + if (url) { + return safeBuildUrl(url, specUrl, { selectedServer }) + } + + return undefined + } + ) diff --git a/src/core/plugins/oas31/wrap-components/contact.jsx b/src/core/plugins/oas31/wrap-components/contact.jsx new file mode 100644 index 00000000..ac771069 --- /dev/null +++ b/src/core/plugins/oas31/wrap-components/contact.jsx @@ -0,0 +1,16 @@ +/** + * @prettier + */ +import React from "react" + +const ContactWrapper = (Original, system) => (props) => { + if (system.specSelectors.isOAS31()) { + const OAS31Contact = system.getComponent("OAS31Contact", true) + + return + } + + return +} + +export default ContactWrapper