/** * @prettier */ import React, { useMemo, useState, useEffect, useCallback, useRef } from "react" import PropTypes from "prop-types" import ImPropTypes from "react-immutable-proptypes" import cx from "classnames" import randomBytes from "randombytes" const usePrevious = (value) => { const ref = useRef() useEffect(() => { ref.current = value }) return ref.current } const useTabs = ({ initialTab, isExecute, schema, example }) => { const tabs = useMemo(() => ({ example: "example", model: "model" }), []) const allowedTabs = useMemo(() => Object.keys(tabs), [tabs]) const tab = !allowedTabs.includes(initialTab) || !schema || isExecute ? tabs.example : initialTab const prevIsExecute = usePrevious(isExecute) const [activeTab, setActiveTab] = useState(tab) const handleTabChange = useCallback((e) => { setActiveTab(e.target.dataset.name) }, []) useEffect(() => { if (prevIsExecute && !isExecute && example) { setActiveTab(tabs.example) } }, [prevIsExecute, isExecute, example]) return { activeTab, onTabChange: handleTabChange, tabs } } const ModelExample = ({ schema, example, isExecute = false, specPath, includeWriteOnly = false, includeReadOnly = false, getComponent, getConfigs, specSelectors, }) => { const { defaultModelRendering, defaultModelExpandDepth } = getConfigs() const ModelWrapper = getComponent("ModelWrapper") const HighlightCode = getComponent("HighlightCode", true) const exampleTabId = randomBytes(5).toString("base64") const examplePanelId = randomBytes(5).toString("base64") const modelTabId = randomBytes(5).toString("base64") const modelPanelId = randomBytes(5).toString("base64") const isOAS3 = specSelectors.isOAS3() const { activeTab, tabs, onTabChange } = useTabs({ initialTab: defaultModelRendering, isExecute, schema, example, }) return (
{activeTab === tabs.example && (
{example ? ( example ) : ( (no example available )}
)} {activeTab === tabs.model && (
)}
) } ModelExample.propTypes = { getComponent: PropTypes.func.isRequired, specSelectors: PropTypes.shape({ isOAS3: PropTypes.func.isRequired }) .isRequired, schema: PropTypes.object.isRequired, example: PropTypes.any.isRequired, isExecute: PropTypes.bool, getConfigs: PropTypes.func.isRequired, specPath: ImPropTypes.list.isRequired, includeReadOnly: PropTypes.bool, includeWriteOnly: PropTypes.bool, } export default ModelExample