@hf-chimera/store
Version:
Cross-end reactivity API
70 lines (68 loc) • 2.43 kB
JavaScript
const require_params = require('../params-C5dnCvJr.cjs');
require('../defaults-C48gY1ow.cjs');
require('../src-YxpDmKvq.cjs');
require('../qb-D6vPK6P0.cjs');
let react = require("react");
react = require_params.__toESM(react);
//#region packages/adapters/react/hooks.ts
const CHIMERA_COLLECTION_UPDATE_EVENTS = [
"ready",
"updated",
"selfUpdated",
"selfItemCreated",
"itemAdded",
"itemUpdated",
"selfItemUpdated",
"itemDeleted",
"selfItemDeleted",
"error"
];
const CHIMERA_ITEM_UPDATE_EVENTS = [
"initialized",
"selfCreated",
"ready",
"updated",
"selfUpdated",
"deleted",
"selfDeleted",
"error"
];
const createChimeraHooks = (store) => {
const useChimeraRepository = (entityName) => (0, react.useMemo)(() => store.from(entityName), [entityName]);
return {
useChimeraStore: () => store,
useChimeraRepository,
useChimeraCollection: (entityName, params, deps) => {
const [, trigger] = (0, react.useState)(() => ({}));
const repository = useChimeraRepository(entityName);
const oldDeps = (0, react.useRef)(deps);
if (oldDeps.current && !deps || !oldDeps.current && deps) console.warn("useChimeraCollection deps is not a reactive param!\nUse deps if you want to control dependencies manually.\nOmit it if you already have a stable reference to params");
oldDeps.current = deps;
const memeParams = (0, react.useMemo)(() => require_params.normalizeParams(params), deps ? deps : [params]);
const collection = (0, react.useMemo)(() => repository.getCollection(memeParams), [repository, memeParams]);
(0, react.useEffect)(() => {
const handler = () => trigger({});
for (const event of CHIMERA_COLLECTION_UPDATE_EVENTS) collection.on(event, handler);
return () => {
for (const event of CHIMERA_COLLECTION_UPDATE_EVENTS) collection.off(event, handler);
};
}, [collection]);
return collection;
},
useChimeraItem: (entityName, id, meta) => {
const [, trigger] = (0, react.useState)(() => ({}));
const item = useChimeraRepository(entityName).getItem(id, meta);
(0, react.useEffect)(() => {
const handler = () => trigger({});
for (const event of CHIMERA_ITEM_UPDATE_EVENTS) item.on(event, handler);
return () => {
for (const event of CHIMERA_ITEM_UPDATE_EVENTS) item.off(event, handler);
};
}, [item]);
return item;
}
};
};
//#endregion
exports.createChimeraHooks = createChimeraHooks;
//# sourceMappingURL=react.cjs.map