Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

useMyOffers.js 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { useEffect, useMemo, useState } from "react";
  2. import { useDispatch, useSelector } from "react-redux";
  3. import { sortEnum } from "../../enums/sortEnum";
  4. import { fetchMineOffers } from "../../store/actions/offers/offersActions";
  5. import { selectMineOffers } from "../../store/selectors/offersSelectors";
  6. import useFilters from "./useFilters";
  7. import usePaging from "./usePaging";
  8. import useSearch from "./useSearch";
  9. import useSorting from "./useSorting";
  10. const useMyOffers = () => {
  11. const filters = useFilters(true);
  12. const sorting = useSorting();
  13. const mineOffers = useSelector(selectMineOffers);
  14. const search = useSearch();
  15. const dispatch = useDispatch();
  16. const paging = usePaging();
  17. const [appliedFilters, setAppliedFilters] = useState(false);
  18. const [totalOffers, setTotalOffers] = useState(0);
  19. useEffect(() => {
  20. dispatch(fetchMineOffers());
  21. }, []);
  22. const apply = () => {
  23. paging.changePage(1);
  24. setAppliedFilters(false);
  25. };
  26. // Filter, search and sort all mine offers
  27. const allOffersToShow = useMemo(() => {
  28. let mineOffersFiltered = [...mineOffers];
  29. // Filter mine offers by category
  30. if (filters.category.selectedCategoryLocally?.name)
  31. mineOffersFiltered = mineOffersFiltered.filter(
  32. (offer) =>
  33. offer?.category?.name ===
  34. filters.category.selectedCategoryLocally.name
  35. );
  36. // Filter mine offers by subcategory
  37. if (filters.subcategory.selectedSubcategoryLocally?.name) {
  38. mineOffersFiltered = mineOffersFiltered.filter(
  39. (offer) =>
  40. offer?.subcategory ===
  41. filters.subcategory.selectedSubcategoryLocally?.name
  42. );
  43. }
  44. // Filter mine offers by locations
  45. if (filters.locations.selectedLocationsLocally?.length > 0) {
  46. mineOffersFiltered = mineOffersFiltered.filter((offer) =>
  47. filters.locations.selectedLocationsLocally.find(
  48. (location) => location?.city === offer?.location?.city
  49. )
  50. );
  51. }
  52. // Sort mine offers
  53. if (sorting.selectedSortOptionLocally.value !== sortEnum.INITIAL.value) {
  54. if (sorting.selectedSortOptionLocally.value === sortEnum.OLD.value) {
  55. mineOffersFiltered.sort(
  56. (a, b) => new Date(a._created) - new Date(b._created)
  57. );
  58. }
  59. if (sorting.selectedSortOptionLocally.value === sortEnum.NEW.value) {
  60. mineOffersFiltered.sort(
  61. (a, b) => new Date(b._created) - new Date(a._created)
  62. );
  63. }
  64. if (sorting.selectedSortOptionLocally.value === sortEnum.POPULAR.value) {
  65. mineOffersFiltered.sort((a, b) => b.views.count - a.views.count);
  66. }
  67. }
  68. mineOffersFiltered = mineOffersFiltered.filter((offer) =>
  69. offer?.name?.toLowerCase()?.includes(search.searchStringLocally)
  70. );
  71. setTotalOffers(mineOffersFiltered?.length);
  72. mineOffersFiltered = mineOffersFiltered.slice(
  73. (paging.currentPage - 1) * 10,
  74. paging.currentPage * 10
  75. );
  76. if (!appliedFilters) {
  77. setAppliedFilters(true);
  78. }
  79. return [...mineOffersFiltered];
  80. }, [
  81. appliedFilters,
  82. sorting.selectedSortOptionLocally,
  83. mineOffers,
  84. paging.currentPage,
  85. ]);
  86. return {
  87. filters,
  88. paging,
  89. sorting,
  90. search,
  91. allOffersToShow,
  92. totalOffers,
  93. apply,
  94. };
  95. };
  96. export default useMyOffers;