Skip to content

Commit 82c96b3

Browse files
makine array of objects for filter/ making sort as another function and state
1 parent c297593 commit 82c96b3

File tree

3 files changed

+33
-17
lines changed

3 files changed

+33
-17
lines changed

src/features/product/components/ProductList.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,32 +65,40 @@ export default function ProductList() {
6565
const products = useSelector(selectAllProducts);
6666
const dispatch = useDispatch();
6767
const [filter, setFilter] = useState({});
68+
const [sort, setSort] = useState({});
6869

6970
const handleFilter = (e, section, option) => {
7071
console.log(e.target.checked);
7172
// TODO: we will on server support mutilple value
7273
// remove obj when input box is unchecked
7374
const newFilter = { ...filter };
7475
if (e.target.checked) {
75-
newFilter[section.id] = option.value;
76+
if (newFilter[section.id]) {
77+
newFilter[section.id].push(option.value); //{"category":["frangrances","furniture"]}
78+
} else {
79+
newFilter[section.id] = [option.value]; //[]
80+
}
7681
} else {
77-
delete newFilter[section.id];
82+
// delete array item after unchecked...
83+
const index = newFilter[section.id].findIndex(
84+
(el) => el === option.value
85+
);
86+
newFilter[section.id].splice(index, 1);
7887
}
88+
console.log({ newFilter });
7989
setFilter(newFilter);
80-
console.log(section.id, option.value);
8190
};
8291
const handleSort = (e, option) => {
83-
const newFilter = {
84-
...filter,
85-
_sort: option.order === "desc" ? `-${option.sort}` : option.sort,
92+
const sort = {
93+
_sort: option.order === "desc" ? `-${option.sort}` : option.sort, //{_sort:"price", order="desc"}
8694
};
87-
setFilter(newFilter);
88-
dispatch(fetchProductsByFiltersAsync(newFilter));
95+
console.log(sort);
96+
setSort(sort);
8997
};
9098
// making API call when dispatch or when filter is applied in a one go....
9199
useEffect(() => {
92-
dispatch(fetchProductsByFiltersAsync(filter));
93-
}, [dispatch, filter]);
100+
dispatch(fetchProductsByFiltersAsync({ filter, sort }));
101+
}, [dispatch, filter, sort]);
94102

95103
return (
96104
<div className="bg-white">

src/features/product/productAPI.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ export function fetchAllProducts() {
66
resolve({ data });
77
});
88
}
9-
export function fetchProductsByFilters(filter) {
10-
// in server side:-
11-
// filter ={"category":["frangrances","furniture"]}
12-
// sort={_sort:price, order="desc"}
9+
export function fetchProductsByFilters(filter, sort) {
1310
// filter ={"brand":"Essence"}
1411
// TODO:we will on server support mutilple value
1512

@@ -27,9 +24,20 @@ export function fetchProductsByFilters(filter) {
2724
// For descending order,
2825

2926
// ***** use GET /products?_sort=-price ****
27+
28+
// in server side:-
29+
// filter ={"category":["frangrances","furniture"]}
30+
// sort={_sort:"price", order="desc"}
3031
let queryString = "";
3132
for (let key in filter) {
32-
queryString += `${key}=${filter[key]}&`;
33+
const categoryValues = filter[key]; // "[furniture]" << array
34+
if (categoryValues.length) {
35+
const lastCategoryValue = categoryValues[categoryValues.length - 1];
36+
queryString += `${key}=${lastCategoryValue}&`;
37+
}
38+
}
39+
for (let key in sort) {
40+
queryString += `${key}=${sort[key]}&`; //_sort:"price"
3341
}
3442
return new Promise(async (resolve) => {
3543
// TODO: we will not hard coded server url here...

src/features/product/productSlice.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export const fetchAllProductsAsync = createAsyncThunk(
1616
);
1717
export const fetchProductsByFiltersAsync = createAsyncThunk(
1818
"product/fetchProductsByFilters",
19-
async (filter) => {
20-
const response = await fetchProductsByFilters(filter);
19+
async ({ filter, sort }) => {
20+
const response = await fetchProductsByFilters(filter, sort);
2121
// The value we return becomes the `fulfilled` action payload
2222
return response.data;
2323
}

0 commit comments

Comments
 (0)