You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
24 lines
784 B
24 lines
784 B
import type { EventCallback } from "./events.ts";
|
|
import type { ReadableBox } from "../box/box-extras.svelte.ts";
|
|
|
|
/**
|
|
* Composes event handlers into a single function that can be called with an event.
|
|
* If the previous handler cancels the event using `event.preventDefault()`, the handlers
|
|
* that follow will not be called.
|
|
*/
|
|
export function composeHandlers<E extends Event = Event, T extends Element = Element>(
|
|
...handlers: Array<EventCallback<E> | ReadableBox<EventCallback<E>> | undefined>
|
|
): (e: E) => void {
|
|
return function (this: T, e: E) {
|
|
for (const handler of handlers) {
|
|
if (!handler) continue;
|
|
if (e.defaultPrevented) return;
|
|
if (typeof handler === "function") {
|
|
handler.call(this, e);
|
|
} else {
|
|
handler.current?.call(this, e);
|
|
}
|
|
}
|
|
};
|
|
}
|