import { FC, useEffect, useState } from 'react'; import { Box } from '@mui/material'; import { ApiDocumentation } from '../../core/documentation/types'; import { ApiDocumentationMenu } from './ApiDocumentationMenu'; import { ApiDocumentationEndpoint } from './ApiDocumentationEndpoint'; import { ApiDocumentationOverview } from './ApiDocumentationOverview'; export const ApiDocumentationApp: FC = ({ endpoints }) => { const getHashParts = () => String(window.location.hash.replace(/^#(.*)$/, '$1')).match(/^([^/]+)(?:\/([^/]+))?/); const endpointParts = getHashParts(); const [activeEndpoint, setActiveEndpoint] = useState(); const [activeAction, setActiveAction] = useState(); const [menuOpen, setMenuOpen] = useState(true); const selectedEndpoint = endpoints.find((endpointItem) => endpointItem.route === activeEndpoint); const onHashChanged = () => { const parts = getHashParts(); if (parts) { setActiveEndpoint(parts[1] || undefined); setActiveAction(parts[2] || 'default'); } else { setActiveEndpoint(undefined); } }; useEffect(() => onHashChanged(), [endpointParts]); const setEndpoint = (endpoint: string | undefined) => { window.location.href = `${window.location.href.replace(/^(.+)#(.*)$/, '$1')}#${endpoint}`; }; useEffect(() => { window.addEventListener('hashchange', onHashChanged); return () => { window.removeEventListener('hashchange', onHashChanged); }; }, []); return ( setMenuOpen(!menuOpen)} /> {selectedEndpoint ? ( ) : ( )} ); };