@@ -1619,177 +1619,38 @@ - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
16191619#pragma mark - Keyboard Events
16201620
16211621#if TARGET_OS_OSX
1622- NSString * const leftArrowPressKey = @" ArrowLeft" ;
1623- NSString * const rightArrowPressKey = @" ArrowRight" ;
1624- NSString * const upArrowPressKey = @" ArrowUp" ;
1625- NSString * const downArrowPressKey = @" ArrowDown" ;
1626-
1627- - (RCTViewKeyboardEvent*)keyboardEvent:(NSEvent *)event downPress:(BOOL )downPress {
1628- // modifiers
1629- BOOL capsLockKey = NO ;
1630- BOOL shiftKey = NO ;
1631- BOOL controlKey = NO ;
1632- BOOL optionKey = NO ;
1633- BOOL commandKey = NO ;
1634- BOOL numericPadKey = NO ;
1635- BOOL helpKey = NO ;
1636- BOOL functionKey = NO ;
1637- // commonly used key short-cuts
1638- BOOL leftArrowKey = NO ;
1639- BOOL rightArrowKey = NO ;
1640- BOOL upArrowKey = NO ;
1641- BOOL downArrowKey = NO ;
1642- BOOL tabKeyPressed = NO ;
1643- BOOL escapeKeyPressed = NO ;
1644- NSString *key = event.charactersIgnoringModifiers ;
1645- if ([key length ] == 0 ) {
1646- return nil ;
1647- }
1648- unichar const code = [key characterAtIndex: 0 ];
1649-
1650- // detect arrow key presses
1651- if (code == NSLeftArrowFunctionKey) {
1652- leftArrowKey = YES ;
1653- } else if (code == NSRightArrowFunctionKey) {
1654- rightArrowKey = YES ;
1655- } else if (code == NSUpArrowFunctionKey) {
1656- upArrowKey = YES ;
1657- } else if (code == NSDownArrowFunctionKey) {
1658- downArrowKey = YES ;
1659- }
1660-
1661- // detect special key presses via the key code
1662- switch (event.keyCode ) {
1663- case 48 : // Tab
1664- tabKeyPressed = YES ;
1665- break ;
1666- case 53 : // Escape
1667- escapeKeyPressed = YES ;
1668- break ;
1669- default :
1670- break ;
1622+ - (RCTViewKeyboardEvent*)keyboardEvent:(NSEvent *)event {
1623+ BOOL keyDown = event.type == NSEventTypeKeyDown;
1624+ NSArray <NSString *> *validKeys = keyDown ? self.validKeysDown : self.validKeysUp ;
1625+ NSString *key = [RCTViewKeyboardEvent keyFromEvent: event];
1626+
1627+ // Only post events for keys we care about
1628+ if (![validKeys containsObject: key]) {
1629+ return nil ;
16711630 }
16721631
1673- // detect modifier flags
1674- if (event.modifierFlags & NSEventModifierFlagCapsLock) {
1675- capsLockKey = YES ;
1676- } else if (event.modifierFlags & NSEventModifierFlagShift) {
1677- shiftKey = YES ;
1678- } else if (event.modifierFlags & NSEventModifierFlagControl) {
1679- controlKey = YES ;
1680- } else if (event.modifierFlags & NSEventModifierFlagOption) {
1681- optionKey = YES ;
1682- } else if (event.modifierFlags & NSEventModifierFlagCommand) {
1683- commandKey = YES ;
1684- } else if (event.modifierFlags & NSEventModifierFlagNumericPad) {
1685- numericPadKey = YES ;
1686- } else if (event.modifierFlags & NSEventModifierFlagHelp) {
1687- helpKey = YES ;
1688- } else if (event.modifierFlags & NSEventModifierFlagFunction) {
1689- functionKey = YES ;
1690- }
1691-
1692- RCTViewKeyboardEvent *keyboardEvent = nil ;
1693- // only post events for keys we care about
1694- if (downPress) {
1695- NSString *keyToReturn = [self keyIsValid: key left: leftArrowKey right: rightArrowKey up: upArrowKey down: downArrowKey tabKey: tabKeyPressed escapeKey: escapeKeyPressed validKeys: [self validKeysDown ]];
1696- if (keyToReturn != nil ) {
1697- keyboardEvent = [RCTViewKeyboardEvent keyDownEventWithReactTag: self .reactTag
1698- capsLockKey: capsLockKey
1699- shiftKey: shiftKey
1700- ctrlKey: controlKey
1701- altKey: optionKey
1702- metaKey: commandKey
1703- numericPadKey: numericPadKey
1704- helpKey: helpKey
1705- functionKey: functionKey
1706- leftArrowKey: leftArrowKey
1707- rightArrowKey: rightArrowKey
1708- upArrowKey: upArrowKey
1709- downArrowKey: downArrowKey
1710- key: keyToReturn];
1711- }
1712- } else {
1713- NSString *keyToReturn = [self keyIsValid: key left: leftArrowKey right: rightArrowKey up: upArrowKey down: downArrowKey tabKey: tabKeyPressed escapeKey: escapeKeyPressed validKeys: [self validKeysUp ]];
1714- if (keyToReturn != nil ) {
1715- keyboardEvent = [RCTViewKeyboardEvent keyUpEventWithReactTag: self .reactTag
1716- capsLockKey: capsLockKey
1717- shiftKey: shiftKey
1718- ctrlKey: controlKey
1719- altKey: optionKey
1720- metaKey: commandKey
1721- numericPadKey: numericPadKey
1722- helpKey: helpKey
1723- functionKey: functionKey
1724- leftArrowKey: leftArrowKey
1725- rightArrowKey: rightArrowKey
1726- upArrowKey: upArrowKey
1727- downArrowKey: downArrowKey
1728- key: keyToReturn];
1632+ return [RCTViewKeyboardEvent keyEventFromEvent: event reactTag: self .reactTag];
1633+ }
1634+
1635+ - (BOOL )handleKeyboardEvent:(NSEvent *)event {
1636+ if (event.type == NSEventTypeKeyDown ? self.onKeyDown : self.onKeyUp ) {
1637+ RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event];
1638+ if (keyboardEvent) {
1639+ [_eventDispatcher sendEvent: keyboardEvent];
1640+ return YES ;
17291641 }
17301642 }
1731- return keyboardEvent;
1732- }
1733-
1734- // check if the user typed key matches a key we need to send an event for
1735- // translate key codes over to JS compatible keys
1736- - (NSString *)keyIsValid:(NSString *)key left:(BOOL )leftArrowPressed right:(BOOL )rightArrowPressed up:(BOOL )upArrowPressed down:(BOOL )downArrowPressed tabKey:(BOOL )tabKeyPressed escapeKey:(BOOL )escapeKeyPressed validKeys:(NSArray <NSString *>*)validKeys {
1737- NSString *keyToReturn = key;
1738-
1739- // Allow the flexibility of defining special keys in multiple ways
1740- BOOL enterKeyValidityCheck = [key isEqualToString: @" \r " ] && ([validKeys containsObject: @" Enter" ] || [validKeys containsObject: @" \r " ]);
1741- BOOL tabKeyValidityCheck = tabKeyPressed && ([validKeys containsObject: @" Tab" ]); // tab has to be checked via a key code so we can't just use the key itself here
1742- BOOL escapeKeyValidityCheck = escapeKeyPressed && ([validKeys containsObject: @" Esc" ] || [validKeys containsObject: @" Escape" ]); // escape has to be checked via a key code so we can't just use the key itself here
1743- BOOL leftArrowValidityCheck = [validKeys containsObject: leftArrowPressKey] && leftArrowPressed;
1744- BOOL rightArrowValidityCheck = [validKeys containsObject: rightArrowPressKey] && rightArrowPressed;
1745- BOOL upArrowValidityCheck = [validKeys containsObject: upArrowPressKey] && upArrowPressed;
1746- BOOL downArrowValidityCheck = [validKeys containsObject: downArrowPressKey] && downArrowPressed;
1747-
1748- if (tabKeyValidityCheck) {
1749- keyToReturn = @" Tab" ;
1750- } else if (escapeKeyValidityCheck) {
1751- keyToReturn = @" Escape" ;
1752- } else if (enterKeyValidityCheck) {
1753- keyToReturn = @" Enter" ;
1754- } else if (leftArrowValidityCheck) {
1755- keyToReturn = leftArrowPressKey;
1756- } else if (rightArrowValidityCheck) {
1757- keyToReturn = rightArrowPressKey;
1758- } else if (upArrowValidityCheck) {
1759- keyToReturn = upArrowPressKey;
1760- } else if (downArrowValidityCheck) {
1761- keyToReturn = downArrowPressKey;
1762- } else if (![validKeys containsObject: key]) {
1763- keyToReturn = nil ;
1764- }
1765-
1766- return keyToReturn;
1643+ return NO ;
17671644}
17681645
17691646- (void )keyDown:(NSEvent *)event {
1770- if (self.onKeyDown == nil ) {
1771- [super keyDown: event];
1772- return ;
1773- }
1774-
1775- RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event downPress: YES ];
1776- if (keyboardEvent != nil ) {
1777- [_eventDispatcher sendEvent: keyboardEvent];
1778- } else {
1647+ if (![self handleKeyboardEvent: event]) {
17791648 [super keyDown: event];
17801649 }
17811650}
17821651
17831652- (void )keyUp:(NSEvent *)event {
1784- if (self.onKeyUp == nil ) {
1785- [super keyUp: event];
1786- return ;
1787- }
1788-
1789- RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event downPress: NO ];
1790- if (keyboardEvent != nil ) {
1791- [_eventDispatcher sendEvent: keyboardEvent];
1792- } else {
1653+ if (![self handleKeyboardEvent: event]) {
17931654 [super keyUp: event];
17941655 }
17951656}
0 commit comments