@hf-chimera/store
Version:
Cross-end reactivity API
69 lines (67 loc) • 2.29 kB
JavaScript
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