36 lines
826 B
JavaScript
36 lines
826 B
JavaScript
|
'use client';
|
||
|
|
||
|
import useLazyRef from '../useLazyRef/useLazyRef';
|
||
|
import useOnMount from '../useOnMount/useOnMount';
|
||
|
export class Timeout {
|
||
|
constructor() {
|
||
|
this.currentId = null;
|
||
|
this.clear = () => {
|
||
|
if (this.currentId !== null) {
|
||
|
clearTimeout(this.currentId);
|
||
|
this.currentId = null;
|
||
|
}
|
||
|
};
|
||
|
this.disposeEffect = () => {
|
||
|
return this.clear;
|
||
|
};
|
||
|
}
|
||
|
static create() {
|
||
|
return new Timeout();
|
||
|
}
|
||
|
/**
|
||
|
* Executes `fn` after `delay`, clearing any previously scheduled call.
|
||
|
*/
|
||
|
start(delay, fn) {
|
||
|
this.clear();
|
||
|
this.currentId = setTimeout(() => {
|
||
|
this.currentId = null;
|
||
|
fn();
|
||
|
}, delay);
|
||
|
}
|
||
|
}
|
||
|
export default function useTimeout() {
|
||
|
const timeout = useLazyRef(Timeout.create).current;
|
||
|
useOnMount(timeout.disposeEffect);
|
||
|
return timeout;
|
||
|
}
|