← back to Homesonspec
apps/web/src/app/builders/[slug]/page.tsx
61 lines
import Link from "next/link";
import { notFound } from "next/navigation";
import { prisma } from "@homesonspec/database";
import { fmtPrice } from "@homesonspec/shared-ui";
export const dynamic = "force-dynamic";
export default async function BuilderPage({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const builder = await prisma.builder.findUnique({
where: { slug },
include: {
divisions: true,
communities: { include: { _count: { select: { homes: { where: { status: "PUBLISHED", isDemo: false } } } } } },
},
});
if (!builder || builder.isDemo) notFound();
const homeCount = await prisma.inventoryHome.count({ where: { builderId: builder.id, status: "PUBLISHED", isDemo: false } });
return (
<div className="mx-auto max-w-5xl px-4 py-8">
<h1 className="text-3xl font-bold">{builder.name}</h1>
<p className="mt-1 text-sm text-neutral-500">
{builder.coverageArea} · {homeCount} available homes · {builder.communities.length} communities
</p>
<p className="mt-2 text-xs text-neutral-400">
Listing on HomesOnSpec does not imply sponsorship or endorsement by the builder.
</p>
<section className="mt-8">
<h2 className="text-xl font-semibold">Communities</h2>
<div className="mt-3 grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
{builder.communities.map((community) => (
<Link key={community.id} href={`/communities/${community.slug}`}
className="rounded-xl border border-neutral-200 p-4 shadow-sm hover:border-teal-400">
<div className="font-semibold">{community.name}</div>
<div className="text-sm text-neutral-500">{community.city}, {community.state}</div>
<div className="mt-1 text-sm text-neutral-500">
{community._count.homes} homes
{community.priceMin ? ` · from ${fmtPrice(Number(community.priceMin))}` : ""}
</div>
</Link>
))}
</div>
</section>
{builder.divisions.length > 0 && (
<section className="mt-8 text-sm text-neutral-600">
<h2 className="text-xl font-semibold text-neutral-900">Divisions</h2>
<ul className="mt-2 list-inside list-disc">
{builder.divisions.map((division) => (
<li key={division.id}>{division.name} — {division.region} ({division.states.join(", ")})</li>
))}
</ul>
</section>
)}
</div>
);
}