@forest-js/core
Version:
A tiny, functional DOM engine with explicit update and real DOM.
59 lines • 2.02 kB
JavaScript
import { ensureMeta, enqueue } from "../dom";
import { createUtility } from "./core";
/**
* @function addTrigger
* @description Utility for adding triggers to an element
* @template R Trigger object to add
* @template S StoreMap type when used reactively
* @template E Element type (defaults to HTMLElement)
* @param args - Trigger object or store and mapper function
* @returns Utility function for adding triggers
* @example
* ```ts
* addTrigger({ customTrigger: () => console.log("Custom trigger") })(MyElement);
* const triggers = getTriggers(MyElement);
* triggers.customTrigger();
* ```
*/
export const addTrigger = (...args) => {
return createUtility((el) => {
const meta = ensureMeta(el);
const triggers = (meta.triggers ??= {});
if (args.length === 2 && typeof args[1] === "function") {
const [stores, mapper] = args;
const apply = () => {
const values = {};
for (const key in stores)
values[key] = stores[key].get();
Object.assign(triggers, mapper(values));
};
apply();
const unsubs = Object.values(stores).map((store) => store.subscribe(() => enqueue(apply)));
meta.storeBindings ??= new Set();
unsubs.forEach((unsub) => meta.storeBindings.add(unsub));
}
else {
const [triggers] = args;
Object.assign(triggers, triggers);
}
return el;
});
};
/**
* @function getTrigger
* @description Utility for getting triggers from an element for use outside of component
* @template T Trigger object type
* @template E Element type (defaults to HTMLElement)
* @param el - Element to get triggers from
* @returns Trigger object
* @example
* ```ts
* const triggers = getTriggers(MyElement);
* triggers.customTrigger();
* ```
*/
export const getTrigger = (el) => {
const meta = ensureMeta(el);
return meta.triggers;
};
//# sourceMappingURL=trigger.js.map