Skip to content

Commit 11ee4c0

Browse files
committed
Add: search offers infinite scrolling working correctly
1 parent 088a5c3 commit 11ee4c0

File tree

3 files changed

+22
-12
lines changed

3 files changed

+22
-12
lines changed

src/components/HomePage/SearchArea/SearchArea.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useCallback, useState } from "react";
1+
import React, { useCallback } from "react";
22
import PropTypes from "prop-types";
33

44
import { connect } from "react-redux";

src/components/HomePage/SearchResultsArea/SearchResultsWidget/OfferItemsContainer.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ const OfferItemsContainer = ({
7171
if (node) setLastOfferNode(node);
7272
}, []);
7373

74+
useEffect(() => {
75+
setOffset(offers?.length);
76+
}, [offers]);
77+
7478
useEffect(() => {
7579

7680
if (loading || infiniteScrollLoading) {
@@ -96,7 +100,7 @@ const OfferItemsContainer = ({
96100
}
97101
});
98102
if (lastOfferNode) observer.current.observe(lastOfferNode);
99-
}, [addSnackbar, hasMore, infiniteScrollError, infiniteScrollLoading, lastOfferNode, loading, offers]);
103+
}, [addSnackbar, hasMore, infiniteScrollError, infiniteScrollLoading, lastOfferNode, loading]);
100104

101105
const handleOfferSelection = (...args) => {
102106
toggleShowSearchFilters(false);

src/hooks/useLoadMoreOffers.js

+16-10
Original file line numberDiff line numberDiff line change
@@ -37,24 +37,26 @@ export default ({ offset, setOffset, fetchMoreOffers }) => {
3737
const [loading, setLoading] = useState(false);
3838
const [error, setError] = useState(null);
3939
const [offers, setOffers] = useState(oldOffers);
40+
const [fetchedOffsets, setFetchedOffsets] = useState([]);
4041

4142
useEffect(() => {
4243
setOffers(oldOffers);
4344
}, [oldOffers]);
4445

4546
useEffect(() => {
4647
setOffset(0);
48+
setHasMore(true);
4749
setError(null);
4850
setLoading(false);
51+
setFetchedOffsets([]);
4952
}, [setOffset, submitNumber]);
5053

5154
useEffect(() => {
5255

5356
const fetchOffers = async () => {
5457

55-
if (!fetchMoreOffers || error) return;
56-
5758
try {
59+
setFetchedOffsets((offsets) => [...offsets, filters.offset]);
5860
const query = parseFiltersToURL(filters);
5961
const res = await fetch(`${API_HOSTNAME}/offers?${query}`, {
6062
method: "GET",
@@ -66,7 +68,6 @@ export default ({ offset, setOffset, fetchMoreOffers }) => {
6668
error: res.status,
6769
});
6870
setLoading(false);
69-
7071
return;
7172
}
7273
const offersData = await res.json();
@@ -91,18 +92,23 @@ export default ({ offset, setOffset, fetchMoreOffers }) => {
9192
error,
9293
});
9394
setLoading(false);
95+
return;
9496
}
9597
};
9698

97-
fetchOffers().catch((error) => {
98-
setError({
99-
cause: ErrorTypes.UNEXPECTED,
100-
error,
99+
if (fetchMoreOffers && !fetchedOffsets.includes(filters.offset) && !initialOffersLoading && !loading) {
100+
fetchOffers().catch((error) => {
101+
setError({
102+
cause: ErrorTypes.UNEXPECTED,
103+
error,
104+
});
101105
});
102-
});
103-
104-
}, [dispatch, filters, initialOffersLoading, oldOffers, offset, loading, error, fetchMoreOffers]);
106+
}
105107

108+
}, [
109+
dispatch, fetchMoreOffers, filters, oldOffers, initialOffersLoading, offset,
110+
fetchedOffsets, submitNumber, hasMore, loading, offers,
111+
]);
106112

107113
return { offers, hasMore, loading, error };
108114
};

0 commit comments

Comments
 (0)