Skip to article
Documentation

src/app/search/page.tsx

Linked repository file from this build.

import { AppShell } from "@/components/app-shell";
import { ReviewSearch } from "@/features/reviews/search";
import { getPageActor } from "@/lib/auth/page";
import { querySearchPage, searchSchema } from "@/lib/db/search-store";
import { serverTiming } from "@/lib/server-timing";

export default async function SearchPage({
  searchParams,
}: {
  searchParams: Promise<Record<string, string | string[] | undefined>>;
}) {
  const timing = serverTiming();
  const actor = await timing.measure("auth", getPageActor);
  const raw = await searchParams;
  const parsed = searchSchema.safeParse(
    Object.fromEntries(
      Object.entries(raw).map(([key, value]) => [key, Array.isArray(value) ? value[0] : value]),
    ),
  );
  const filters = parsed.success ? parsed.data : searchSchema.parse({});
  const data = await timing.measure("data", () => querySearchPage(actor, filters));
  timing.log("search");
  return (
    <AppShell title="Search">
      <ReviewSearch initial={{ scope: JSON.stringify(actor), filters, data }} />
    </AppShell>
  );
}