// @ts-nocheck - header component props with optional handlers and status variants import { memo, useState } from 'react'; import { Feature } from '@/store/app-store'; import { cn } from '@/lib/utils'; import { CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { GripVertical, Edit, Trash2, FileText, MoreVertical, ChevronDown, ChevronUp, GitFork, } from 'lucide-react'; import { Spinner } from '@/components/ui/spinner'; import { CountUpTimer } from '@/components/ui/count-up-timer'; import { formatModelName, DEFAULT_MODEL } from '@/lib/agent-context-parser'; import { DeleteConfirmDialog } from '@/components/ui/delete-confirm-dialog'; import { getProviderIconForModel } from '@/components/ui/provider-icon'; interface CardHeaderProps { feature: Feature; isDraggable: boolean; isCurrentAutoTask: boolean; isSelectionMode?: boolean; onEdit: () => void; onDelete: () => void; onViewOutput?: () => void; onSpawnTask?: () => void; } export const CardHeaderSection = memo(function CardHeaderSection({ feature, isDraggable, isCurrentAutoTask, isSelectionMode = false, onEdit, onDelete, onViewOutput, onSpawnTask, }: CardHeaderProps) { const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const handleDeleteClick = (e: React.MouseEvent) => { e.stopPropagation(); setIsDeleteDialogOpen(true); }; const handleConfirmDelete = () => { onDelete(); }; return ( {/* Running task header */} {isCurrentAutoTask && !isSelectionMode && (
{feature.startedAt && ( )}
{ e.stopPropagation(); onEdit(); }} data-testid={`edit-running-${feature.id}`} className="text-xs" > Edit { e.stopPropagation(); onSpawnTask?.(); }} data-testid={`spawn-running-${feature.id}`} className="text-xs" > Spawn Sub-Task {/* Model info in dropdown */} {(() => { const ProviderIcon = getProviderIconForModel(feature.model); return (
{formatModelName(feature.model ?? DEFAULT_MODEL)}
); })()}
)} {/* Backlog header */} {!isCurrentAutoTask && !isSelectionMode && feature.status === 'backlog' && (
)} {/* Waiting approval / Verified header */} {!isCurrentAutoTask && !isSelectionMode && (feature.status === 'waiting_approval' || feature.status === 'verified') && ( <>
{onViewOutput && ( )}
)} {/* In progress header */} {!isCurrentAutoTask && feature.status === 'in_progress' && ( <>
{ e.stopPropagation(); onEdit(); }} data-testid={`edit-feature-${feature.id}`} className="text-xs" > Edit {onViewOutput && ( { e.stopPropagation(); onViewOutput(); }} data-testid={`view-logs-${feature.id}`} className="text-xs" > View Logs )} { e.stopPropagation(); onSpawnTask?.(); }} data-testid={`spawn-feature-${feature.id}`} className="text-xs" > Spawn Sub-Task {/* Model info in dropdown */} {(() => { const ProviderIcon = getProviderIconForModel(feature.model); return (
{formatModelName(feature.model ?? DEFAULT_MODEL)}
); })()}
)} {/* Title and description */}
{isDraggable && (
)}
{feature.titleGenerating ? (
Generating title...
) : feature.title ? ( {feature.title} ) : null} {feature.description || feature.summary || feature.id} {(feature.description || feature.summary || '').length > 100 && ( )}
{/* Delete Confirmation Dialog */}
); });