Send key when onKeyPress event is fired from TextInput

Summary:
Changelog: [Internal]

In `onKeyPress` event, we were not returning `key` property. This diff adds `key` property to `onKeyPress` event and removes other, redundant properties from `onKeyPress` event.

The implementation has been translated from Paper.

Reviewed By: shergin

Differential Revision: D21250411

fbshipit-source-id: f1e31381667acb9dec02d0b33883df8f8f5b2a4b
This commit is contained in:
Samuel Susla 2020-04-27 11:44:14 -07:00 коммит произвёл Facebook GitHub Bot
Родитель 79d5b20ced
Коммит 027e8f9b16
3 изменённых файлов: 41 добавлений и 4 удалений

Просмотреть файл

@ -306,7 +306,10 @@ using namespace facebook::react;
{ {
if (!_backedTextInputView.textWasPasted) { if (!_backedTextInputView.textWasPasted) {
if (_eventEmitter) { if (_eventEmitter) {
std::static_pointer_cast<TextInputEventEmitter const>(_eventEmitter)->onKeyPress([self _textInputMetrics]); KeyPressMetrics keyPressMetrics;
keyPressMetrics.text = RCTStringFromNSString(text);
keyPressMetrics.eventCount = _mostRecentEventCount;
std::static_pointer_cast<TextInputEventEmitter const>(_eventEmitter)->onKeyPress(keyPressMetrics);
} }
} }

Просмотреть файл

@ -37,6 +37,29 @@ static jsi::Value textInputMetricsPayload(
return payload; return payload;
}; };
static jsi::Value keyPressMetricsPayload(
jsi::Runtime &runtime,
KeyPressMetrics const &keyPressMetrics) {
auto payload = jsi::Object(runtime);
payload.setProperty(runtime, "eventCount", keyPressMetrics.eventCount);
std::string key;
if (keyPressMetrics.text.empty()) {
key = "Backspace";
} else {
if (keyPressMetrics.text.front() == '\n') {
key = "Enter";
} else if (keyPressMetrics.text.front() == '\t') {
key = "Tab";
} else {
key = keyPressMetrics.text.front();
}
}
payload.setProperty(
runtime, "key", jsi::String::createFromUtf8(runtime, key));
return payload;
};
void TextInputEventEmitter::onFocus( void TextInputEventEmitter::onFocus(
TextInputMetrics const &textInputMetrics) const { TextInputMetrics const &textInputMetrics) const {
dispatchTextInputEvent("focus", textInputMetrics); dispatchTextInputEvent("focus", textInputMetrics);
@ -78,8 +101,13 @@ void TextInputEventEmitter::onSubmitEditing(
} }
void TextInputEventEmitter::onKeyPress( void TextInputEventEmitter::onKeyPress(
TextInputMetrics const &textInputMetrics) const { KeyPressMetrics const &keyPressMetrics) const {
dispatchTextInputEvent("keyPress", textInputMetrics); dispatchEvent(
"keyPress",
[keyPressMetrics](jsi::Runtime &runtime) {
return keyPressMetricsPayload(runtime, keyPressMetrics);
},
EventPriority::AsynchronousBatched);
} }
void TextInputEventEmitter::dispatchTextInputEvent( void TextInputEventEmitter::dispatchTextInputEvent(

Просмотреть файл

@ -25,6 +25,12 @@ class TextInputMetrics {
int eventCount; int eventCount;
}; };
class KeyPressMetrics {
public:
std::string text;
int eventCount;
};
class TextInputEventEmitter : public ViewEventEmitter { class TextInputEventEmitter : public ViewEventEmitter {
public: public:
using ViewEventEmitter::ViewEventEmitter; using ViewEventEmitter::ViewEventEmitter;
@ -37,7 +43,7 @@ class TextInputEventEmitter : public ViewEventEmitter {
void onSelectionChange(TextInputMetrics const &textInputMetrics) const; void onSelectionChange(TextInputMetrics const &textInputMetrics) const;
void onEndEditing(TextInputMetrics const &textInputMetrics) const; void onEndEditing(TextInputMetrics const &textInputMetrics) const;
void onSubmitEditing(TextInputMetrics const &textInputMetrics) const; void onSubmitEditing(TextInputMetrics const &textInputMetrics) const;
void onKeyPress(TextInputMetrics const &textInputMetrics) const; void onKeyPress(KeyPressMetrics const &textInputMetrics) const;
private: private:
void dispatchTextInputEvent( void dispatchTextInputEvent(