'use client' import { Eye, Heart, Settings } from 'lucide-react' import Link from 'next/link' import { useEffect, useState } from 'react' import { useAuth } from '../lib/auth/hooks' import { getUserProjectLikes, toggleProjectLike } from '../lib/projects/actions' import type { Project } from '../lib/projects/types' import { ProjectSettingsDialog } from './project-settings-dialog' interface ProjectGridProps { projects: Project[] onProjectClick: (id: string) => void onViewClick?: (id: string) => void showOwner: boolean canEdit?: boolean onUpdate?: () => void } export function ProjectGrid({ projects, onProjectClick, onViewClick, showOwner, canEdit = false, onUpdate, }: ProjectGridProps) { const { isAuthenticated } = useAuth() const [settingsProject, setSettingsProject] = useState(null) const [userLikes, setUserLikes] = useState>({}) const [likeCounts, setLikeCounts] = useState>({}) useEffect(() => { const counts: Record = {} projects.forEach((proj) => { counts[proj.id] = proj.likes }) setLikeCounts(counts) }, [projects]) useEffect(() => { if (!isAuthenticated) { setUserLikes({}) return } const projectIds = projects.map((p) => p.id) if (projectIds.length === 0) return getUserProjectLikes(projectIds).then((result) => { if (result.success && result.data) { setUserLikes(result.data) } }) }, [projects, isAuthenticated]) const handleSettingsClick = (e: React.MouseEvent, project: Project) => { e.stopPropagation() setSettingsProject(project) } const handleViewClick = (e: React.MouseEvent, projectId: string) => { e.stopPropagation() onViewClick?.(projectId) } const handleLikeClick = async (e: React.MouseEvent, projectId: string) => { e.stopPropagation() if (!isAuthenticated) return const wasLiked = userLikes[projectId] || false const currentCount = likeCounts[projectId] || 0 setUserLikes((prev) => ({ ...prev, [projectId]: !wasLiked })) setLikeCounts((prev) => ({ ...prev, [projectId]: wasLiked ? currentCount - 1 : currentCount + 1, })) const result = await toggleProjectLike(projectId) if (result.success && result.data) { const data = result.data setUserLikes((prev) => ({ ...prev, [projectId]: data.liked })) setLikeCounts((prev) => ({ ...prev, [projectId]: data.likes })) } else { setUserLikes((prev) => ({ ...prev, [projectId]: wasLiked })) setLikeCounts((prev) => ({ ...prev, [projectId]: currentCount })) } } return ( <>
{projects.map((project) => { const owner = project.owner return (
onProjectClick(project.id)} className="group text-left cursor-pointer" > {/* Thumbnail card */}
{project.thumbnail_url ? ( {project.name} ) : (
No preview
)} {canEdit && (
{onViewClick && ( )}
)}
{/* Info row below the card */}
{showOwner && owner ? ( e.stopPropagation()} className="shrink-0" > {owner.image ? ( {owner.name} ) : (
{owner.name?.[0]?.toUpperCase() || '?'}
)} ) : null}

{project.name}

{showOwner && owner && ( <> e.stopPropagation()} className="hover:text-foreground transition-colors truncate" > {owner.username || owner.name} · )}
{project.views}
·
) })}
{settingsProject && ( !open && setSettingsProject(null)} onUpdate={onUpdate} onDelete={() => { setSettingsProject(null) onUpdate?.() }} /> )} ) }