import type { Folder, GrpcRequest, HttpRequest, WebsocketRequest } from "@yaakapp-internal/models"; import { foldersAtom } from "@yaakapp-internal/models"; 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 { fireAndForget } from "../lib/fireAndForget"; import { showDialog } from "../lib/dialog"; import { resolvedModelName } from "../lib/resolvedModelName"; import { router } from "../lib/router"; import { Button } from "./core/Button"; import { Heading } from "./core/Heading"; import { HttpResponseDurationTag } from "./core/HttpResponseDurationTag"; import { HttpStatusTag } from "./core/HttpStatusTag"; import { Icon } from "./core/Icon"; import { IconButton } from "./core/IconButton"; import { LoadingIcon } from "./core/LoadingIcon"; import { Separator } from "./core/Separator"; import { SizeTag } from "./core/SizeTag"; import { HStack } from "./core/Stacks"; 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(() => { if (sendAllAction) fireAndForget(sendAllAction.call(folder)); }, [sendAllAction, folder]); return (
{resolvedModelName(folder)}
{children.map((child) => ( ))}
); } function ChildCard({ child }: { child: Folder | HttpRequest | GrpcRequest | WebsocketRequest }) { let card: ReactNode; if (child.model === "folder") { card = ; } else if (child.model === "http_request") { card = ; } else if (child.model === "grpc_request") { card = ; } else if (child.model === "websocket_request") { card = ; } else { card =
Unknown model
; } const navigate = useCallback(async () => { await router.navigate({ to: "/workspaces/$workspaceId", params: { workspaceId: child.workspaceId }, search: (prev) => ({ ...prev, request_id: child.id }), }); }, [child.id, child.workspaceId]); return (
{child.model === "folder" && } {resolvedModelName(child)} { sendAnyHttpRequest.mutate(child.id); }} />
{card}
); } function FolderCard({ folder }: { folder: Folder }) { return (
); } function RequestCard({ request }: { request: HttpRequest | GrpcRequest | WebsocketRequest }) { return
TODO {request.id}
; } function HttpRequestCard({ request }: { request: HttpRequest }) { const latestResponse = useLatestHttpResponse(request.id); return (
{request.method} {request.url} {latestResponse ? ( ) : (
No Responses
)}
); }