UNPKG

@faiz-ui/ripple

Version:

Ripple effect

34 lines (31 loc) 850 B
"use client"; // src/use-ripple.ts import { useCallback, useState, useImperativeHandle } from "react"; function useRipple(props) { const { ref, color = "#eee" } = props; const [ripples, setRipples] = useState([]); const onClick = useCallback((e) => { const target = e.currentTarget; const { width, height, x, y } = target.getBoundingClientRect(); const size = Math.max(width, height); setRipples((pre) => [ ...pre, { key: Date.now(), x: e.clientX - x - size / 2, y: e.clientY - y - size / 2, size } ]); }, []); const onClear = useCallback((key) => { setRipples((pre) => pre.filter((ripple) => ripple.key !== key)); }, []); useImperativeHandle(ref, () => ({ addRipple: onClick })); return { ripples, onClick, onClear, color }; } export { useRipple };