Files
Makers3D/apps/web/app/components/DiscoverResultsScreen.tsx

97 lines
2.4 KiB
TypeScript

import { serverFetch } from "../lib/api";
import DiscoverExperienceClient from "./DiscoverExperienceClient";
type PublicMaker = {
id: string;
slug: string;
business_name: string;
description: string;
province: string;
city: string;
delivery_scope: string;
availability: string;
main_image_url: string | null;
avg_rating: number | string;
review_count: number;
service_count: number;
work_count: number;
public_latitude: number | null;
public_longitude: number | null;
categories?: string[];
};
type PublicWork = {
id: string;
slug: string;
title: string;
summary: string;
technology: string;
material: string;
image_url: string | null;
gallery_urls: string[] | null;
maker_id: string;
maker_slug: string;
maker_name: string;
avg_rating: number | string;
review_count: number;
};
type DiscoverCategory = "all" | "fdm" | "resin" | "design-3d" | "repuestos" | "ingenieria";
function readParam(value: string | string[] | undefined) {
return typeof value === "string" ? value : "";
}
function normalizeCategory(value: string): DiscoverCategory {
const normalized = value.trim().toLowerCase();
if (normalized === "fdm" || normalized === "impresion fdm") {
return "fdm";
}
if (normalized === "resina" || normalized === "impresion resina") {
return "resin";
}
if (normalized === "design-3d" || normalized === "diseno 3d") {
return "design-3d";
}
if (normalized === "repuestos") {
return "repuestos";
}
if (normalized === "ingenieria") {
return "ingenieria";
}
return "all";
}
export async function DiscoverResultsScreen({
searchParams
}: {
searchParams?: Record<string, string | string[] | undefined>;
}) {
const query = readParam(searchParams?.q);
const initialCategory = normalizeCategory(
readParam(searchParams?.category) || readParam(searchParams?.serviceCategory)
);
const requestQuery = new URLSearchParams();
if (query) {
requestQuery.set("q", query);
}
const serialized = requestQuery.toString();
const [makersData, worksData] = await Promise.all([
serverFetch<{ makers: PublicMaker[] }>(`/makers${serialized ? `?${serialized}` : ""}`),
serverFetch<{ works: PublicWork[] }>(`/works${serialized ? `?${serialized}` : ""}`)
]);
return (
<DiscoverExperienceClient
initialMakers={makersData.makers}
initialWorks={worksData.works}
initialQuery={query}
initialCategory={initialCategory}
/>
);
}