@pmwcs/ripple
Version:
PMWCS ripple component
182 lines (157 loc) • 8.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useRippleFoundation = void 0;
var _hooks = require("preact/hooks");
var _base = require("@pmwcs/base");
var _ripple = require("@material/ripple");
var _excluded = ["foundation"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
var useRippleFoundation = function useRippleFoundation(props) {
var isTouched = (0, _hooks.useRef)(false);
var _useFoundation = (0, _base.useFoundation)({
props: props,
elements: {
rootEl: true,
surfaceEl: true
},
foundation: function foundation(_ref) {
var rootEl = _ref.rootEl,
surfaceEl = _ref.surfaceEl,
getProps = _ref.getProps;
return new _ripple.MDCRippleFoundation({
browserSupportsCssVars: function browserSupportsCssVars() {
return _ripple.util.supportsCssVariables(window);
},
isUnbounded: function isUnbounded() {
return !!getProps().unbounded;
},
isSurfaceActive: function isSurfaceActive() {
if (rootEl.ref) {
return (0, _base.matches)(rootEl.ref, ':active');
}
return false;
},
isSurfaceDisabled: function isSurfaceDisabled() {
return !!getProps().disabled;
},
addClass: function addClass(className) {
surfaceEl.addClass(className);
},
removeClass: function removeClass(className) {
surfaceEl.removeClass(className);
},
containsEventTarget: function containsEventTarget(target) {
return !!rootEl.ref && rootEl.ref.contains(target);
},
registerInteractionHandler: function registerInteractionHandler() {},
deregisterInteractionHandler: function deregisterInteractionHandler() {},
registerDocumentInteractionHandler: function registerDocumentInteractionHandler(evtType, handler) {
return document.documentElement.addEventListener(evtType, handler, (0, _base.applyPassive)());
},
deregisterDocumentInteractionHandler: function deregisterDocumentInteractionHandler(evtType, handler) {
return document.documentElement.removeEventListener(evtType, handler, (0, _base.applyPassive)());
},
registerResizeHandler: function registerResizeHandler(handler) {
return window.addEventListener('resize', handler);
},
deregisterResizeHandler: function deregisterResizeHandler(handler) {
return window.removeEventListener('resize', handler);
},
updateCssVariable: function updateCssVariable(varName, value) {
return surfaceEl.setStyle(varName, value);
},
computeBoundingRect: function computeBoundingRect() {
return rootEl.ref ? rootEl.ref.getBoundingClientRect() : _base.emptyClientRect;
},
getWindowPageOffset: function getWindowPageOffset() {
return {
x: window.pageXOffset,
y: window.pageYOffset
};
}
});
}
}),
foundation = _useFoundation.foundation,
elements = _objectWithoutProperties(_useFoundation, _excluded);
var rootEl = elements.rootEl;
var activateRipple = (0, _hooks.useCallback)(function (evt) {
// https://reactjs.org/docs/events.html#event-pooling
evt.persist();
foundation.activate(evt);
}, [foundation]);
var deactivateRipple = (0, _hooks.useCallback)(function (evt) {
// https://reactjs.org/docs/events.html#event-pooling
evt.persist();
foundation.deactivate();
}, [foundation]);
var handleFocus = (0, _hooks.useCallback)(function (evt) {
var _props$onFocus;
(_props$onFocus = props.onFocus) === null || _props$onFocus === void 0 ? void 0 : _props$onFocus.call(props, evt);
foundation.handleFocus();
}, [foundation, props.onFocus]);
var handleBlur = (0, _hooks.useCallback)(function (evt) {
var _props$onBlur;
(_props$onBlur = props.onBlur) === null || _props$onBlur === void 0 ? void 0 : _props$onBlur.call(props, evt);
foundation.handleBlur();
}, [foundation, props.onBlur]);
var handleMouseDown = (0, _hooks.useCallback)(function (evt) {
var _props$onMouseDown;
(_props$onMouseDown = props.onMouseDown) === null || _props$onMouseDown === void 0 ? void 0 : _props$onMouseDown.call(props, evt);
if (!isTouched.current) {
activateRipple(evt);
}
isTouched.current = false;
}, [props.onMouseDown, activateRipple]);
var handleMouseUp = (0, _hooks.useCallback)(function (evt) {
var _props$onMouseUp;
(_props$onMouseUp = props.onMouseUp) === null || _props$onMouseUp === void 0 ? void 0 : _props$onMouseUp.call(props, evt);
deactivateRipple(evt);
}, [props.onMouseUp, deactivateRipple]);
var handleTouchStart = (0, _hooks.useCallback)(function (evt) {
var _props$onTouchStart;
isTouched.current = true;
(_props$onTouchStart = props.onTouchStart) === null || _props$onTouchStart === void 0 ? void 0 : _props$onTouchStart.call(props, evt);
activateRipple(evt);
}, [props.onTouchStart, activateRipple]);
var handleTouchEnd = (0, _hooks.useCallback)(function (evt) {
var _props$onTouchEnd;
(_props$onTouchEnd = props.onTouchEnd) === null || _props$onTouchEnd === void 0 ? void 0 : _props$onTouchEnd.call(props, evt);
deactivateRipple(evt);
}, [props.onTouchEnd, deactivateRipple]);
var handleKeyDown = (0, _hooks.useCallback)(function (evt) {
var _props$onKeyDown;
(_props$onKeyDown = props.onKeyDown) === null || _props$onKeyDown === void 0 ? void 0 : _props$onKeyDown.call(props, evt);
activateRipple(evt);
}, [props.onKeyDown, activateRipple]);
var handleKeyUp = (0, _hooks.useCallback)(function (evt) {
var _props$onKeyUp;
(_props$onKeyUp = props.onKeyUp) === null || _props$onKeyUp === void 0 ? void 0 : _props$onKeyUp.call(props, evt);
deactivateRipple(evt);
}, [props.onKeyUp, deactivateRipple]);
rootEl.setProp('onFocus', handleFocus, true);
rootEl.setProp('onBlur', handleBlur, true);
rootEl.setProp('onMouseDown', handleMouseDown, true);
rootEl.setProp('onMouseUp', handleMouseUp, true);
rootEl.setProp('onTouchStart', handleTouchStart, true);
rootEl.setProp('onTouchEnd', handleTouchEnd, true);
rootEl.setProp('onKeyDown', handleKeyDown, true);
rootEl.setProp('onKeyUp', handleKeyUp, true);
(0, _hooks.useEffect)(function () {
rootEl.setRef(props.domNode);
}, [rootEl, props.domNode]);
(0, _hooks.useEffect)(function () {
foundation.setUnbounded(!!props.unbounded);
}, [props.unbounded, foundation]);
(0, _hooks.useEffect)(function () {
props.disabled && foundation.handleBlur();
}, [props.disabled, foundation]);
return _objectSpread({}, elements);
};
exports.useRippleFoundation = useRippleFoundation;