Skip to content

Commit 8fb9be2

Browse files
author
Nitin Chaudhary
committed
Add keyboardType prop support to Fabric TextInput for parity with Paper
1 parent 5837f91 commit 8fb9be2

File tree

2 files changed

+60
-8
lines changed

2 files changed

+60
-8
lines changed

vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.cpp

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,6 +1186,11 @@ void WindowsTextInputComponentView::updateProps(
11861186
updateAutoCorrect(newTextInputProps.autoCorrect);
11871187
}
11881188

1189+
if (oldTextInputProps.keyboardType != newTextInputProps.keyboardType ||
1190+
oldTextInputProps.secureTextEntry != newTextInputProps.secureTextEntry) {
1191+
updateKeyboardType(newTextInputProps.keyboardType);
1192+
}
1193+
11891194
if (oldTextInputProps.selectionColor != newTextInputProps.selectionColor) {
11901195
m_needsRedraw = true;
11911196
}
@@ -1432,6 +1437,10 @@ void WindowsTextInputComponentView::onMounted() noexcept {
14321437
m_propBitsMask |= TXTBIT_CHARFORMATCHANGE;
14331438
m_propBits |= TXTBIT_CHARFORMATCHANGE;
14341439
}
1440+
1441+
// Initialize keyboardType
1442+
updateKeyboardType(windowsTextInputProps().keyboardType);
1443+
14351444
InternalFinalize();
14361445

14371446
// Handle autoFocus property - focus the component when mounted if autoFocus is true
@@ -1547,25 +1556,59 @@ void WindowsTextInputComponentView::UpdateParaFormat() noexcept {
15471556
m_pf.dwMask = PFM_ALL;
15481557

15491558
auto &textAlign = windowsTextInputProps().textAlign;
1559+
auto &baseWritingDirection = windowsTextInputProps().textAttributes.baseWritingDirection;
1560+
1561+
// Handle writingDirection (baseWritingDirection)
1562+
// For WritingDirection::Natural, use the computed layout direction from the layout tree
1563+
// since direction can be overridden at any point in the tree
1564+
bool isRTL = false;
1565+
if (baseWritingDirection.has_value()) {
1566+
if (*baseWritingDirection == facebook::react::WritingDirection::RightToLeft) {
1567+
isRTL = true;
1568+
m_pf.dwMask |= PFM_RTLPARA;
1569+
m_pf.wEffects |= PFE_RTLPARA;
1570+
} else if (*baseWritingDirection == facebook::react::WritingDirection::LeftToRight) {
1571+
isRTL = false;
1572+
// Ensure RTL flag is not set
1573+
m_pf.wEffects &= ~PFE_RTLPARA;
1574+
} else if (*baseWritingDirection == facebook::react::WritingDirection::Natural) {
1575+
// Natural uses the layout direction computed from the tree
1576+
isRTL = (layoutMetrics().layoutDirection == facebook::react::LayoutDirection::RightToLeft);
1577+
if (isRTL) {
1578+
m_pf.dwMask |= PFM_RTLPARA;
1579+
m_pf.wEffects |= PFE_RTLPARA;
1580+
} else {
1581+
m_pf.wEffects &= ~PFE_RTLPARA;
1582+
}
1583+
}
1584+
} else {
1585+
// No explicit writing direction set - use layout direction from tree
1586+
isRTL = (layoutMetrics().layoutDirection == facebook::react::LayoutDirection::RightToLeft);
1587+
if (isRTL) {
1588+
m_pf.dwMask |= PFM_RTLPARA;
1589+
m_pf.wEffects |= PFE_RTLPARA;
1590+
} else {
1591+
m_pf.wEffects &= ~PFE_RTLPARA;
1592+
}
1593+
}
15501594

1595+
// Handle textAlign
15511596
if (textAlign == facebook::react::TextAlignment::Center) {
15521597
m_pf.wAlignment = PFA_CENTER;
15531598
} else if (textAlign == facebook::react::TextAlignment::Right) {
15541599
m_pf.wAlignment = PFA_RIGHT;
1600+
} else if (textAlign == facebook::react::TextAlignment::Justified) {
1601+
m_pf.wAlignment = PFA_JUSTIFY;
1602+
} else if (textAlign == facebook::react::TextAlignment::Natural) {
1603+
// Natural alignment respects writing direction
1604+
m_pf.wAlignment = isRTL ? PFA_RIGHT : PFA_LEFT;
15551605
} else {
1606+
// Default to left alignment
15561607
m_pf.wAlignment = PFA_LEFT;
15571608
}
15581609

15591610
m_pf.cTabCount = 1;
15601611
m_pf.rgxTabs[0] = lDefaultTab;
1561-
1562-
/*
1563-
if (m_spcontroller->IsCurrentReadingOrderRTL())
1564-
{
1565-
m_pf.dwMask |= PFM_RTLPARA;
1566-
m_pf.wEffects |= PFE_RTLPARA;
1567-
}
1568-
*/
15691612
}
15701613

15711614
void WindowsTextInputComponentView::OnRenderingDeviceLost() noexcept {
@@ -1826,4 +1869,11 @@ void WindowsTextInputComponentView::updateSpellCheck(bool enable) noexcept {
18261869
winrt::check_hresult(
18271870
m_textServices->TxSendMessage(EM_SETLANGOPTIONS, IMF_SPELLCHECKING, enable ? newLangOptions : 0, &lresult));
18281871
}
1872+
1873+
void WindowsTextInputComponentView::updateKeyboardType(const std::string &keyboardType) noexcept {
1874+
// Store the keyboard type for future use
1875+
// Note: Fabric's windowless RichEdit doesn't have direct InputScope support like Paper's XAML controls.
1876+
// The keyboard type is stored but the actual keyboard behavior is handled by the system's IME.
1877+
m_keyboardType = keyboardType;
1878+
}
18291879
} // namespace winrt::Microsoft::ReactNative::Composition::implementation

vnext/Microsoft.ReactNative/Fabric/Composition/TextInput/WindowsTextInputComponentView.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ struct WindowsTextInputComponentView
118118
void updateLetterSpacing(float letterSpacing) noexcept;
119119
void updateAutoCorrect(bool value) noexcept;
120120
void updateSpellCheck(bool value) noexcept;
121+
void updateKeyboardType(const std::string &keyboardType) noexcept;
121122

122123
winrt::Windows::UI::Composition::CompositionSurfaceBrush m_brush{nullptr};
123124
winrt::Microsoft::ReactNative::Composition::Experimental::ICaretVisual m_caretVisual{nullptr};
@@ -147,6 +148,7 @@ struct WindowsTextInputComponentView
147148
HCURSOR m_hcursor{nullptr};
148149
std::chrono::steady_clock::time_point m_lastClickTime{};
149150
std::vector<facebook::react::CompWindowsTextInputSubmitKeyEventsStruct> m_submitKeyEvents;
151+
std::string m_keyboardType{};
150152
};
151153

152154
} // namespace winrt::Microsoft::ReactNative::Composition::implementation

0 commit comments

Comments
 (0)