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), })), ]} > ); };