@orca-fe/hooks
Version:
React Hooks Collections
168 lines (165 loc) • 4.94 kB
JavaScript
;
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
};
}