"use client"; import Image from "next/image"; import Link from "next/link"; import { useState } from "react"; import type { MaterialItem } from "@/data/site-content"; type MaterialCatalogProps = { heroImage: string; intro: string; deliveryNote: string; materials: MaterialItem[]; }; export function MaterialCatalog({ heroImage, intro, deliveryNote, materials, }: MaterialCatalogProps) { const [selectedSubcategories, setSelectedSubcategories] = useState( [], ); const subcategories = Array.from( new Set(materials.map((material) => material.subcategory)), ).sort((left, right) => left.localeCompare(right)); const filteredMaterials = selectedSubcategories.length === 0 ? materials : materials.filter((material) => selectedSubcategories.includes(material.subcategory), ); function toggleFilter(subcategory: string) { setSelectedSubcategories((current) => current.includes(subcategory) ? current.filter((value) => value !== subcategory) : [...current, subcategory], ); } return (
Material category hero
Project-ready inventory

Materials organized for faster quoting.

{intro}

Showing {filteredMaterials.length}{" "} {filteredMaterials.length === 1 ? "material" : "materials"}

{selectedSubcategories.map((subcategory) => ( {subcategory} ))}
{filteredMaterials.length > 0 ? (
{filteredMaterials.map((material) => (
{material.name}
{material.subcategory}

{material.name}

{material.description}

{material.purchaseUnit} Request quote
))}
) : (

No materials match that filter yet.

Clear the filters to see the full inventory list again.

)}
); }