UNPKG

@hf-chimera/store

Version:

Cross-end reactivity API

70 lines (68 loc) 2.43 kB
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