Files
kanban/src/components/TaskCard.tsx
2026-02-16 23:23:53 +01:00

94 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { useState } from 'react';
import { useSortable } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import type { Task } from '../types';
interface TaskCardProps {
task: Task;
isDragging?: boolean;
onDelete?: () => void;
onUpdate?: (updates: Partial<Task>) => void;
}
export function TaskCard({ task, isDragging, onDelete, onUpdate }: TaskCardProps) {
const [isEditing, setIsEditing] = useState(false);
const [editTitle, setEditTitle] = useState(task.title);
const {
attributes,
listeners,
setNodeRef,
transform,
transition,
isDragging: isSortableDragging,
} = useSortable({ id: task.id });
const style = {
transform: CSS.Transform.toString(transform),
transition,
opacity: isSortableDragging ? 0.5 : 1,
};
const handleSave = () => {
if (editTitle.trim() && onUpdate) {
onUpdate({ title: editTitle.trim() });
}
setIsEditing(false);
};
if (isDragging) {
return (
<div className="task-card task-card-overlay">
<p>{task.title}</p>
</div>
);
}
return (
<div
ref={setNodeRef}
style={style}
className="task-card"
{...attributes}
{...listeners}
>
{isEditing ? (
<div className="task-edit" onClick={(e) => e.stopPropagation()}>
<input
type="text"
value={editTitle}
onChange={(e) => setEditTitle(e.target.value)}
onKeyDown={(e) => e.key === 'Enter' && handleSave()}
autoFocus
/>
<button onClick={handleSave}>Save</button>
</div>
) : (
<>
<p>{task.title}</p>
<div className="task-actions">
<button
onClick={(e) => {
e.stopPropagation();
setIsEditing(true);
}}
title="Edit"
>
</button>
<button
onClick={(e) => {
e.stopPropagation();
onDelete?.();
}}
title="Delete"
>
🗑
</button>
</div>
</>
)}
</div>
);
}