@replyke/core
Version:
Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.
140 lines • 5.54 kB
JavaScript
"use strict";
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 collectionsApi_1 = require("../../store/api/collectionsApi");
const handleError_1 = require("../../utils/handleError");
const useProject_1 = __importDefault(require("../projects/useProject"));
const useCollections_1 = __importDefault(require("./useCollections"));
const hooks_1 = require("../../store/hooks");
const collectionsSlice_1 = require("../../store/slices/collectionsSlice");
function useCollectionEntitiesWrapper(props) {
const { collectionId: passedCollectionId, limit = 20, defaultSortBy = "added", defaultSortDir = "desc", include, } = props;
const dispatch = (0, hooks_1.useReplykeDispatch)();
const { projectId } = (0, useProject_1.default)();
const { currentCollection } = (0, useCollections_1.default)();
const [fetchCollectionEntitiesQuery] = (0, collectionsApi_1.useLazyFetchCollectionEntitiesQuery)();
const effectiveCollectionId = passedCollectionId ?? currentCollection?.id;
// Read entities from shared Redux state — written here and by useCollectionsActions for optimistic updates
const entities = (0, hooks_1.useReplykeSelector)((0, collectionsSlice_1.selectCollectionEntities)(effectiveCollectionId));
const includeString = (0, react_1.useMemo)(() => (Array.isArray(include) ? include.join(",") : include), [include]);
const loading = (0, react_1.useRef)(false);
const [loadingState, setLoadingState] = (0, react_1.useState)(false);
const hasMore = (0, react_1.useRef)(true);
const [hasMoreState, setHasMoreState] = (0, react_1.useState)(true);
const [sortBy, setSortBy] = (0, react_1.useState)(defaultSortBy);
const [sortDir, setSortDir] = (0, react_1.useState)(defaultSortDir);
const [page, setPage] = (0, react_1.useState)(1);
const resetEntities = (0, react_1.useCallback)(async () => {
if (!projectId || !effectiveCollectionId) {
return;
}
try {
loading.current = true;
setLoadingState(true);
hasMore.current = true;
setHasMoreState(true);
setPage(1);
const response = await fetchCollectionEntitiesQuery({
projectId,
collectionId: effectiveCollectionId,
page: 1,
limit,
sortBy,
sortDir,
include,
}).unwrap();
if (response) {
const { data: newEntities, pagination } = response;
dispatch((0, collectionsSlice_1.setCollectionEntities)({ collectionId: effectiveCollectionId, entities: newEntities }));
hasMore.current = pagination.hasMore;
setHasMoreState(pagination.hasMore);
}
}
catch (err) {
(0, handleError_1.handleError)(err, "Failed to fetch collection entities:");
}
finally {
loading.current = false;
setLoadingState(false);
}
}, [
dispatch,
fetchCollectionEntitiesQuery,
projectId,
effectiveCollectionId,
limit,
sortBy,
sortDir,
includeString,
]);
const loadMore = (0, react_1.useCallback)(() => {
if (loading.current || !hasMore.current)
return;
setPage((prevPage) => prevPage + 1);
}, []);
(0, react_1.useEffect)(() => {
resetEntities();
}, [resetEntities]);
(0, react_1.useEffect)(() => {
const loadMoreEntities = async () => {
if (!projectId || !effectiveCollectionId) {
return;
}
loading.current = true;
setLoadingState(true);
try {
const response = await fetchCollectionEntitiesQuery({
projectId,
collectionId: effectiveCollectionId,
page,
limit,
sortBy,
sortDir,
include,
}).unwrap();
if (response) {
const { data: newEntities, pagination } = response;
dispatch((0, collectionsSlice_1.appendCollectionEntities)({ collectionId: effectiveCollectionId, entities: newEntities }));
hasMore.current = pagination.hasMore;
setHasMoreState(pagination.hasMore);
}
}
catch (err) {
(0, handleError_1.handleError)(err, "Loading more collection entities failed:");
}
finally {
loading.current = false;
setLoadingState(false);
}
};
if (page > 1 && hasMore.current && !loading.current) {
loadMoreEntities();
}
}, [
page,
dispatch,
fetchCollectionEntitiesQuery,
projectId,
effectiveCollectionId,
limit,
sortBy,
sortDir,
includeString,
]);
return {
entities,
loading: loadingState,
hasMore: hasMoreState,
sortBy,
sortDir,
setSortBy,
setSortDir,
loadMore,
refetch: resetEntities,
};
}
exports.default = useCollectionEntitiesWrapper;
//# sourceMappingURL=useCollectionEntitiesWrapper.js.map