UNPKG

@orca-fe/hooks

Version:

React Hooks Collections

159 lines (154 loc) 6.02 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.defaultHotkeyDef = exports.default = exports.actionStack = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _ahooks = require("ahooks"); var _react = require("react"); var _utils = require("./hotkey-manager/utils"); var _syncGlobal = require("./utils/syncGlobal"); /** * 快捷键对象 */ /** * 热键库 */ var defaultHotkeyDef = exports.defaultHotkeyDef = { copy: ['Ctrl+C', 'Command+C'], paste: ['Ctrl+V', 'Command+V'], cut: ['Ctrl+X', 'Command+X'], undo: ['Ctrl+Z', 'Command+Z'], save: ['Ctrl+S', 'Command+S'], redo: [['Ctrl+Shift+Z', 'Ctrl+Y'], ['Command+Shift+Z', 'Command+Y']], confirm: ['Ctrl+Enter', 'Command+Enter'], delete: ['Delete', ['Delete', 'Backspace']], escape: ['Escape'] }; var mapping = (0, _utils.createHotkeyCache)(defaultHotkeyDef); var actionStack = exports.actionStack = []; var handleKeyDown = function handleKeyDown(e) { var hotkeyStr = (0, _utils.toHotkeyStr)(e); if (!hotkeyStr) return; var keyMapping = (0, _utils.isMac)() ? mapping.macHotkeyMapping : mapping.hotkeyMapping; var hotkeyName = keyMapping.get(hotkeyStr); if (window.sessionStorage.useHotkeyListenerDebug) { console.warn('hotkeyStr', hotkeyStr); console.warn('hotkeyName', hotkeyName); } // 在监听器中查找 action for (var _i = 0, _actionStack = actionStack; _i < _actionStack.length; _i++) { var action = _actionStack[_i]; // 禁用的监听器,跳过 if (action.disabled) continue; // 匹配事件名称(允许直接匹配) if (hotkeyName === action.hotkeyName || hotkeyStr === action.hotkeyName) { var _action$target, _ref, _action$action; var triggerTarget = e.target; if (action.input === false) { // 不对 input 内的快捷键进行响应,不做处理,继续/退出 if ((0, _utils.isInput)(triggerTarget)) { if (action.through) { continue; } else { break; } } } // 事件监听有限制父节点 var parentNode = (_action$target = action.target) === null || _action$target === void 0 ? void 0 : _action$target.call(action); if (parentNode) { // 有指定父节点,但触发目标节点不在范围内,不做处理,继续/退出 if (!parentNode.contains(e.target)) { if (action.through) { continue; } else { break; } } } var through = (_ref = (_action$action = action.action(e)) !== null && _action$action !== void 0 ? _action$action : action.through) !== null && _ref !== void 0 ? _ref : true; if (!through) { // 不传递事件,中断,并标记事件已被触发 break; } } } }; var unregisterHotkeyAction = function unregisterHotkeyAction(action) { var index = actionStack.findIndex(function (item) { return item === action; }); if (index >= 0) { actionStack.splice(index, 1); } if (actionStack.length <= 0) { window.removeEventListener('keydown', handleKeyDown); } }; var registerHotkeyAction = function registerHotkeyAction(action) { if (actionStack.length <= 0) { window.addEventListener('keydown', handleKeyDown); } actionStack.unshift(action); actionStack.sort(function (a, b) { var _b$priority, _a$priority; return ((_b$priority = b.priority) !== null && _b$priority !== void 0 ? _b$priority : 0) - ((_a$priority = a.priority) !== null && _a$priority !== void 0 ? _a$priority : 0); }); return function () { unregisterHotkeyAction(action); }; }; // 将内容挂载到 window 上,避免多个包重复,导致无法共享,重复触发等问题 var globalObj = (0, _syncGlobal.registerGlobal)('__orca-hooks-useHotkeyListener-global', { mapping: mapping, unregisterHotkeyAction: unregisterHotkeyAction, registerHotkeyAction: registerHotkeyAction }); var useHotkeyListener = function useHotkeyListener(_hotkeyName, action) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var getOptionTarget = (0, _ahooks.useMemoizedFn)(function () { var _options$target; return (_options$target = options.target) === null || _options$target === void 0 ? void 0 : _options$target.call(options); }); var memoAction = (0, _ahooks.useMemoizedFn)(action); var _useState = (0, _react.useState)(function () { return (0, _utils.isMac)(); }), _useState2 = (0, _slicedToArray2.default)(_useState, 1), isMacEnv = _useState2[0]; var _useState3 = (0, _react.useState)({ action: memoAction, hotkeyName: '', target: getOptionTarget }), _useState4 = (0, _slicedToArray2.default)(_useState3, 1), actionObject = _useState4[0]; var hotkeyName = (Array.isArray(_hotkeyName) ? _hotkeyName : [_hotkeyName, _hotkeyName])[isMacEnv ? 1 : 0]; actionObject.hotkeyName = (0, _react.useMemo)(function () { return (0, _utils.formatHotKeyStr)(hotkeyName); }, [hotkeyName]); actionObject.input = options.input; actionObject.through = options.through; actionObject.disabled = options.disabled; actionObject.priority = options.priority; (0, _react.useEffect)(function () { globalObj.registerHotkeyAction(actionObject); return function () { globalObj.unregisterHotkeyAction(actionObject); }; }, [actionObject.priority]); }; /** * 更新预设快捷键 * @param hotkeys */ useHotkeyListener.updateHotkeyDefs = function (hotkeys) { var _createHotkeyCache = (0, _utils.createHotkeyCache)(hotkeys), hotkeyMapping = _createHotkeyCache.hotkeyMapping, macHotkeyMapping = _createHotkeyCache.macHotkeyMapping; globalObj.mapping.hotkeyMapping = hotkeyMapping; globalObj.mapping.macHotkeyMapping = macHotkeyMapping; }; var _default = exports.default = useHotkeyListener;