Skip to content

Commit e78af70

Browse files
authored
fix: listen for the meta press failure on the keyup event (alibaba#1968)
* fix: listen for the `meta` press failure on the keyup event * refactor: adjust meta logic * refactor: adjust logic * test: add keyup test
1 parent bc0d8f6 commit e78af70

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

packages/hooks/src/useKeyPress/__tests__/index.test.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,15 @@ describe('useKeyPress ', () => {
7272
expect(callback.mock.calls.length).toBe(2);
7373
unmount();
7474
});
75+
76+
it('meta key should be work in keyup event', async () => {
77+
renderHook(() =>
78+
useKeyPress(['meta'], callback, {
79+
events: ['keyup'],
80+
}),
81+
);
82+
83+
fireEvent.keyUp(document, { key: 'meta', keyCode: 91, metaKey: false });
84+
expect(callback).toBeCalled();
85+
});
7586
});

packages/hooks/src/useKeyPress/index.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { isFunction, isNumber, isString } from '../utils';
33
import type { BasicTarget } from '../utils/domTarget';
44
import { getTargetElement } from '../utils/domTarget';
55
import useDeepCompareEffectWithTarget from '../utils/useDeepCompareWithTarget';
6+
import isAppleDevice from '../utils/isAppleDevice';
67

78
export type KeyPredicate = (event: KeyboardEvent) => boolean;
89
export type keyType = number | string;
@@ -122,12 +123,23 @@ const aliasKeyCodeMap = {
122123
singlequote: 222,
123124
};
124125

126+
if (isAppleDevice) {
127+
aliasKeyCodeMap['meta'] = [91, 93];
128+
} else {
129+
aliasKeyCodeMap['meta'] = [91, 92];
130+
}
131+
125132
// 修饰键
126133
const modifierKey = {
127134
ctrl: (event: KeyboardEvent) => event.ctrlKey,
128135
shift: (event: KeyboardEvent) => event.shiftKey,
129136
alt: (event: KeyboardEvent) => event.altKey,
130-
meta: (event: KeyboardEvent) => event.metaKey,
137+
meta: (event: KeyboardEvent) => {
138+
if (event.type === 'keyup') {
139+
return aliasKeyCodeMap['meta'].includes(event.keyCode);
140+
}
141+
return event.metaKey;
142+
},
131143
};
132144

133145
// 根据 event 计算激活键数量
@@ -169,7 +181,7 @@ function genFilterKey(event: KeyboardEvent, keyFilter: keyType, exactMatch: bool
169181
// 组合键
170182
const genModifier = modifierKey[key];
171183
// keyCode 别名
172-
const aliasKeyCode = aliasKeyCodeMap[key.toLowerCase()];
184+
const aliasKeyCode: number | number[] = aliasKeyCodeMap[key.toLowerCase()];
173185

174186
if ((genModifier && genModifier(event)) || (aliasKeyCode && aliasKeyCode === event.keyCode)) {
175187
genLen++;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const isAppleDevice = /(mac|iphone|ipod|ipad)/i.test(
2+
typeof navigator !== 'undefined' ? navigator?.platform : '',
3+
);
4+
5+
export default isAppleDevice;

0 commit comments

Comments
 (0)