UNPKG

@orca-fe/hooks

Version:

React Hooks Collections

138 lines (133 loc) 3.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useCombineKeyListener; exports.divOnlyFilter = divOnlyFilter; exports.isMac = isMac; exports.normalizeHotkeyStr = normalizeHotkeyStr; exports.toHotkeyStr = toHotkeyStr; var _ahooks = require("ahooks"); var _detectBrowser = require("detect-browser"); var _react = require("react"); // deprecated /** * 是否为mac系统(包含iphone手机) * */ function isMac() { var info = (0, _detectBrowser.detect)(); return (info === null || info === void 0 ? void 0 : info.os) === 'Mac OS' || (info === null || info === void 0 ? void 0 : info.os) === 'darwin'; } function toHotkeyStr(event) { var metaKey = event.metaKey, ctrlKey = event.ctrlKey, altKey = event.altKey, shiftKey = event.shiftKey, key = event.key; if (key === 'Command' || key === 'Control' || key === 'Meta' || key === 'Shift' || key === 'Alt') return ''; var keyArr = []; if (isMac()) { if (metaKey) { keyArr.push('Command'); } if (ctrlKey) { keyArr.push('Ctrl'); } if (shiftKey) { keyArr.push('Shift'); } if (altKey) { keyArr.push('Alt'); } if (key.length === 1) { keyArr.push(key.toUpperCase()); } else { keyArr.push(key); } } else { if (ctrlKey) { keyArr.push('Ctrl'); } if (shiftKey) { keyArr.push('Shift'); } if (altKey) { keyArr.push('Alt'); } if (metaKey) { keyArr.push('Meta'); } if (key.length === 1) { keyArr.push(key.toUpperCase()); } else { keyArr.push(key); } } return keyArr.join('+'); } // 功能键权重 var fnKeyOrder = { Command: -10, Ctrl: -8, Shift: -6, Alt: -4, Meta: -2 }; // 将 hotkey 标准化 function normalizeHotkeyStr(hotkeyStr) { var keyArr = hotkeyStr.trim().split('+'); return keyArr.map(function (key) { return key.trim(); }) // 按功能键权重排序 .sort(function (key1, key2) { return (fnKeyOrder[key1] || 0) - (fnKeyOrder[key2] || 0); }).join('+'); } function divOnlyFilter(e) { var _e$target; if (((_e$target = e.target) === null || _e$target === void 0 ? void 0 : _e$target['tagName']) === 'DIV') { return true; } return false; } function useCombineKeyListener(combineKey, callback) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var _options$stopPropagat = options.stopPropagation, stopPropagation = _options$stopPropagat === void 0 ? false : _options$stopPropagat, _options$preventDefau = options.preventDefault, preventDefault = _options$preventDefau === void 0 ? false : _options$preventDefau, filter = options.filter, _options$allElement = options.allElement, allElement = _options$allElement === void 0 ? false : _options$allElement; // 支持逗号分隔 var hotkeyStrArr = (0, _react.useMemo)(function () { return combineKey.split(',').map(normalizeHotkeyStr); }, [combineKey]); (0, _ahooks.useEventListener)('keydown', function (e) { var hotkeyStr = toHotkeyStr(e); if (!hotkeyStr) return; // 判断是否匹配 hotkey if (!hotkeyStrArr.includes(hotkeyStr)) { return; } // 过滤 if (typeof filter === 'function') { if (filter(e) === false) { return; } } else if (!allElement) { // 没有设置 filter,自动判断,排除不监听的内容 if (['INPUT', 'TEXTAREA', 'BUTTON'].includes(e.target.tagName)) { return; } } if (stopPropagation) { e.stopPropagation(); } if (preventDefault) { e.preventDefault(); } callback(e); }, { target: options.target }); }