Working on a project of mine and ran into an issue. So I am adding "sorting" to my products. So for instance, you can sort "hoodies" based on color, brand, size etc. Fortunately, the API I am using accepts these values, such as: brand: <brand>
or base_colour: <color>
.
So far, I have managed to get the key & value to the API, but it is acting a bit strange.
Whenever I sort the products, it doesn't instantly apply. So for instance, if I want to sort the "brand" to "bike", nothing happens. But if I then try to sort the "color" to "black". Then the brand changes, but not the color. So it is "delayed" by one.
Through my debugging of this issue, I am 80% sure my useEffect
is the thief here.
Here is a picture that might help:
As you can see, the key and value of attribute_1046
gets sent to my API fetch js file, but it doesn't get added to the parameters. But whenever I change the brand (Meaning, I have 2 sortings). Then the attribute_1046
gets added to the parameters.
Here is my API Fetch code:
// Receiving the Key and Value when a user interacts with the "sorting" dropdowns.
let facetValue = props.facetValue;
let facetKey = props.facetKey;
// Setting initial parameters
const [params, setParams] = useState({
store: "US",
offset: props.offset,
categoryId: props.categoryId,
limit: props.limit,
country: "US",
sort: "freshness",
currency: "USD",
sizeSchema: "US",
lang: "en-US",
});
useEffect(() => {
// if FacetKey is not undefined.
if (facetKey) {
console.log(`${facetKey}: ${facetValue}`);
setParams({
[facetKey]: facetValue,
...params,
});
}
console.log(params);
const options = {
method: "GET",
url: "https://asos2.p.rapidapi.com/products/v2/list",
params: params,
headers: {
"x-rapidapi-key": "",
"x-rapidapi-host": "",
},
};
axios
.request(options)
.then(function (response) {
setProducts(response.data.products);
props.items(response.data.itemCount);
props.facets(response.data.facets);
})
.catch(function (error) {
console.error(error);
});
// Is it my dependencies that are incorrect?
}, [props.limit, facetKey]);
Not sure if this file is needed as well, but here the user sort the products:
const [facets, setFacets] = useState();
const [facetValue, setFacetValue] = useState();
const [facetKey, setFacetKey] = useState();
<BottomBar>
<div className={classes.filter_grid_container}>
{facets != null
? facets.map((filter) => (
<div className={classes.item}>
{filter.name != "Price Range" ? (
<Dropdown
name={filter.name}
values={filter.facetValues}
facetKey={filter.id}
facetValue={(facetValue) => setFacetValue(facetValue)}
facetItemKey={(facetKey) => setFacetKey(facetKey)}
/>
) : (
<DropdownPrice />
)}
</div>
))
: null}
</div>
</BottomBar>
</StyledApp>
<div className={classes.grid_container}>
<FetchAPI
limit={limit}
offset={offset}
items={(itemCount) => setItemCount(itemCount)}
categoryId={params.id}
facets={(facets) => setFacets(facets)}
facetValue={facetValue}
facetKey={facetKey}
/>
</div>