import type { Folder, GrpcRequest, HttpRequest, WebsocketRequest } from "@yaakapp-internal/models"; import { foldersAtom } from "@yaakapp-internal/models"; import { Heading, HStack, Icon, LoadingIcon } from "@yaakapp-internal/ui"; import classNames from "classnames"; import { useAtomValue } from "jotai"; import type { CSSProperties, ReactNode } from "react"; import { useCallback, useMemo } from "react"; import { allRequestsAtom } from "../hooks/useAllRequests"; import { useFolderActions } from "../hooks/useFolderActions"; import { useLatestHttpResponse } from "../hooks/useLatestHttpResponse"; import { sendAnyHttpRequest } from "../hooks/useSendAnyHttpRequest"; import { showDialog } from "../lib/dialog"; import { resolvedModelName } from "../lib/resolvedModelName"; import { router } from "../lib/router"; import { Button } from "./core/Button"; import { HttpResponseDurationTag } from "./core/HttpResponseDurationTag"; import { HttpStatusTag } from "./core/HttpStatusTag"; import { IconButton } from "./core/IconButton"; import { Separator } from "./core/Separator"; import { SizeTag } from "./core/SizeTag"; import { HttpResponsePane } from "./HttpResponsePane"; interface Props { folder: Folder; style: CSSProperties; } export function FolderLayout({ folder, style }: Props) { const folders = useAtomValue(foldersAtom); const requests = useAtomValue(allRequestsAtom); const folderActions = useFolderActions(); const sendAllAction = useMemo( () => folderActions.find((a) => a.label === "Send All"), [folderActions], ); const children = useMemo(() => { return [ ...folders.filter((f) => f.folderId === folder.id), ...requests.filter((r) => r.folderId === folder.id), ]; }, [folder.id, folders, requests]); const handleSendAll = useCallback(() => { sendAllAction?.call(folder); }, [sendAllAction, folder]); return (
{request.method} {request.url}
{latestResponse ? (
) : (