From 52cd3c6e8d4dd9402dd89777d1a55cf862f64241 Mon Sep 17 00:00:00 2001 From: Elijah Duffy Date: Mon, 20 Apr 2026 19:15:00 -0700 Subject: [PATCH] add preventable and reversible event helper system --- src/lib/index.ts | 1 + src/lib/prevent.ts | 63 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/lib/prevent.ts diff --git a/src/lib/index.ts b/src/lib/index.ts index c3dd976..e6e3a80 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -31,6 +31,7 @@ export { default as Label } from './Label.svelte'; export { default as Link, rewriteHref } from './Link.svelte'; export { default as PhoneInput } from './PhoneInput.svelte'; export { default as PinInput } from './PinInput.svelte'; +export { type Preventable, checkPreventer, type Reversible, checkReversible } from './prevent'; export { default as RadioGroup } from './RadioGroup.svelte'; export { default as ScrollBox } from './ScrollBox.svelte'; export { default as Spinner } from './Spinner.svelte'; diff --git a/src/lib/prevent.ts b/src/lib/prevent.ts new file mode 100644 index 0000000..67dbfbd --- /dev/null +++ b/src/lib/prevent.ts @@ -0,0 +1,63 @@ +/** + * A type for a function that can be prevented from executing its default behavior. + * See checkPreventer for easy usage of this type. + */ +export type Preventable = (ev: T & { prevent: () => void }) => Promise | void; + +/** + * Calls the provided function with a preventer object, and if the preventer is not + * prevented, calls the callback function. + * @param fn The function to call with the preventer. + * @param ev The event object to pass to the function. + * @param cb The callback function to call if the preventer is not prevented. + * @returns A promise that resolves to true if the action was not prevented, or false if it was prevented. + */ +export const checkPreventer = async ( + fn: Preventable, + ev: T, + cb?: () => void +): Promise => { + let prevented = false; + const preventer = { + prevent: () => { + prevented = true; + } + }; + await fn({ ...ev, ...preventer }); + if (!prevented && cb) { + cb(); + } + return !prevented; +}; + +/** + * A type for a function that can be reversed after executing its behavior. + * See checkReversible for easy usage of this type. + */ +export type Reversible = (ev: T & { reverse: () => void }) => Promise | void; + +/** + * Calls the provided function with a reverser object, and if the reverser is + * reversed, calls the callback function. + * @param fn The function to call with the reverser. + * @param ev The event object to pass to the function. + * @param cb The callback function to call if the reverser is reversed. + * @returns A promise that resolves to true if the action was not reversed, or false if it was reversed. + */ +export const checkReversible = async ( + fn: Reversible, + ev: T, + cb?: () => void +): Promise => { + let reversed = false; + const reverser = { + reverse: () => { + reversed = true; + } + }; + await fn({ ...ev, ...reverser }); + if (reversed && cb) { + cb(); + } + return !reversed; +};