@faiz-ui/ripple
Version:
Ripple effect
34 lines (31 loc) • 850 B
JavaScript
"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
};