import Link from 'next/link'; import { prisma } from '@/lib/prisma'; import { toProductDTO } from '@/lib/product'; import { fetchActivePromotions } from '@/lib/promotions'; import AdminNav from '@/components/AdminNav'; import ProductMockup from '@/components/ProductMockup'; import { deleteProduct } from './actions'; export default async function AdminProductsPage({ searchParams, }: { searchParams: { error?: string }; }) { const activePromotions = await fetchActivePromotions(); let products = []; try { const rows = await prisma.product.findMany(); products = rows.map((p) => toProductDTO(p, activePromotions)).sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() ); } catch (err) { console.error('Error fetching products:', err); } return (

Products

+ Add product
{searchParams.error === 'in_use' && (
Can't delete that product — it has existing orders or design proofs tied to it.
)} {products.length === 0 ? (

No products yet.

) : (
{products.map((p) => (
{(p.colorPhotos[p.colors[0]] ?? p.imageUrl) ? ( {p.name} ) : ( )}

{p.name}

{p.category.replace('_', ' ')} · £${(p.basePrice / 100).toFixed(2)} · {p.colors.length}{' '} color{p.colors.length === 1 ? '' : 's'} {p.sizes.length > 0 && ` · ${p.sizes.join('/')}`}

Edit → View →
))}
)}
); }