You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.1 KiB
70 lines
2.1 KiB
const initialState = { |
|
loading: true, |
|
error: null, |
|
list: [], |
|
info: null, |
|
searchResult: [], |
|
filterResult: [], |
|
}; |
|
export default function book(state = initialState, action) { |
|
let { type, data } = action; |
|
switch (type) { |
|
case "book/list": |
|
return { ...state, loading: false, list: data, error: null }; |
|
case "book/info": |
|
return { ...state, loading: false, list: null, info: data, error: null }; |
|
case "book/update": |
|
return { ...state, loading: false, error: null }; |
|
case "book/add": |
|
return { ...state, loading: false, error: null }; |
|
case "book/delete": |
|
return { ...state, loading: false, error: null }; |
|
case "book/search": |
|
return { ...state }; |
|
case "book/filter": |
|
const realList = |
|
state.searchResult.length > 0 ? state.searchResult : state.list; |
|
const level = data.level; |
|
const subject = data.subject; |
|
const sort = data.sort; |
|
const search = data.search; |
|
if (level.length > 0 || subject.length > 0 || sort || search) { |
|
localStorage.setItem("filter", "ON"); |
|
} |
|
let finalSort; |
|
const byLevelFilter = |
|
level.length > 0 |
|
? realList.filter( |
|
(item) => item.name.indexOf(level.map((item) => item)) !== -1 |
|
) |
|
: realList; |
|
const bySubjectFilter = |
|
subject.length > 0 |
|
? byLevelFilter.filter( |
|
(item) => item.name.indexOf(subject.map((item) => item)) !== -1 |
|
) |
|
: byLevelFilter; |
|
const bySearchFilter = search |
|
? bySubjectFilter.filter((item) => item.name.indexOf(search) !== -1) |
|
: bySubjectFilter; |
|
if (sort === "گران ترین") { |
|
finalSort = bySearchFilter.sort((item1, item2) => { |
|
return item1.product[0].price - item2.product[0].price; |
|
}); |
|
} else { |
|
finalSort = bySearchFilter; |
|
} |
|
return { |
|
...state, |
|
loading: false, |
|
error: null, |
|
filterResult: finalSort, |
|
}; |
|
case "loading": |
|
return { ...state, loading: true }; |
|
case "error": |
|
return { ...state, loading: false, error: data.message }; |
|
default: |
|
return state; |
|
} |
|
}
|
|
|