"use client"; import { useState, useRef } from "react"; import { Task } from "@/lib/api"; import { useTranslation } from "@/lib/i18n"; import StatusBadge from "./StatusBadge"; import Link from "next/link"; import { useSwipeable } from "react-swipeable"; interface TaskCardProps { task: Task; onComplete?: (taskId: string) => void; } const PRIORITY_COLORS: Record = { urgent: "#ef4444", high: "#f97316", medium: "#eab308", low: "#22c55e", }; function isDone(status: string): boolean { return status === "done" || status === "completed"; } export default function TaskCard({ task, onComplete }: TaskCardProps) { const { t } = useTranslation(); const priorityColor = PRIORITY_COLORS[task.priority] || PRIORITY_COLORS.medium; const taskDone = isDone(task.status); const [swipeOffset, setSwipeOffset] = useState(0); const [swiped, setSwiped] = useState(false); const cardRef = useRef(null); const SWIPE_THRESHOLD = 120; const swipeHandlers = useSwipeable({ onSwiping: (e) => { if (e.dir === "Right" && !taskDone && onComplete) { const offset = Math.min(e.deltaX, 160); setSwipeOffset(offset); } }, onSwipedRight: (e) => { if (e.absX > SWIPE_THRESHOLD && !taskDone && onComplete) { setSwiped(true); setTimeout(() => { onComplete(task.id); }, 300); } else { setSwipeOffset(0); } }, onSwiped: () => { if (!swiped) setSwipeOffset(0); }, trackMouse: false, trackTouch: true, preventScrollOnSwipe: false, delta: 10, }); const showCompleteHint = swipeOffset > 40; return (
{/* Swipe background - green complete indicator */} {onComplete && !taskDone && (
SWIPE_THRESHOLD ? "bg-green-500" : "bg-green-400/80" }`} >
{t("tasks.status.done")}
)}
{/* Priority line on left edge */}
{/* Group icon */} {task.group_icon && ( {task.group_icon} )} {/* Title - single line, truncated */}

{task.title}

{/* Status badge */}
{/* Priority dot */}
); }