UNPKG

@replyke/core

Version:

Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.

140 lines 5.54 kB
"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