"use client"; import Link from "next/link"; import { Badge } from "@/components/ui/badge"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { cn, getInitials } from "@/lib/utils"; import { CalendarDays, Eye, ListTodo, AlertCircle, CheckCircle2, } from "lucide-react"; import { formatDistanceToNow } from "date-fns"; import { TASK_STATUS_CONFIG, TASK_TYPE_LABELS } from "@/components/tasks/TaskCard"; import { TaskStatus, TaskType } from "@prisma/client"; const PRIORITY_DOT: Record = { LOW: "bg-zinc-500", NORMAL: "bg-blue-500", HIGH: "bg-amber-500", URGENT: "bg-red-500", }; interface TaskRow { id: string; title: string; type: TaskType; status: TaskStatus; priority: string; dueDate: Date | null; shot?: { shotCode: string } | null; asset?: { assetCode: string } | null; project: { id: string; name: string; code: string }; assignedArtist?: { id: string; name: string | null; email: string; image: string | null } | null; } function TaskRow({ task }: { task: TaskRow }) { const cfg = TASK_STATUS_CONFIG[task.status]; const Icon = cfg.icon; const contextCode = task.shot?.shotCode ?? task.asset?.assetCode; const isOverdue = task.dueDate && new Date(task.dueDate) < new Date() && task.status !== "DONE"; return (
{task.title} {contextCode && ( {contextCode} )}
{TASK_TYPE_LABELS[task.type]} · {task.project.code}
{task.assignedArtist && ( {getInitials(task.assignedArtist.name ?? task.assignedArtist.email)} )} {task.dueDate && ( {formatDistanceToNow(new Date(task.dueDate), { addSuffix: true })} )} {cfg.label}
); } interface TaskWidgetsProps { myTasks: TaskRow[]; reviewTasks: TaskRow[]; role: string; } export function TaskWidgets({ myTasks, reviewTasks, role }: TaskWidgetsProps) { const isArtist = role === "ARTIST"; const showReview = !isArtist && reviewTasks.length > 0; if (myTasks.length === 0 && reviewTasks.length === 0) return null; return (
{/* My Tasks */} {myTasks.length > 0 && (
My Tasks {myTasks.length}
View all →
{myTasks.map((task) => ( ))}
)} {/* Tasks In Review (supervisors/producers) */} {showReview && (
Needs Review {reviewTasks.length}
View all →
{reviewTasks.map((task) => ( ))}
)}
); }