UNPKG

@orca-fe/hooks

Version:

React Hooks Collections

168 lines (165 loc) 4.94 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.createHotkeyCache = createHotkeyCache; exports.divOnlyFilter = divOnlyFilter; exports.formatHotKeyStr = formatHotKeyStr; exports.isInput = isInput; exports.isMac = isMac; exports.toHotkeyStr = toHotkeyStr; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper")); var _detectBrowser = require("detect-browser"); /** * 是否为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'; } var fnKeysOrder = { Command: 1, Ctrl: 2, Alt: 3, Shift: 4 }; /** * 格式化快捷键字符串,按顺序排列功能键 * @param hotkeyStr */ function formatHotKeyStr() { var hotkeyStr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var hotkeyArr = hotkeyStr.split('+'); var fnKeys = []; var normalKeys = []; var _iterator = (0, _createForOfIteratorHelper2.default)(hotkeyArr), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var key = _step.value; if (fnKeysOrder[key]) { fnKeys.push(key); } else { normalKeys.push(key || '+'); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return [].concat((0, _toConsumableArray2.default)(fnKeys.sort(function (a, b) { return fnKeysOrder[a] - fnKeysOrder[b]; })), normalKeys).join('+'); } function toHotkeyStr(event) { var metaKey = event.metaKey, ctrlKey = event.ctrlKey, altKey = event.altKey, shiftKey = event.shiftKey, _key = event.key, keyCode = event.keyCode; var key = _key; // 如果是數字或字母,使用 fromCharCode 的方式 if (keyCode >= 0x30 && keyCode <= 0x39 || keyCode >= 0x41 && keyCode <= 0x5a) { key = String.fromCharCode(keyCode); } 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 (/^[a-z]$/.test(key)) { 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 (/^[a-z]$/.test(key)) { keyArr.push(key.toUpperCase()); } else { keyArr.push(key); } } return formatHotKeyStr(keyArr.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 isInput(element) { return element.tagName === 'INPUT' || element.tagName === 'TEXTAREA'; } function smartForEach(arr, callback) { if (Array.isArray(arr)) { arr.forEach(callback); } else { callback(arr, 0); } } /** * 生成热键缓存 */ function createHotkeyCache(hotkey) { var hotkeyMapping = new Map(); var macHotkeyMapping = new Map(); Object.entries(hotkey).forEach(function (_ref) { var _ref2 = (0, _slicedToArray2.default)(_ref, 2), hotkeyName = _ref2[0], commands = _ref2[1]; var _commands = (0, _slicedToArray2.default)(commands, 2), winKeys = _commands[0], _commands$ = _commands[1], macKeys = _commands$ === void 0 ? winKeys : _commands$; smartForEach(winKeys, function (hotKey) { if (hotkeyMapping.has(hotKey)) { console.warn("Duplicate hot-key '".concat(hotKey, "' for command [").concat(hotkeyName, "]")); } else { hotkeyMapping.set(hotKey, hotkeyName); } if (!macKeys) { if (macHotkeyMapping.has(hotKey)) { console.warn("Duplicate hot-key '".concat(hotKey, "' for command(Mac) [").concat(hotkeyName, "]")); } else { macHotkeyMapping.set(hotKey, hotkeyName); } } }); // MacMode if (macKeys) { smartForEach(macKeys, function (hotKey) { if (macHotkeyMapping.has(hotKey)) { console.warn("Duplicate hot-key '".concat(hotKey, "' for command(Mac) [").concat(hotkeyName, "]")); } else { macHotkeyMapping.set(hotKey, hotkeyName); } }); } }); return { hotkeyMapping: hotkeyMapping, macHotkeyMapping: macHotkeyMapping }; }