97 lines
2.4 KiB
TypeScript
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}
|
|
/>
|
|
);
|
|
}
|