feat: add amazon seller filter to product list and result parsing

This commit is contained in:
Victor Noguera
2026-04-14 18:43:35 -04:00
parent b52cdc7f2b
commit d25cf5d5ec
2 changed files with 47 additions and 3 deletions

View File

@@ -78,6 +78,7 @@ type ResultsResponse = {
};
type VerdictFilter = "" | "FBA" | "FBM" | "SKIP";
type AmazonSellerFilter = "" | "yes" | "no";
type ProductListItem = {
processType: ProcessType;
@@ -429,6 +430,8 @@ function RunDetails({
const [search, setSearch] = useState("");
const [verdict, setVerdict] = useState("");
const [sellabilityStatus, setSellabilityStatus] = useState("");
const [amazonSellerFilter, setAmazonSellerFilter] =
useState<AmazonSellerFilter>("");
const [minConfidence, setMinConfidence] = useState("");
const [maxConfidence, setMaxConfidence] = useState("");
const [page, setPage] = useState(1);
@@ -469,6 +472,7 @@ function RunDetails({
if (search) params.set("q", search);
if (verdict) params.set("verdict", verdict);
if (sellabilityStatus) params.set("sellabilityStatus", sellabilityStatus);
if (amazonSellerFilter) params.set("amazonIsSeller", amazonSellerFilter);
if (minConfidence) params.set("minConfidence", minConfidence);
if (maxConfidence) params.set("maxConfidence", maxConfidence);
@@ -484,7 +488,7 @@ function RunDetails({
return () => {
cancelled = true;
};
}, [processType, runId, search, verdict, sellabilityStatus, minConfidence, maxConfidence, page, pageSize, sort, refreshTick]);
}, [processType, runId, search, verdict, sellabilityStatus, amazonSellerFilter, minConfidence, maxConfidence, page, pageSize, sort, refreshTick]);
useEffect(() => {
const interval = window.setInterval(() => {
@@ -555,6 +559,17 @@ function RunDetails({
<option value="not_available">not_available</option>
<option value="unknown">unknown</option>
</select>
<select
value={amazonSellerFilter}
onChange={(e) => {
setPage(1);
setAmazonSellerFilter(e.target.value as AmazonSellerFilter);
}}
>
<option value="">Amazon seller: all</option>
<option value="yes">Amazon seller: yes</option>
<option value="no">Amazon seller: no</option>
</select>
<input value={minConfidence} onChange={(e) => { setPage(1); setMinConfidence(e.target.value); }} placeholder="Min confidence" />
<input value={maxConfidence} onChange={(e) => { setPage(1); setMaxConfidence(e.target.value); }} placeholder="Max confidence" />
<select value={String(pageSize)} onChange={(e) => { setPage(1); setPageSize(Number(e.target.value)); }}>
@@ -565,7 +580,7 @@ function RunDetails({
</div>
<div style={{ marginTop: 10 }}>
<a
href={`/api/runs/${processType}/${runId}/export.csv?q=${encodeURIComponent(search)}&verdict=${encodeURIComponent(verdict)}&sellabilityStatus=${encodeURIComponent(sellabilityStatus)}&minConfidence=${encodeURIComponent(minConfidence)}&maxConfidence=${encodeURIComponent(maxConfidence)}&sort=${encodeURIComponent(buildSortValue(sort))}`}
href={`/api/runs/${processType}/${runId}/export.csv?q=${encodeURIComponent(search)}&verdict=${encodeURIComponent(verdict)}&sellabilityStatus=${encodeURIComponent(sellabilityStatus)}&amazonIsSeller=${encodeURIComponent(amazonSellerFilter)}&minConfidence=${encodeURIComponent(minConfidence)}&maxConfidence=${encodeURIComponent(maxConfidence)}&sort=${encodeURIComponent(buildSortValue(sort))}`}
>
<button>Export filtered CSV</button>
</a>
@@ -665,6 +680,8 @@ function ProductList({ verdict, onBack }: { verdict: VerdictFilter; onBack: () =
const [loading, setLoading] = useState(false);
const [search, setSearch] = useState("");
const [activeVerdict, setActiveVerdict] = useState<VerdictFilter>(verdict);
const [amazonSellerFilter, setAmazonSellerFilter] =
useState<AmazonSellerFilter>("");
const [page, setPage] = useState(1);
const [pageSize, setPageSize] = useState(25);
const [sort, setSort] = useState<SortState>({ field: "monthly_sold", direction: "DESC" });
@@ -683,6 +700,7 @@ function ProductList({ verdict, onBack }: { verdict: VerdictFilter; onBack: () =
params.set("sort", buildSortValue(sort));
if (search) params.set("q", search);
if (activeVerdict) params.set("verdict", activeVerdict);
if (amazonSellerFilter) params.set("amazonIsSeller", amazonSellerFilter);
const res = await fetch(`/api/products?${params.toString()}`);
const payload = (await res.json()) as ProductListResponse;
if (!cancelled) {
@@ -695,7 +713,7 @@ function ProductList({ verdict, onBack }: { verdict: VerdictFilter; onBack: () =
return () => {
cancelled = true;
};
}, [search, activeVerdict, page, pageSize, sort]);
}, [search, activeVerdict, amazonSellerFilter, page, pageSize, sort]);
async function reanalyzeAsin(item: ProductListItem) {
const key = `${item.processType}:${item.runId}:${item.asin}`;
@@ -715,6 +733,7 @@ function ProductList({ verdict, onBack }: { verdict: VerdictFilter; onBack: () =
params.set("sort", buildSortValue(sort));
if (search) params.set("q", search);
if (activeVerdict) params.set("verdict", activeVerdict);
if (amazonSellerFilter) params.set("amazonIsSeller", amazonSellerFilter);
const res = await fetch(`/api/products?${params.toString()}`);
const payload = (await res.json()) as ProductListResponse;
setItems(payload);
@@ -740,6 +759,17 @@ function ProductList({ verdict, onBack }: { verdict: VerdictFilter; onBack: () =
<option value="FBM">FBM</option>
<option value="SKIP">SKIP</option>
</select>
<select
value={amazonSellerFilter}
onChange={(e) => {
setPage(1);
setAmazonSellerFilter(e.target.value as AmazonSellerFilter);
}}
>
<option value="">Amazon seller: all</option>
<option value="yes">Amazon seller: yes</option>
<option value="no">Amazon seller: no</option>
</select>
<select value={String(pageSize)} onChange={(e) => { setPage(1); setPageSize(Number(e.target.value)); }}>
<option value="25">25 / page</option>
<option value="50">50 / page</option>