"use client"; import { useEffect, useState } from "react"; import { useParams } from "next/navigation"; import Image from "next/image"; import Link from "next/link"; import ReactMarkdown from "react-markdown"; export default function ProjectDetailPage() { const { id } = useParams(); const [project, setProject] = useState(null); useEffect(() => { if (!id) return; const url = new URL(`${process.env.NEXT_PUBLIC_API_BASE_URL}/items/projects/${id}`); url.searchParams.set( "fields", "submission_id,title,uploader,category,tags,p_image.filename_disk,p_image.title,p_files.directus_files_id.filename_disk" ); url.searchParams.set("limit", "1"); fetch(url.toString()) .then((res) => res.json()) .then((data) => setProject(data.data)) .catch(() => setProject(null)); }, [id]); if (!project) { return (
← Back to Projects

Loading project…

); } const imageSrc = project.p_image?.filename_disk ? `${process.env.NEXT_PUBLIC_ASSET_URL || "https://forms.lasereverything.net"}/assets/${project.p_image.filename_disk}` : null; const fileList: string[] = Array.isArray(project.p_files) ? project.p_files .map((f: any) => f?.directus_files_id?.filename_disk) .filter(Boolean) : []; return (
← Back to Projects
{imageSrc ? ( {project.p_image?.title ) : (
No preview image
)}

Files

{fileList.length > 0 ? (
{fileList.map((fname, i) => ( {fname} ))}
) : (

No files attached.

)}

{project.title}

Uploaded by: {project.uploader || "—"}

Category: {project.category || "—"}

{Array.isArray(project.tags) && project.tags.length > 0 ? ( project.tags.map((tag, i) => ( {tag} )) ) : ( No tags )}
{/* Optional long description if you add one later */} {project.body ? (
{project.body}
) : null}
); }