"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, locale } = useTranslation(); const groupColor = task.group_color || "#6b7280"; 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 dateLocale = locale === "ua" ? "uk-UA" : locale === "cs" ? "cs-CZ" : locale === "he" ? "he-IL" : "ru-RU"; const swipeHandlers = useSwipeable({ onSwiping: (e) => { // Only allow right swipe for complete gesture 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 dot on left edge */}
{/* Group color accent bar on top (mobile) */}
{/* Mobile: compact one-line layout */}
{/* Group icon */} {task.group_icon && ( {task.group_icon} )} {/* Content - mobile compact */}
{/* Title + status on one line on mobile */}

{task.title}

{/* Description - hidden on very small screens */} {task.description && (

{task.description}

)} {/* Meta row */}
{task.group_name && ( {task.group_name} )} {task.due_at && ( {new Date(task.due_at).toLocaleDateString(dateLocale)} )}
{/* Priority indicator */}
); }