import { useNavigate } from 'react-router-dom'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import { format, isPast, parseISO } from 'date-fns'; import { Calendar, Pin, Users } from 'lucide-react'; import api from '@/lib/api'; import type { Project } from '@/types'; import { useSettings } from '@/hooks/useSettings'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { statusColors, statusLabels } from './constants'; interface ProjectCardProps { project: Project; onEdit: (project: Project) => void; } export default function ProjectCard({ project }: ProjectCardProps) { const navigate = useNavigate(); const queryClient = useQueryClient(); const { settings } = useSettings(); const isShared = project.user_id !== (settings?.user_id ?? 0); const toggleTrackMutation = useMutation({ mutationFn: async () => { const { data } = await api.put(`/projects/${project.id}`, { is_tracked: !project.is_tracked }); return data; }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['projects'] }); queryClient.invalidateQueries({ queryKey: ['tracked-tasks'] }); toast.success(project.is_tracked ? 'Project untracked' : 'Project tracked'); }, onError: () => { toast.error('Failed to update tracking'); }, }); const completedTasks = project.tasks?.filter((t) => t.status === 'completed').length || 0; const totalTasks = project.tasks?.length || 0; const progress = totalTasks > 0 ? (completedTasks / totalTasks) * 100 : 0; const isOverdue = project.due_date && project.status !== 'completed' && isPast(parseISO(project.due_date)); return ( navigate(`/projects/${project.id}`)} > {!isShared && ( )}
{project.name} {statusLabels[project.status]}
{project.description || No description}
{totalTasks > 0 && (
Progress {completedTasks}/{totalTasks} tasks
)} {project.due_date && (
Due {format(parseISO(project.due_date), 'MMM d, yyyy')}
)} {/* Sharing indicator — shows for both owner and shared users */} {project.member_count > 0 && (
{isShared ? 'Shared with you' : `${project.member_count} member${project.member_count !== 1 ? 's' : ''}`}
)} ); }