"use client"; import { useEffect, useMemo, useState } from "react"; import { dxGet } from "./dx"; type Cat = { id: string | number; name: string }; type Sub = { id: string | number; name: string; bg_cat_id: string | number }; type Entry = { submission_id: string | number; title?: string | null; brand?: string | null; model?: string | null; thumb?: { id: string; filename_disk?: string } | null; bg_cat_id?: { id: string | number; name?: string } | string | number | null; bg_sub_cat_id?: { id: string | number; name?: string } | string | number | null; price_min?: number | null; price_max?: number | null; }; function assetUrl(idOrPath?: string) { // Prefer Directus asset URL if you expose one publicly; fallback to /api/dx/assets/:id if (!idOrPath) return ""; if (/^https?:\/\//i.test(idOrPath)) return idOrPath; return `/api/dx/assets/${idOrPath}`; } export default function BuyingGuideList({ embedded = true }: { embedded?: boolean }) { const [cats, setCats] = useState([]); const [subs, setSubs] = useState([]); const [entries, setEntries] = useState([]); const [loading, setLoading] = useState(true); const [catId, setCatId] = useState("all"); const [subId, setSubId] = useState("all"); const [q, setQ] = useState(""); useEffect(() => { (async () => { setLoading(true); try { const [catRes, subRes] = await Promise.all([ dxGet("items/bg_cat", { fields: "id,name", limit: 500, sort: "name" }), dxGet("items/bg_sub_cat", { fields: "id,name,bg_cat_id", limit: 1000, sort: "name" }), ]); setCats(catRes); setSubs(subRes); } finally { setLoading(false); } })(); }, []); useEffect(() => { (async () => { setLoading(true); try { // Build filter const filter: any = {}; if (catId !== "all") filter.bg_cat_id = { _eq: catId }; if (subId !== "all") filter.bg_sub_cat_id = { _eq: subId }; if (q.trim()) { filter._or = [ { title: { _icontains: q } }, { brand: { _icontains: q } }, { model: { _icontains: q } }, ]; } const data = await dxGet("items/bg_entries", { fields: [ "submission_id", "title", "brand", "model", "price_min", "price_max", "thumb.id", "bg_cat_id.id", "bg_cat_id.name", "bg_sub_cat_id.id", "bg_sub_cat_id.name", ].join(","), filter: JSON.stringify(filter), limit: 48, sort: "brand,model,title", }); setEntries(data); } finally { setLoading(false); } })(); }, [catId, subId, q]); const subsForCat = useMemo( () => (catId === "all" ? subs : subs.filter(s => String(s.bg_cat_id) === String(catId))), [subs, catId] ); return (
{/* Controls */}
setQ(e.target.value)} />
{/* Results */} {loading ? (
Loading…
) : entries.length === 0 ? (
No results.
) : ( )}
); }