UNPKG

@replyke/core

Version:

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

59 lines 2.6 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 lodash_1 = __importDefault(require("lodash")); const handleError_1 = require("../../utils/handleError"); const useInfusedData = ({ entities, infuseData }) => { const [infusedEntities, setInfusedEntities] = (0, react_1.useState)([]); const detailsCache = (0, react_1.useRef)({}); // Cache the previous entities to detect actual changes const previousEntities = (0, react_1.useRef)([]); const infuseEntities = (0, react_1.useCallback)(async (entities) => { if (!infuseData) return; try { const newCombinedData = await Promise.all(entities.map(async (entity) => { if (!entity.foreignId) return { ...entity, infusion: {} }; // Check if we already have the post_details cached if (detailsCache.current[entity.foreignId]) { const cachedDetails = detailsCache.current[entity.foreignId]; return { ...entity, infusion: { ...cachedDetails } }; } try { const details = await infuseData(entity.foreignId); if (!details) return { ...entity, infusion: {} }; // Update the cache detailsCache.current[entity.foreignId] = details; return { ...entity, infusion: { ...details } }; } catch (err) { // Handle data fetch errors console.error("Data fetch error:", err); // Re-throw other errors to be handled by the outer catch throw err; } })); setInfusedEntities(newCombinedData); } catch (err) { (0, handleError_1.handleError)(err, "Failed to infuse entity details: "); } }, [infuseData]); // When entities change, fetch details for new entities (0, react_1.useEffect)(() => { if (!entities.length) return; if (!lodash_1.default.isEqual(previousEntities.current, entities)) { previousEntities.current = entities; infuseEntities(entities); } }, [entities, infuseEntities]); return infusedEntities; }; exports.default = useInfusedData; //# sourceMappingURL=useInfusedData.js.map