import { type } from "@tauri-apps/plugin-os"; import { settingsAtom, workspacesAtom } from "@yaakapp-internal/models"; import { Banner, HeaderSize, HStack, 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 { Button } from "./core/Button"; import { HotkeyList } from "./core/HotkeyList"; import { FeedbackLink } from "./core/Link"; 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)), ); }