import type { HttpResponse } from "@yaakapp-internal/models"; import { deleteModel } from "@yaakapp-internal/models"; import { useCopyHttpResponse } from "../hooks/useCopyHttpResponse"; import { useDeleteHttpResponses } from "../hooks/useDeleteHttpResponses"; import { useSaveResponse } from "../hooks/useSaveResponse"; import { pluralize } from "../lib/pluralize"; import { Dropdown } from "./core/Dropdown"; import { HttpStatusTag } from "./core/HttpStatusTag"; import { Icon } from "./core/Icon"; import { IconButton } from "./core/IconButton"; import { HStack } from "./core/Stacks"; interface Props { responses: HttpResponse[]; activeResponse: HttpResponse; onPinnedResponseId: (id: string) => void; className?: string; } export const RecentHttpResponsesDropdown = function ResponsePane({ activeResponse, responses, onPinnedResponseId, }: Props) { const deleteAllResponses = useDeleteHttpResponses(activeResponse?.requestId); const latestResponseId = responses[0]?.id ?? "n/a"; const saveResponse = useSaveResponse(activeResponse); const copyResponse = useCopyHttpResponse(activeResponse); return ( , hidden: responses.length === 0 || !!activeResponse.error, disabled: activeResponse.state !== "closed" && activeResponse.status >= 100, }, { label: "Copy Body", onSelect: copyResponse.mutate, leftSlot: , hidden: responses.length === 0 || !!activeResponse.error, disabled: activeResponse.state !== "closed" && activeResponse.status >= 100, }, { label: "Delete", leftSlot: , onSelect: () => deleteModel(activeResponse), }, { label: "Unpin Response", onSelect: () => onPinnedResponseId(activeResponse.id), leftSlot: , hidden: latestResponseId === activeResponse.id, disabled: responses.length === 0, }, { type: "separator", label: "History" }, { label: `Delete ${responses.length} ${pluralize("Response", responses.length)}`, onSelect: deleteAllResponses.mutate, hidden: responses.length === 0, disabled: responses.length === 0, }, { type: "separator" }, ...responses.map((r: HttpResponse) => ({ label: ( {" "} {r.elapsed >= 0 ? `${r.elapsed}ms` : "n/a"} ), leftSlot: activeResponse?.id === r.id ? : , onSelect: () => onPinnedResponseId(r.id), })), ]} > ); };