@appbuckets/react-ui
Version:
Just Another React UI Framework
132 lines (124 loc) • 3.45 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var tslib = require('tslib');
var React = require('react');
var clsx = require('clsx');
function _interopDefaultLegacy(e) {
return e && typeof e === 'object' && 'default' in e ? e : { default: e };
}
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(
n,
k,
d.get
? d
: {
enumerable: true,
get: function () {
return e[k];
},
}
);
}
});
}
n['default'] = e;
return Object.freeze(n);
}
var React__namespace = /*#__PURE__*/ _interopNamespace(React);
var clsx__default = /*#__PURE__*/ _interopDefaultLegacy(clsx);
function useRipples() {
// ----
// Initialize Ripples
// ----
var _a = tslib.__read(React__namespace.useState([]), 2),
ripples = _a[0],
setRipples = _a[1];
// ----
// Show the ripple using click event
// ----
var showRipple = React__namespace.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__default['default']('ripple', {
inverted: props === null || props === void 0 ? void 0 : props.inverted,
});
/** Add the new Ripple */
setRipples(function (curr) {
return tslib.__spreadArray(
tslib.__spreadArray([], tslib.__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__namespace.useMemo(
function () {
return React__namespace.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__namespace.createElement(
'span',
tslib.__assign({}, props, { onAnimationEnd: handleAnimationEnd })
);
})
);
},
[ripples]
);
// ----
// Return utility
// ----
return [showRipple, ripplesArray];
}
exports.useRipples = useRipples;