UNPKG

@appbuckets/react-ui

Version:
95 lines (92 loc) 2.48 kB
import { __read, __spreadArray, __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; function useRipples() { // ---- // Initialize Ripples // ---- var _a = __read(React.useState([]), 2), ripples = _a[0], setRipples = _a[1]; // ---- // Show the ripple using click event // ---- var showRipple = React.useCallback(function (event, props) { var _a; /** If no event, return */ if ( !event || typeof ((_a = event === null || event === void 0 ? void 0 : event.currentTarget) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect) !== 'function' ) { return; } /** Get the absolute position of ripple */ var _b = event.currentTarget.getBoundingClientRect(), left = _b.left, top = _b.top; var x = event.clientX - left; var y = event.clientY - top; var size = Math.min( event.currentTarget.clientHeight, event.currentTarget.clientWidth ); var classes = clsx('ripple', { inverted: props === null || props === void 0 ? void 0 : props.inverted, }); /** Add the new Ripple */ setRipples(function (curr) { return __spreadArray( __spreadArray([], __read(curr), false), [ { key: event.timeStamp, className: classes, style: { width: size, height: size, left: x - size / 2, top: y - size / 2, }, }, ], false ); }); }, []); // ---- // Remap Props Array to build Node // ---- var ripplesArray = React.useMemo( function () { return React.createElement( 'div', { className: 'ripple-container' }, ripples.map(function (props) { /** Build the handler to remove ripple from array on animation end */ var handleAnimationEnd = function () { setRipples(function (curr) { return curr.filter(function (previous) { return previous.key !== props.key; }); }); }; /** Return the Span Component */ return React.createElement( 'span', __assign({}, props, { onAnimationEnd: handleAnimationEnd }) ); }) ); }, [ripples] ); // ---- // Return utility // ---- return [showRipple, ripplesArray]; } export { useRipples };