import classNames from 'classnames'; import { motion } from 'framer-motion'; import type { CSSProperties, MouseEvent as ReactMouseEvent } from 'react'; import { useCallback, useMemo, useRef, useState } from 'react'; import { useWindowSize } from 'react-use'; import { useActiveRequest } from '../hooks/useActiveRequest'; import { useActiveWorkspace } from '../hooks/useActiveWorkspace'; import { useActiveWorkspaceId } from '../hooks/useActiveWorkspaceId'; import { useFloatingSidebarHidden } from '../hooks/useFloatingSidebarHidden'; import { useImportData } from '../hooks/useImportData'; import { useShouldFloatSidebar } from '../hooks/useShouldFloatSidebar'; import { useSidebarHidden } from '../hooks/useSidebarHidden'; import { useSidebarWidth } from '../hooks/useSidebarWidth'; import { useSyncWorkspaceRequestTitle } from '../hooks/useSyncWorkspaceRequestTitle'; import { useWorkspaces } from '../hooks/useWorkspaces'; import { Banner } from './core/Banner'; import { Button } from './core/Button'; import { HotKeyList } from './core/HotKeyList'; import { InlineCode } from './core/InlineCode'; import { FeedbackLink } from './core/Link'; import { HStack } from './core/Stacks'; import { CreateDropdown } from './CreateDropdown'; import { GrpcConnectionLayout } from './GrpcConnectionLayout'; import { HeaderSize } from './HeaderSize'; import { HttpRequestLayout } from './HttpRequestLayout'; import { Overlay } from './Overlay'; import { ResizeHandle } from './ResizeHandle'; import { Sidebar } from './Sidebar'; import { SidebarActions } from './SidebarActions'; import { WorkspaceHeader } from './WorkspaceHeader'; const side = { gridArea: 'side' }; const head = { gridArea: 'head' }; const body = { gridArea: 'body' }; const drag = { gridArea: 'drag' }; export default function Workspace() { useSyncWorkspaceRequestTitle(); const workspaces = useWorkspaces(); const activeWorkspace = useActiveWorkspace(); const activeWorkspaceId = useActiveWorkspaceId(); const { setWidth, width, resetWidth } = useSidebarWidth(); const [sidebarHidden, setSidebarHidden] = useSidebarHidden(); const [floatingSidebarHidden, setFloatingSidebarHidden] = useFloatingSidebarHidden(); const activeRequest = useActiveRequest(); const windowSize = useWindowSize(); const importData = useImportData(); const floating = useShouldFloatSidebar(); const [isResizing, setIsResizing] = useState(false); const moveState = useRef<{ move: (e: MouseEvent) => void; up: (e: MouseEvent) => void } | null>( null, ); const unsub = () => { if (moveState.current !== null) { document.documentElement.removeEventListener('mousemove', moveState.current.move); document.documentElement.removeEventListener('mouseup', moveState.current.up); } }; const handleResizeStart = useCallback( (e: ReactMouseEvent) => { if (width === undefined) return; unsub(); const mouseStartX = e.clientX; const startWidth = width; moveState.current = { move: async (e: MouseEvent) => { e.preventDefault(); // Prevent text selection and things const newWidth = startWidth + (e.clientX - mouseStartX); if (newWidth < 50) { await setSidebarHidden(true); resetWidth(); } else { await setSidebarHidden(false); setWidth(newWidth); } }, up: (e: MouseEvent) => { e.preventDefault(); unsub(); setIsResizing(false); }, }; document.documentElement.addEventListener('mousemove', moveState.current.move); document.documentElement.addEventListener('mouseup', moveState.current.up); setIsResizing(true); }, [width, setSidebarHidden, resetWidth, setWidth], ); const sideWidth = sidebarHidden ? 0 : width; const styles = useMemo( () => ({ gridTemplate: floating ? ` ' ${head.gridArea}' auto ' ${body.gridArea}' minmax(0,1fr) / 1fr` : ` ' ${head.gridArea} ${head.gridArea} ${head.gridArea}' auto ' ${side.gridArea} ${drag.gridArea} ${body.gridArea}' minmax(0,1fr) / ${sideWidth}px 0 1fr`, }), [sideWidth, floating], ); if (windowSize.width <= 100) { return (
); } // We're loading still if (workspaces.length === 0) { return null; } return (
{floating ? ( setFloatingSidebarHidden(true)} > ) : ( <>
)} {activeWorkspace == null ? (
The active workspace{' '} {activeWorkspaceId} was not found. Select a workspace from the header menu or report this bug to
) : activeRequest == null ? ( } /> ) : activeRequest.model === 'grpc_request' ? ( ) : ( )}
); }