import type { HttpResponse } from '@yaakapp/api'; import { useCopyHttpResponse } from '../hooks/useCopyHttpResponse'; import { useDeleteHttpResponse } from '../hooks/useDeleteHttpResponse'; import { useDeleteHttpResponses } from '../hooks/useDeleteHttpResponses'; import { useSaveResponse } from '../hooks/useSaveResponse'; import { pluralize } from '../lib/pluralize'; import { Dropdown } from './core/Dropdown'; import { Icon } from './core/Icon'; import { IconButton } from './core/IconButton'; import { HStack } from './core/Stacks'; import { StatusTag } from './core/StatusTag'; interface Props { responses: HttpResponse[]; activeResponse: HttpResponse; onPinnedResponseId: (id: string) => void; className?: string; } export const RecentResponsesDropdown = function ResponsePane({ activeResponse, responses, onPinnedResponseId, }: Props) { const deleteResponse = useDeleteHttpResponse(activeResponse?.id ?? null); 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, disabled: responses.length === 0, }, { key: 'copy', label: 'Copy to Clipboard', onSelect: copyResponse.mutate, leftSlot: , hidden: responses.length === 0, disabled: responses.length === 0, }, { key: 'clear-single', label: 'Delete', leftSlot: , onSelect: deleteResponse.mutate, disabled: responses.length === 0, }, { key: 'unpin', label: 'Unpin Response', onSelect: () => onPinnedResponseId(activeResponse.id), leftSlot: , hidden: latestResponseId === activeResponse.id, disabled: responses.length === 0, }, { type: 'separator', label: 'History' }, { key: 'clear-all', label: `Delete ${responses.length} ${pluralize('Response', responses.length)}`, onSelect: deleteAllResponses.mutate, hidden: responses.length === 0, disabled: responses.length === 0, }, { type: 'separator' }, ...responses.slice(0, 20).map((r: HttpResponse) => ({ key: r.id, label: ( {' '} {r.elapsed >= 0 ? `${r.elapsed}ms` : 'n/a'} ), leftSlot: activeResponse?.id === r.id ? : , onSelect: () => onPinnedResponseId(r.id), })), ]} > ); };