import { type } from '@tauri-apps/plugin-os'; import { settingsAtom, workspacesAtom } from '@yaakapp-internal/models'; import { HeaderSize, SidebarLayout } from '@yaakapp-internal/ui'; import classNames from 'classnames'; import { useAtomValue } from 'jotai'; import * as m from 'motion/react-m'; import { useMemo, useState } from 'react'; import { useEnsureActiveCookieJar, useSubscribeActiveCookieJarId, } from '../hooks/useActiveCookieJar'; import { activeEnvironmentAtom, useSubscribeActiveEnvironmentId, } from '../hooks/useActiveEnvironment'; import { activeFolderAtom } from '../hooks/useActiveFolder'; import { useSubscribeActiveFolderId } from '../hooks/useActiveFolderId'; import { activeRequestAtom } from '../hooks/useActiveRequest'; import { useSubscribeActiveRequestId } from '../hooks/useActiveRequestId'; import { activeWorkspaceAtom } from '../hooks/useActiveWorkspace'; import { useFloatingSidebarHidden } from '../hooks/useFloatingSidebarHidden'; import { useHotKey } from '../hooks/useHotKey'; import { useSubscribeRecentCookieJars } from '../hooks/useRecentCookieJars'; import { useSubscribeRecentEnvironments } from '../hooks/useRecentEnvironments'; import { useSubscribeRecentRequests } from '../hooks/useRecentRequests'; import { useSubscribeRecentWorkspaces } from '../hooks/useRecentWorkspaces'; import { useSidebarHidden } from '../hooks/useSidebarHidden'; import { useSidebarWidth } from '../hooks/useSidebarWidth'; import { useSyncWorkspaceRequestTitle } from '../hooks/useSyncWorkspaceRequestTitle'; import { duplicateRequestOrFolderAndNavigate } from '../lib/duplicateRequestOrFolderAndNavigate'; import { importData } from '../lib/importData'; import { jotaiStore } from '../lib/jotai'; import { CreateDropdown } from './CreateDropdown'; import { Banner } from './core/Banner'; import { Button } from './core/Button'; import { HotkeyList } from './core/HotkeyList'; import { FeedbackLink } from './core/Link'; import { HStack } from './core/Stacks'; import { ErrorBoundary } from './ErrorBoundary'; import { FolderLayout } from './FolderLayout'; import { GrpcConnectionLayout } from './GrpcConnectionLayout'; import { HttpRequestLayout } from './HttpRequestLayout'; import Sidebar from './Sidebar'; import { SidebarActions } from './SidebarActions'; import { WebsocketRequestLayout } from './WebsocketRequestLayout'; import { WorkspaceHeader } from './WorkspaceHeader'; const body = { gridArea: 'body' }; export function Workspace() { // First, subscribe to some things applicable to workspaces useGlobalWorkspaceHooks(); const workspaces = useAtomValue(workspacesAtom); const settings = useAtomValue(settingsAtom); const osType = type(); const [width, setWidth] = useSidebarWidth(); const [sidebarHidden, setSidebarHidden] = useSidebarHidden(); const [floatingSidebarHidden, setFloatingSidebarHidden] = useFloatingSidebarHidden(); const activeEnvironment = useAtomValue(activeEnvironmentAtom); const [floating, setFloating] = useState(false); const environmentBgStyle = useMemo(() => { if (activeEnvironment?.color == null) return undefined; const background = `linear-gradient(to right, ${activeEnvironment.color} 15%, transparent 40%)`; return { background }; }, [activeEnvironment?.color]); // We're loading still if (workspaces.length === 0) { return null; } const header = (
); const workspaceBody = ( ); const sidebarContent = floating ? (
) : (
); return (
{header}
); } function WorkspaceBody() { const activeRequest = useAtomValue(activeRequestAtom); const activeFolder = useAtomValue(activeFolderAtom); const activeWorkspace = useAtomValue(activeWorkspaceAtom); if (activeWorkspace == null) { return ( The active workspace was not found. Select a workspace from the header menu or report this bug to ); } if (activeRequest?.model === 'grpc_request') { return ; } if (activeRequest?.model === 'websocket_request') { return ; } if (activeRequest?.model === 'http_request') { return ; } if (activeFolder != null) { return ; } return ( } /> ); } function useGlobalWorkspaceHooks() { useEnsureActiveCookieJar(); useSubscribeActiveRequestId(); useSubscribeActiveFolderId(); useSubscribeActiveEnvironmentId(); useSubscribeActiveCookieJarId(); useSubscribeRecentRequests(); useSubscribeRecentWorkspaces(); useSubscribeRecentEnvironments(); useSubscribeRecentCookieJars(); useSyncWorkspaceRequestTitle(); useHotKey('model.duplicate', () => duplicateRequestOrFolderAndNavigate(jotaiStore.get(activeRequestAtom)), ); }