@replyke/core
Version:
Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.
54 lines • 2.29 kB
JavaScript
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