40 lines
878 B
TypeScript
40 lines
878 B
TypeScript
import React from 'react';
|
|
|
|
type UsePulseAnimationOptions = {
|
|
intervalMs?: number;
|
|
delayMs?: number;
|
|
};
|
|
|
|
export function usePulseAnimation({ intervalMs = 2400, delayMs = 0 }: UsePulseAnimationOptions = {}) {
|
|
const [active, setActive] = React.useState(false);
|
|
|
|
React.useEffect(() => {
|
|
let interval: ReturnType<typeof setInterval> | undefined;
|
|
let timeout: ReturnType<typeof setTimeout> | undefined;
|
|
|
|
const start = () => {
|
|
setActive((prev) => !prev);
|
|
interval = setInterval(() => {
|
|
setActive((prev) => !prev);
|
|
}, intervalMs);
|
|
};
|
|
|
|
if (delayMs > 0) {
|
|
timeout = setTimeout(start, delayMs);
|
|
} else {
|
|
start();
|
|
}
|
|
|
|
return () => {
|
|
if (interval) {
|
|
clearInterval(interval);
|
|
}
|
|
if (timeout) {
|
|
clearTimeout(timeout);
|
|
}
|
|
};
|
|
}, [delayMs, intervalMs]);
|
|
|
|
return active;
|
|
}
|