UNPKG

@forest-js/core

Version:

A tiny, functional DOM engine with explicit update and real DOM.

59 lines 2.02 kB
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