UNPKG

@replyke/core

Version:

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

54 lines 2.29 kB
import { useCallback, useEffect, useRef, useState } from "react"; import _ from "lodash"; import { handleError } from "../../utils/handleError"; const useInfusedData = ({ entities, infuseData }) => { const [infusedEntities, setInfusedEntities] = useState([]); const detailsCache = useRef({}); // Cache the previous entities to detect actual changes const previousEntities = useRef([]); const infuseEntities = 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) { handleError(err, "Failed to infuse entity details: "); } }, [infuseData]); // When entities change, fetch details for new entities useEffect(() => { if (!entities.length) return; if (!_.isEqual(previousEntities.current, entities)) { previousEntities.current = entities; infuseEntities(entities); } }, [entities, infuseEntities]); return infusedEntities; }; export default useInfusedData; //# sourceMappingURL=useInfusedData.js.map