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