ahooks
Version:
react hooks library
58 lines (57 loc) • 2.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _useLatest = _interopRequireDefault(require("../useLatest"));
var _domTarget = require("../utils/domTarget");
var _getDocumentOrShadow = _interopRequireDefault(require("../utils/getDocumentOrShadow"));
var _useEffectWithTarget = _interopRequireDefault(require("../utils/useEffectWithTarget"));
var normalizeOptions = function normalizeOptions(options) {
var _a, _b;
if (typeof options === 'string' || Array.isArray(options)) {
return {
eventName: options,
enabled: true
};
}
return {
eventName: (_a = options.eventName) !== null && _a !== void 0 ? _a : 'click',
enabled: (_b = options.enabled) !== null && _b !== void 0 ? _b : true
};
};
var useClickAway = function useClickAway(onClickAway, target) {
var eventNameOrOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'click';
var onClickAwayRef = (0, _useLatest["default"])(onClickAway);
var _normalizeOptions = normalizeOptions(eventNameOrOptions),
eventName = _normalizeOptions.eventName,
enabled = _normalizeOptions.enabled;
(0, _useEffectWithTarget["default"])(function () {
if (!enabled) {
return;
}
var handler = function handler(event) {
var targets = Array.isArray(target) ? target : [target];
if (targets.some(function (item) {
var targetElement = (0, _domTarget.getTargetElement)(item);
return !targetElement || targetElement.contains(event.target);
})) {
return;
}
onClickAwayRef.current(event);
};
var documentOrShadow = (0, _getDocumentOrShadow["default"])(target);
var eventNames = Array.isArray(eventName) ? eventName : [eventName];
eventNames.forEach(function (event) {
documentOrShadow.addEventListener(event, handler);
});
return function () {
eventNames.forEach(function (event) {
documentOrShadow.removeEventListener(event, handler);
});
};
}, [].concat((0, _toConsumableArray2["default"])(Array.isArray(eventName) ? eventName : [eventName]), [enabled]), target);
};
var _default = exports["default"] = useClickAway;