UNPKG

@hf-chimera/store

Version:

Cross-end reactivity API

69 lines (67 loc) 2.29 kB
import "../defaults-CLUQg2zK.js"; import "../src-C74sq0jQ.js"; import "../qb-pchs-vdM.js"; import { t as normalizeParams } from "../params-DmOyCS2B.js"; import { useEffect, useMemo, useRef, useState } from "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) => useMemo(() => store.from(entityName), [entityName]); return { useChimeraStore: () => store, useChimeraRepository, useChimeraCollection: (entityName, params, deps) => { const [, trigger] = useState(() => ({})); const repository = useChimeraRepository(entityName); const oldDeps = 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 = useMemo(() => normalizeParams(params), deps ? deps : [params]); const collection = useMemo(() => repository.getCollection(memeParams), [repository, memeParams]); 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] = useState(() => ({})); const item = useChimeraRepository(entityName).getItem(id, meta); 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 export { createChimeraHooks }; //# sourceMappingURL=react.js.map