bits-ui
Version:
The headless components for Svelte.
37 lines (36 loc) • 1.04 kB
JavaScript
import { box } from "svelte-toolbelt";
import { noop } from "./noop.js";
const defaultOptions = {
afterMs: 10000,
onChange: noop,
};
/**
* Creates a box which will be reset to the default value after some time.
*
* @param defaultValue The value which will be set.
* @param afterMs A zero-or-greater delay in milliseconds.
*/
export function boxAutoReset(defaultValue, options) {
const { afterMs, onChange, getWindow } = { ...defaultOptions, ...options };
let timeout = null;
let value = $state(defaultValue);
function resetAfter() {
return getWindow().setTimeout(() => {
value = defaultValue;
onChange?.(defaultValue);
}, afterMs);
}
$effect(() => {
return () => {
if (timeout)
getWindow().clearTimeout(timeout);
};
});
return box.with(() => value, (v) => {
value = v;
onChange?.(v);
if (timeout)
getWindow().clearTimeout(timeout);
timeout = resetAfter();
});
}