UNPKG

@trail-ui/react

Version:
37 lines (35 loc) 1.08 kB
// src/ripple/use-ripple.ts import { useCallback, useEffect, useState } from "react"; function useRipple(props = {}) { const { removeAfter = 1e3, ...otherProps } = props; const [ripples, setRipples] = useState([]); useEffect(() => { const timeoutIds = ripples.map( (_, i) => setTimeout(() => { setRipples((prevState) => prevState.filter((_2, index) => index !== i)); }, removeAfter) // remove after 1s ); return () => { timeoutIds.forEach((id) => clearTimeout(id)); }; }, [removeAfter, ripples]); const onClick = useCallback((event) => { const trigger = event.currentTarget; const size = Math.max(trigger.clientWidth, trigger.clientHeight); const rect = trigger.getBoundingClientRect(); setRipples((prevRipples) => [ ...prevRipples, { key: (/* @__PURE__ */ new Date()).getTime(), size, x: event.clientX - rect.x - size / 2, y: event.clientY - rect.y - size / 2 } ]); }, []); return { ripples, onClick, ...otherProps }; } export { useRipple };