"use client"; import { useEffect, useMemo, useState } from "react"; import { dxGet } from "./dx"; type Entry = { submission_id: string | number; brand?: string | null; model?: string | null; title?: string | null; price_min?: number | null; price_max?: number | null; laser_type?: string | null; // e.g., "CO2", "Diode", "Fiber" if present in your schema bed_size_x?: number | null; bed_size_y?: number | null; }; export default function LaserFinderPanel() { const [q, setQ] = useState(""); const [type, setType] = useState("any"); const [budget, setBudget] = useState(null); const [minBedX, setMinBedX] = useState(null); const [minBedY, setMinBedY] = useState(null); const [recs, setRecs] = useState([]); const [loading, setLoading] = useState(false); const filter = useMemo(() => { const f: any = {}; const ors: any[] = []; if (q.trim()) { ors.push({ brand: { _icontains: q } }, { model: { _icontains: q } }, { title: { _icontains: q } }); } if (type !== "any") f.laser_type = { _eq: type }; if (budget != null) { // either min/max under budget or range overlaps ors.push( { price_min: { _lte: budget } }, { price_max: { _lte: budget } }, { _and: [{ price_min: { _lte: budget } }, { price_max: { _gte: 1 } }] } ); } if (minBedX != null) f.bed_size_x = { _gte: minBedX }; if (minBedY != null) f.bed_size_y = { _gte: minBedY }; if (ors.length) f._or = ors; return f; }, [q, type, budget, minBedX, minBedY]); useEffect(() => { (async () => { setLoading(true); try { const data = await dxGet("items/bg_entries", { fields: "submission_id,brand,model,title,price_min,price_max,laser_type,bed_size_x,bed_size_y", filter: JSON.stringify(filter), limit: 50, sort: "price_min,brand,model", }); setRecs(data); } finally { setLoading(false); } })(); }, [filter]); return (
setQ(e.target.value)} />
setBudget(e.target.value ? Number(e.target.value) : null)} />
setMinBedX(e.target.value ? Number(e.target.value) : null)} />
setMinBedY(e.target.value ? Number(e.target.value) : null)} />
{loading ? (
Searching…
) : recs.length === 0 ? (
No matching lasers.
) : (
{recs.map(r => ( ))}
Laser Type Bed (mm) Price
{r.brand} {r.model || r.title} {r.laser_type || "—"} {(r.bed_size_x ?? "—")} × {(r.bed_size_y ?? "—")} {(r.price_min || r.price_max) ? (r.price_min && r.price_max && r.price_min !== r.price_max ? `$${r.price_min.toLocaleString()}–$${r.price_max.toLocaleString()}` : `$${(r.price_min || r.price_max)!.toLocaleString()}`) : "—"} View
)}
); }