UNPKG

@pmwcs/ripple

Version:

PMWCS ripple component

182 lines (157 loc) 8.66 kB
"use strict"; 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;