@@ -1573,177 +1573,38 @@ - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
15731573#pragma mark - Keyboard Events
15741574
15751575#if TARGET_OS_OSX
1576- NSString * const leftArrowPressKey = @" ArrowLeft" ;
1577- NSString * const rightArrowPressKey = @" ArrowRight" ;
1578- NSString * const upArrowPressKey = @" ArrowUp" ;
1579- NSString * const downArrowPressKey = @" ArrowDown" ;
1580-
1581- - (RCTViewKeyboardEvent*)keyboardEvent:(NSEvent *)event downPress:(BOOL )downPress {
1582- // modifiers
1583- BOOL capsLockKey = NO ;
1584- BOOL shiftKey = NO ;
1585- BOOL controlKey = NO ;
1586- BOOL optionKey = NO ;
1587- BOOL commandKey = NO ;
1588- BOOL numericPadKey = NO ;
1589- BOOL helpKey = NO ;
1590- BOOL functionKey = NO ;
1591- // commonly used key short-cuts
1592- BOOL leftArrowKey = NO ;
1593- BOOL rightArrowKey = NO ;
1594- BOOL upArrowKey = NO ;
1595- BOOL downArrowKey = NO ;
1596- BOOL tabKeyPressed = NO ;
1597- BOOL escapeKeyPressed = NO ;
1598- NSString *key = event.charactersIgnoringModifiers ;
1599- if ([key length ] == 0 ) {
1600- return nil ;
1601- }
1602- unichar const code = [key characterAtIndex: 0 ];
1603-
1604- // detect arrow key presses
1605- if (code == NSLeftArrowFunctionKey) {
1606- leftArrowKey = YES ;
1607- } else if (code == NSRightArrowFunctionKey) {
1608- rightArrowKey = YES ;
1609- } else if (code == NSUpArrowFunctionKey) {
1610- upArrowKey = YES ;
1611- } else if (code == NSDownArrowFunctionKey) {
1612- downArrowKey = YES ;
1613- }
1614-
1615- // detect special key presses via the key code
1616- switch (event.keyCode ) {
1617- case 48 : // Tab
1618- tabKeyPressed = YES ;
1619- break ;
1620- case 53 : // Escape
1621- escapeKeyPressed = YES ;
1622- break ;
1623- default :
1624- break ;
1576+ - (RCTViewKeyboardEvent*)keyboardEvent:(NSEvent *)event {
1577+ BOOL keyDown = event.type == NSEventTypeKeyDown;
1578+ NSArray <NSString *> *validKeys = keyDown ? self.validKeysDown : self.validKeysUp ;
1579+ NSString *key = [RCTViewKeyboardEvent keyFromEvent: event];
1580+
1581+ // Only post events for keys we care about
1582+ if (![validKeys containsObject: key]) {
1583+ return nil ;
16251584 }
16261585
1627- // detect modifier flags
1628- if (event.modifierFlags & NSEventModifierFlagCapsLock) {
1629- capsLockKey = YES ;
1630- } else if (event.modifierFlags & NSEventModifierFlagShift) {
1631- shiftKey = YES ;
1632- } else if (event.modifierFlags & NSEventModifierFlagControl) {
1633- controlKey = YES ;
1634- } else if (event.modifierFlags & NSEventModifierFlagOption) {
1635- optionKey = YES ;
1636- } else if (event.modifierFlags & NSEventModifierFlagCommand) {
1637- commandKey = YES ;
1638- } else if (event.modifierFlags & NSEventModifierFlagNumericPad) {
1639- numericPadKey = YES ;
1640- } else if (event.modifierFlags & NSEventModifierFlagHelp) {
1641- helpKey = YES ;
1642- } else if (event.modifierFlags & NSEventModifierFlagFunction) {
1643- functionKey = YES ;
1644- }
1645-
1646- RCTViewKeyboardEvent *keyboardEvent = nil ;
1647- // only post events for keys we care about
1648- if (downPress) {
1649- NSString *keyToReturn = [self keyIsValid: key left: leftArrowKey right: rightArrowKey up: upArrowKey down: downArrowKey tabKey: tabKeyPressed escapeKey: escapeKeyPressed validKeys: [self validKeysDown ]];
1650- if (keyToReturn != nil ) {
1651- keyboardEvent = [RCTViewKeyboardEvent keyDownEventWithReactTag: self .reactTag
1652- capsLockKey: capsLockKey
1653- shiftKey: shiftKey
1654- ctrlKey: controlKey
1655- altKey: optionKey
1656- metaKey: commandKey
1657- numericPadKey: numericPadKey
1658- helpKey: helpKey
1659- functionKey: functionKey
1660- leftArrowKey: leftArrowKey
1661- rightArrowKey: rightArrowKey
1662- upArrowKey: upArrowKey
1663- downArrowKey: downArrowKey
1664- key: keyToReturn];
1665- }
1666- } else {
1667- NSString *keyToReturn = [self keyIsValid: key left: leftArrowKey right: rightArrowKey up: upArrowKey down: downArrowKey tabKey: tabKeyPressed escapeKey: escapeKeyPressed validKeys: [self validKeysUp ]];
1668- if (keyToReturn != nil ) {
1669- keyboardEvent = [RCTViewKeyboardEvent keyUpEventWithReactTag: self .reactTag
1670- capsLockKey: capsLockKey
1671- shiftKey: shiftKey
1672- ctrlKey: controlKey
1673- altKey: optionKey
1674- metaKey: commandKey
1675- numericPadKey: numericPadKey
1676- helpKey: helpKey
1677- functionKey: functionKey
1678- leftArrowKey: leftArrowKey
1679- rightArrowKey: rightArrowKey
1680- upArrowKey: upArrowKey
1681- downArrowKey: downArrowKey
1682- key: keyToReturn];
1586+ return [RCTViewKeyboardEvent keyEventFromEvent: event reactTag: self .reactTag];
1587+ }
1588+
1589+ - (BOOL )handleKeyboardEvent:(NSEvent *)event {
1590+ if (event.type == NSEventTypeKeyDown ? self.onKeyDown : self.onKeyUp ) {
1591+ RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event];
1592+ if (keyboardEvent) {
1593+ [_eventDispatcher sendEvent: keyboardEvent];
1594+ return YES ;
16831595 }
16841596 }
1685- return keyboardEvent;
1686- }
1687-
1688- // check if the user typed key matches a key we need to send an event for
1689- // translate key codes over to JS compatible keys
1690- - (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 {
1691- NSString *keyToReturn = key;
1692-
1693- // Allow the flexibility of defining special keys in multiple ways
1694- BOOL enterKeyValidityCheck = [key isEqualToString: @" \r " ] && ([validKeys containsObject: @" Enter" ] || [validKeys containsObject: @" \r " ]);
1695- 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
1696- 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
1697- BOOL leftArrowValidityCheck = [validKeys containsObject: leftArrowPressKey] && leftArrowPressed;
1698- BOOL rightArrowValidityCheck = [validKeys containsObject: rightArrowPressKey] && rightArrowPressed;
1699- BOOL upArrowValidityCheck = [validKeys containsObject: upArrowPressKey] && upArrowPressed;
1700- BOOL downArrowValidityCheck = [validKeys containsObject: downArrowPressKey] && downArrowPressed;
1701-
1702- if (tabKeyValidityCheck) {
1703- keyToReturn = @" Tab" ;
1704- } else if (escapeKeyValidityCheck) {
1705- keyToReturn = @" Escape" ;
1706- } else if (enterKeyValidityCheck) {
1707- keyToReturn = @" Enter" ;
1708- } else if (leftArrowValidityCheck) {
1709- keyToReturn = leftArrowPressKey;
1710- } else if (rightArrowValidityCheck) {
1711- keyToReturn = rightArrowPressKey;
1712- } else if (upArrowValidityCheck) {
1713- keyToReturn = upArrowPressKey;
1714- } else if (downArrowValidityCheck) {
1715- keyToReturn = downArrowPressKey;
1716- } else if (![validKeys containsObject: key]) {
1717- keyToReturn = nil ;
1718- }
1719-
1720- return keyToReturn;
1597+ return NO ;
17211598}
17221599
17231600- (void )keyDown:(NSEvent *)event {
1724- if (self.onKeyDown == nil ) {
1725- [super keyDown: event];
1726- return ;
1727- }
1728-
1729- RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event downPress: YES ];
1730- if (keyboardEvent != nil ) {
1731- [_eventDispatcher sendEvent: keyboardEvent];
1732- } else {
1601+ if (![self handleKeyboardEvent: event]) {
17331602 [super keyDown: event];
17341603 }
17351604}
17361605
17371606- (void )keyUp:(NSEvent *)event {
1738- if (self.onKeyUp == nil ) {
1739- [super keyUp: event];
1740- return ;
1741- }
1742-
1743- RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event downPress: NO ];
1744- if (keyboardEvent != nil ) {
1745- [_eventDispatcher sendEvent: keyboardEvent];
1746- } else {
1607+ if (![self handleKeyboardEvent: event]) {
17471608 [super keyUp: event];
17481609 }
17491610}
0 commit comments