From 85d4629d3ca126178ac2776ca6edd5a53c3ef4ff Mon Sep 17 00:00:00 2001 From: Sean Date: Tue, 30 Dec 2025 14:14:43 -0500 Subject: [PATCH] fixed a hydratioin issue --- app/(app)/(builder)/builder/page.tsx | 56 ++++++++++++++-------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/app/(app)/(builder)/builder/page.tsx b/app/(app)/(builder)/builder/page.tsx index 377524b..94dd248 100644 --- a/app/(app)/(builder)/builder/page.tsx +++ b/app/(app)/(builder)/builder/page.tsx @@ -419,34 +419,36 @@ export default function GunbuilderPage() { if (!res.ok) throw new Error(`Failed to hydrate parts (${res.status})`); const data: GunbuilderProductFromApi[] = await res.json(); - - const hydrated: Part[] = data - .map((p): Part | null => { - const normalizedRole = (p.partRole ?? "") - .trim() - .toLowerCase() - .replace(/_/g, "-"); - - const categoryId = resolveCategoryId(normalizedRole); - if (!categoryId) return null; - - const buyUrl = p.buyUrl ?? undefined; - - return { - id: String(p.id), - categoryId, - name: p.name, - brand: p.brand, - price: p.price ?? 0, - imageUrl: p.imageUrl ?? undefined, - affiliateUrl: buyUrl, - url: buyUrl, - notes: undefined, - }; - }) - .filter((p): p is Part => p !== null); - + + // Map products by id for quick lookup + const byId = new Map(); + for (const p of data) byId.set(String(p.id), p); + + // Build the hydrated parts by iterating the BUILD STATE (slot -> id) + const hydrated: Part[] = Object.entries(build) + .filter(([, id]) => Boolean(id)) + .map(([slot, id]) => { + const p = byId.get(String(id)); + if (!p) return null; + + const buyUrl = p.buyUrl ?? undefined; + + return { + id: String(p.id), + categoryId: slot as any, // ✅ slot is the source of truth + name: p.name, + brand: p.brand, + price: p.price ?? 0, + imageUrl: p.imageUrl ?? undefined, + affiliateUrl: buyUrl, + url: buyUrl, + notes: undefined, + } as Part; + }) + .filter((x): x is Part => x !== null); + setParts(hydrated); + } catch (err: any) { if (err?.name === "AbortError") return; setError(err?.message ?? "Failed to hydrate selected parts");