@replyke/core
Version:
Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.
175 lines • 5.86 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = require("react");
const useFetchManyEntities_1 = __importDefault(require("./useFetchManyEntities"));
const handleError_1 = require("../../utils/handleError");
function useFetchManyEntitiesWrapper(props) {
const { userId, limit = 10, defaultSortBy = "new", defaultSortByReaction = "upvote", defaultSortDir = "desc", defaultSortType = "auto", timeFrame, sourceId, spaceId, include, followedOnly, keywordsFilters, titleFilters, contentFilters, attachmentsFilters, locationFilters, metadataFilters, } = props;
const fetchManyEntities = (0, useFetchManyEntities_1.default)();
const loading = (0, react_1.useRef)(true);
const [loadingState, setLoadingState] = (0, react_1.useState)(true);
const hasMore = (0, react_1.useRef)(true);
const [hasMoreState, setHasMoreState] = (0, react_1.useState)(true);
const [sortBy, setSortBy] = (0, react_1.useState)(defaultSortBy);
const [sortByReaction, setSortByReaction] = (0, react_1.useState)(defaultSortByReaction);
const [sortDir, setSortDir] = (0, react_1.useState)(defaultSortDir);
const [sortType, setSortType] = (0, react_1.useState)(defaultSortType);
const [page, setPage] = (0, react_1.useState)(1);
const [entities, setEntities] = (0, react_1.useState)([]);
const resetEntities = (0, react_1.useCallback)(async () => {
try {
loading.current = true;
setLoadingState(true);
hasMore.current = true;
setHasMoreState(true);
setPage(1);
const response = await fetchManyEntities({
userId,
page: 1,
sortBy,
sortByReaction,
sortDir,
sortType,
timeFrame,
sourceId,
spaceId,
limit,
include,
followedOnly,
keywordsFilters,
titleFilters,
contentFilters,
attachmentsFilters,
locationFilters,
metadataFilters,
});
if (response) {
const { data: newEntities, pagination } = response;
setEntities(newEntities);
hasMore.current = pagination.hasMore;
setHasMoreState(pagination.hasMore);
}
}
catch (err) {
(0, handleError_1.handleError)(err, "Failed to reset profile entities:");
}
finally {
loading.current = false;
setLoadingState(false);
}
}, [
fetchManyEntities,
limit,
sortBy,
sortByReaction,
sortDir,
sortType,
timeFrame,
sourceId,
spaceId,
userId,
include,
followedOnly,
keywordsFilters,
titleFilters,
contentFilters,
attachmentsFilters,
locationFilters,
metadataFilters,
]);
const loadMore = () => {
if (loading.current || !hasMore.current)
return;
setPage((prevPage) => {
return prevPage + 1;
});
};
(0, react_1.useEffect)(() => {
resetEntities();
}, [resetEntities]);
// useEffect to get a new batch of entities
(0, react_1.useEffect)(() => {
const loadMoreEntities = async () => {
loading.current = true;
setLoadingState(true);
try {
const response = await fetchManyEntities({
userId,
page,
sortBy,
sortByReaction,
sortDir,
sortType,
timeFrame,
sourceId,
spaceId,
limit,
include,
followedOnly,
keywordsFilters,
titleFilters,
contentFilters,
attachmentsFilters,
locationFilters,
metadataFilters,
});
if (response) {
const { data: newEntities, pagination } = response;
setEntities((prevEntities) => [...prevEntities, ...newEntities]);
hasMore.current = pagination.hasMore;
setHasMoreState(pagination.hasMore);
}
}
catch (err) {
(0, handleError_1.handleError)(err, "Loading more entities failed:");
}
finally {
loading.current = false;
setLoadingState(false);
}
};
// We only load more if the page changed
if (page > 1 && hasMore.current && !loading.current) {
loadMoreEntities();
}
}, [
page,
fetchManyEntities,
userId,
sortBy,
sortByReaction,
sortDir,
sortType,
timeFrame,
sourceId,
spaceId,
limit,
include,
followedOnly,
keywordsFilters,
titleFilters,
contentFilters,
attachmentsFilters,
locationFilters,
metadataFilters,
]);
return {
entities,
loading: loadingState,
hasMore: hasMoreState,
sortBy,
sortByReaction,
sortDir,
sortType,
setSortBy,
setSortByReaction,
setSortDir,
setSortType,
loadMore,
};
}
exports.default = useFetchManyEntitiesWrapper;
//# sourceMappingURL=useFetchManyEntitiesWrapper.js.map