no longer price sort of frontend

This commit is contained in:
2026-01-02 09:56:51 -05:00
parent 228d08337f
commit b7e3db8d34
2 changed files with 49 additions and 25 deletions
+39 -17
View File
@@ -140,43 +140,58 @@ export default function PartsBrowseClient(props: {
// ----------------------------
useEffect(() => {
if (!partRole) return;
const controller = new AbortController();
async function fetchParts() {
try {
setLoading(true);
setError(null);
const search = new URLSearchParams();
search.set("platform", effectivePlatform);
search.append("partRole", partRole);
// server paging (0-based)
search.set("page", String(currentPage - 1));
search.set("size", String(PAGE_SIZE));
// optional server search + sort (backend can ignore for now)
if (searchQuery.trim()) search.set("q", searchQuery.trim());
if (brandFilter.length) brandFilter.forEach((b) => search.append("brand", b));
if (brandFilter.length)
brandFilter.forEach((b) => search.append("brand", b));
// sort mapping
// sort mapping (Spring-style: sort=field,dir)
switch (sortBy) {
case "price-asc":
search.set("sort", "price,asc");
break;
case "price-desc":
search.set("sort", "price,desc");
break;
case "brand-asc":
search.set("sort", "brand,asc");
break;
case "relevance":
default:
// fallback (or whatever you consider "relevance")
search.set("sort", "updatedAt,desc");
break;
}
const res = await fetch(`${API_BASE_URL}/api/v1/catalog/options?${search.toString()}`, {
signal: controller.signal,
});
const res = await fetch(
`${API_BASE_URL}/api/v1/catalog/options?${search.toString()}`,
{
signal: controller.signal,
}
);
if (!res.ok) throw new Error(`Failed to load products (${res.status})`);
const json = await res.json();
const { items, page } = unwrapContent<GunbuilderProductFromApi>(json);
setParts(
items.map((p) => ({
id: normalizeId(p.id),
@@ -190,7 +205,7 @@ export default function PartsBrowseClient(props: {
inStock: p.inStock ?? true,
}))
);
if (page) {
setServerTotalPages(page.totalPages ?? 1);
setServerTotalElements(page.totalElements ?? items.length);
@@ -206,10 +221,17 @@ export default function PartsBrowseClient(props: {
setLoading(false);
}
}
fetchParts();
return () => controller.abort();
}, [partRole, effectivePlatform, currentPage, searchQuery, sortBy, brandFilter]);
}, [
partRole,
effectivePlatform,
currentPage,
searchQuery,
sortBy,
brandFilter,
]);
// Reset pagination on filters
useEffect(() => {
setCurrentPage(1);