import React, { forwardRef, useRef, useCallback } from 'react'; import find from 'lodash/find'; import { useSelector, useDispatch } from 'react-redux'; import { IconFileCode, IconDots } from '@tabler/icons'; import StyledWrapper from './StyledWrapper'; import SpecViewer from './SpecViewer'; import Dropdown from 'components/Dropdown'; import { openApiSpec, saveApiSpecToFile, updateApiSpecPanelLeftPaneWidth } from 'providers/ReduxStore/slices/apiSpec'; import { useState } from 'react'; import CreateApiSpec from 'components/Sidebar/ApiSpecs/CreateApiSpec'; import toast from 'react-hot-toast'; const ApiSpecPanel = () => { const dispatch = useDispatch(); const [createApiSpecModalOpen, setCreateApiSpecModalOpen] = useState(false); const { apiSpecs, activeApiSpecUid } = useSelector((state) => state.apiSpec); const dropdownTippyRef = useRef(); const onDropdownCreate = (ref) => (dropdownTippyRef.current = ref); let apiSpec = find(apiSpecs, (c) => c.uid === activeApiSpecUid); const { filename, pathname, raw, uid, leftPaneWidth } = apiSpec || {}; const handleLeftPaneWidthChange = useCallback( (w) => { if (!uid) return; dispatch(updateApiSpecPanelLeftPaneWidth({ uid, leftPaneWidth: w })); }, [dispatch, uid] ); if (!uid) { return
API Spec not found!
; } const MenuIcon = forwardRef((props, ref) => { return (
); }); const handleOpenApiSpec = () => { dispatch(openApiSpec()).catch( (err) => console.log(err) && toast.error('An error occurred while opening the API spec') ); }; return ( {createApiSpecModalOpen ? setCreateApiSpecModalOpen(false)} /> : null}
API Designer
{filename}
} placement="bottom-start">
{ dropdownTippyRef.current.hide(); setCreateApiSpecModalOpen(true); }} > Create API Spec
{ dropdownTippyRef.current.hide(); handleOpenApiSpec(); }} > Open API Spec
dispatch(saveApiSpecToFile({ uid, content }))} leftPaneWidth={leftPaneWidth ?? null} onLeftPaneWidthChange={handleLeftPaneWidthChange} />
); }; export default ApiSpecPanel;