From 8eda19e8762cde9e0cc583d3c9ac6882eec4f226 Mon Sep 17 00:00:00 2001 From: kirillzyusko Date: Tue, 31 Mar 2026 01:43:47 +0300 Subject: [PATCH 1/5] feat: native rounded keyboard detection --- .../KeyboardControllerModule.kt | 2 ++ .../KeyboardControllerModule.kt | 2 ++ ios/KeyboardControllerModule.mm | 7 +++++++ ios/views/KeyboardExtenderContainerView.swift | 18 ++++++++++++++---- src/bindings.native.ts | 3 +++ src/bindings.ts | 2 ++ src/components/KeyboardToolbar/constants.ts | 5 ++--- src/specs/NativeKeyboardController.ts | 2 +- 8 files changed, 33 insertions(+), 8 deletions(-) diff --git a/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt b/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt index 811fdb9fd1..4f933fc0dd 100644 --- a/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt +++ b/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt @@ -11,6 +11,8 @@ class KeyboardControllerModule( override fun getName(): String = KeyboardControllerModuleImpl.NAME + override fun getConstants(): MutableMap = mutableMapOf("keyboardBorderRadius" to 0) + override fun setInputMode(mode: Double) { module.setInputMode(mode.toInt()) } diff --git a/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt b/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt index f54f59566e..100e088dad 100644 --- a/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt +++ b/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt @@ -13,6 +13,8 @@ class KeyboardControllerModule( override fun getName(): String = KeyboardControllerModuleImpl.NAME + override fun getConstants(): MutableMap = mutableMapOf("keyboardBorderRadius" to 0) + @ReactMethod fun setInputMode(mode: Int) { module.setInputMode(mode) diff --git a/ios/KeyboardControllerModule.mm b/ios/KeyboardControllerModule.mm index 41d0a81ca1..9c19b32f42 100644 --- a/ios/KeyboardControllerModule.mm +++ b/ios/KeyboardControllerModule.mm @@ -53,6 +53,13 @@ + (BOOL)requiresMainQueueSetup return NO; } +- (NSDictionary *)constantsToExport +{ + return @{ + @"keyboardBorderRadius" : @([KeyboardExtenderContainerView keyboardBorderRadius]), + }; +} + #ifdef RCT_NEW_ARCH_ENABLED - (void)setDefaultMode #else diff --git a/ios/views/KeyboardExtenderContainerView.swift b/ios/views/KeyboardExtenderContainerView.swift index 4cafd0268a..0b4f18841a 100644 --- a/ios/views/KeyboardExtenderContainerView.swift +++ b/ios/views/KeyboardExtenderContainerView.swift @@ -9,16 +9,26 @@ import UIKit @objc public class KeyboardExtenderContainerView: NSObject { - @objc public static func create(frame: CGRect, contentView: UIView) -> UIView { + private static func usesModernKeyboard() -> Bool { #if canImport(UIKit.UIGlassEffect) if #available(iOS 26.0, *) { let requiresCompat = Bundle.main.object(forInfoDictionaryKey: "UIDesignRequiresCompatibility") as? Bool ?? false - if !requiresCompat { - return ModernContainerView(frame: frame, contentView: contentView) - } + return !requiresCompat } #endif + return false + } + + @objc public static func keyboardBorderRadius() -> CGFloat { + return usesModernKeyboard() ? 30 : 0 + } + @objc public static func create(frame: CGRect, contentView: UIView) -> UIView { + if usesModernKeyboard() { + if #available(iOS 26.0, *) { + return ModernContainerView(frame: frame, contentView: contentView) + } + } return LegacyContainerView(frame: frame, contentView: contentView) } } diff --git a/src/bindings.native.ts b/src/bindings.native.ts index 8f29cc10d2..b7481dc513 100644 --- a/src/bindings.native.ts +++ b/src/bindings.native.ts @@ -36,6 +36,9 @@ export const KeyboardControllerNative = ( ) ) as KeyboardControllerNativeModule; +export const keyboardBorderRadius: number = + RCTKeyboardController?.getConstants()?.keyboardBorderRadius ?? 0; + const KEYBOARD_CONTROLLER_NAMESPACE = "KeyboardController::"; const eventEmitter = new NativeEventEmitter(KeyboardControllerNative); diff --git a/src/bindings.ts b/src/bindings.ts index 96e40ac91b..c1f50d383a 100644 --- a/src/bindings.ts +++ b/src/bindings.ts @@ -17,6 +17,8 @@ import type { EmitterSubscription } from "react-native"; const NOOP = () => {}; +export const keyboardBorderRadius: number = 0; + export const KeyboardControllerNative: KeyboardControllerNativeModule = { setDefaultMode: NOOP, setInputMode: NOOP, diff --git a/src/components/KeyboardToolbar/constants.ts b/src/components/KeyboardToolbar/constants.ts index 5ebe24b062..016be4668f 100644 --- a/src/components/KeyboardToolbar/constants.ts +++ b/src/components/KeyboardToolbar/constants.ts @@ -1,4 +1,4 @@ -import { Platform } from "react-native"; +import { keyboardBorderRadius } from "../../bindings"; import type { HEX } from "./types"; @@ -10,6 +10,5 @@ export const TEST_ID_KEYBOARD_TOOLBAR_DONE = `${TEST_ID_KEYBOARD_TOOLBAR}.done`; export const KEYBOARD_TOOLBAR_HEIGHT = 42; export const DEFAULT_OPACITY: HEX = "FF"; -export const KEYBOARD_HAS_ROUNDED_CORNERS = - Platform.OS === "ios" && parseInt(Platform.Version, 10) >= 26; +export const KEYBOARD_HAS_ROUNDED_CORNERS = keyboardBorderRadius > 0; export const OPENED_OFFSET = KEYBOARD_HAS_ROUNDED_CORNERS ? -11 : 0; diff --git a/src/specs/NativeKeyboardController.ts b/src/specs/NativeKeyboardController.ts index b0acdade2e..e3174276f4 100644 --- a/src/specs/NativeKeyboardController.ts +++ b/src/specs/NativeKeyboardController.ts @@ -3,7 +3,7 @@ import { TurboModuleRegistry } from "react-native"; import type { TurboModule } from "react-native"; export interface Spec extends TurboModule { - readonly getConstants: () => {}; + readonly getConstants: () => { keyboardBorderRadius: number }; // methods setInputMode(mode: number): void; From dfa89f5578bd98a7b0f6541848c58fc06e56e86d Mon Sep 17 00:00:00 2001 From: kirillzyusko Date: Tue, 31 Mar 2026 10:29:40 +0300 Subject: [PATCH 2/5] fix: changes after self review (actually working code) --- .../KeyboardControllerModule.kt | 4 +++- .../modules/KeyboardControllerModuleImpl.kt | 8 ++++++++ .../KeyboardControllerModule.kt | 2 +- .../ToolbarAllButtonsEnabled.png | Bin 8052 -> 6393 bytes .../ToolbarFirstInputFocused.png | Bin 12482 -> 10904 bytes .../iPhone 17 Pro/ToolbarLastInputFocused.png | Bin 8097 -> 6447 bytes ios/KeyboardControllerModule.mm | 5 +++++ src/bindings.native.ts | 3 --- src/bindings.ts | 5 +++-- src/components/KeyboardToolbar/constants.ts | 4 ++-- src/constants.ts | 4 ++++ src/specs/NativeKeyboardController.ts | 4 +++- src/types/module.ts | 4 ++++ 13 files changed, 33 insertions(+), 10 deletions(-) diff --git a/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt b/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt index 4f933fc0dd..33171c0071 100644 --- a/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt +++ b/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt @@ -11,7 +11,9 @@ class KeyboardControllerModule( override fun getName(): String = KeyboardControllerModuleImpl.NAME - override fun getConstants(): MutableMap = mutableMapOf("keyboardBorderRadius" to 0) + override fun getTypedExportedConstants(): Map { + return module.getConstants() + } override fun setInputMode(mode: Double) { module.setInputMode(mode.toInt()) diff --git a/android/src/main/java/com/reactnativekeyboardcontroller/modules/KeyboardControllerModuleImpl.kt b/android/src/main/java/com/reactnativekeyboardcontroller/modules/KeyboardControllerModuleImpl.kt index 0a5b7262e2..489b181c06 100644 --- a/android/src/main/java/com/reactnativekeyboardcontroller/modules/KeyboardControllerModuleImpl.kt +++ b/android/src/main/java/com/reactnativekeyboardcontroller/modules/KeyboardControllerModuleImpl.kt @@ -23,6 +23,7 @@ class KeyboardControllerModuleImpl( private val controller = KeyboardAnimationController() private val mDefaultMode: Int = getCurrentMode() + // region Module methods fun setInputMode(mode: Int) { setSoftInputMode(mode) } @@ -102,7 +103,9 @@ class KeyboardControllerModuleImpl( promise.resolve(map) } } + // endregion + // region Helpers private fun setSoftInputMode(mode: Int) { UiThreadUtil.runOnUiThread { if (getCurrentMode() != mode) { @@ -118,8 +121,13 @@ class KeyboardControllerModuleImpl( ?.attributes ?.softInputMode ?: WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED + // endregion + + // region Module constants + fun getConstants(): MutableMap = mutableMapOf("keyboardBorderRadius" to 0) companion object { const val NAME = "KeyboardController" } + // endregion } diff --git a/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt b/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt index 100e088dad..dcc66985b8 100644 --- a/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt +++ b/android/src/paper/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt @@ -13,7 +13,7 @@ class KeyboardControllerModule( override fun getName(): String = KeyboardControllerModuleImpl.NAME - override fun getConstants(): MutableMap = mutableMapOf("keyboardBorderRadius" to 0) + override fun getConstants(): MutableMap = module.getConstants() @ReactMethod fun setInputMode(mode: Int) { diff --git a/e2e/kit/assets/ios/iPhone 17 Pro/ToolbarAllButtonsEnabled.png b/e2e/kit/assets/ios/iPhone 17 Pro/ToolbarAllButtonsEnabled.png index 9c3c44c5e0a2173519a628fa9196b4f8abbcf765..02eb3abfff422e5f6543e530dd5545c2bf302ebf 100644 GIT binary patch literal 6393 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 ADgXcg literal 12482 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 F{{Yn}-dg|w diff --git a/e2e/kit/assets/ios/iPhone 17 Pro/ToolbarLastInputFocused.png b/e2e/kit/assets/ios/iPhone 17 Pro/ToolbarLastInputFocused.png index c1c081c3df79a46dabd17301f30b0aa053c6002f..794bb98dc845c19288ed7725cb6382a7d08eacfa 100644 GIT binary patch literal 6447 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 literal 8097 zcmZu$2|SeD_eY4bmB<<;l{J(-TS9gt2HB=;*_W})Ov6tqYj#;nGTHZ$T|{=(SjQH| zFvxD~^B?cq_KyF|=b3wFp7We@?m6Fc?>T3l>*=V`o?<&iLPA2Te)o<(2?;rnFo#f4 z5PTypY+;K8Zr`+PeEo`(*A%X-D349HQ0VG=KR; zwXA~?@&{aQb>{?tzIEXMaPkeEirm@FM@VC&FY=E0C(YBOWaLx~+=@>~{+X~y!FC-7 zYZJO1M`|m(9Y<>ix*f+4{Ag1LKd$=g8d$Jn#Mj0EKA$jtOR0l>h&yQU&8NOl69WrJ zs0e>i-8$QTKD_pd!uyY3npfzBbo$=F%d*BfD};6CW{ok=d$?O}{}l8~VpmDyjJUr= z9!7kx8eaRf*KtRsIYW!)3l-Vp2S{l^-n6wD*Me5J;NMCTo^4z?wU}PpYRRem+3_$$ z`J5q*x6ui(67t3B>Z+zy9S^^&N$H9ZrAGuEW>g>N0G_*)q1f_YFxL`0q6 z+E!+8|ADNi*ndpHt(Zv*3r;>`4P-!_GI@oTf|Xr%2t?LjBQhDcA}CkUmNJ=B&_3aM z_$UTea?9afT-#%^rekZp7R`Fwmbz0-`0jgJDawYM4w`Wx|JwbRIT*P63KVTmYdZQV zqX$KYKCL<-Ta9a!vr!7HduRR-{o}4pvNPhh62t`yor=$9rEz&FArE(7251u*m|^av zqAgvrTvw4ngN zK0wL>6}PMj5~C^0_R}q7 zL_ipS8R#c1U-WS6;^BQg4mXpy3AdO)2Kw8I#?xrX)5sgVd#H zlQzCUdZQ`slqimG0z|NUqG&@dffF~TerFi}T8x4CZlfp6Fp%14O3LmI=PSsqjAM)7 z=ZPL}W0j*ddegK6K=CVEb04$tELk$FYuTjgY=n8=zH$9UVigT^CWF$+1)55w9H3}l znrFvAY{p#{{i%(kP)ke8$q7O;aZHI^zUbu7q7(!cHyz%*x}~Z@4BJOX1YZlAoX=DTU2lwQ;dKrbC|TXz8mTyru*>8F2&R1UPeJfN9;JuT#|*edE+$|iVpSz3 zA+a^PHBxq*gD1Jzjbu^d$lg7>1C{j+RB570N@F!Q*AW+Ok zo%oa}p!%X2L``htH0pdQY+?Kmu4?4u^z?M1_dr6yF`_I27}SN-o&&ffmrL+kkh4WT z;dCJ{&l16!T!wi_RNPovUg4Q7v#Pe|XeuXB+>nwTv1K}v{iOK;vmnIg>~s& z365vHVeGevOSG!1shM3QLJ_4hXt_xr_&BRf#z&cNx#o3T7!=Tf!|Qce;$>N^zJ$S; zhvZoE1wVt(GjNp?V`CTRMtkJ4YsC&%<-yMR4JI1(h_3X;@w&YZIou+DjrW+*1;}>a zB4^b}wT?sEhBCY~-QNK|c6xu|wf<}!eh6DNgtxI2MyE6g+2GyGEj;P%dR@rHG^M43 zG@>HR<%;4Vb z_z{JV`?nep8@eDTr`l2Xwlp;gMppe9yS**Bp@tKUa-W;Fm+n(+Vrc#>#tcr14ikJuAE**Ujd?Q9rX?7k#x` zBZsx5_o(_RXz+d$I&{GfJHa|2_S=219`aqL{2B4_u!eJk+#ln6bnaFldIZr(8X)s0 zr^=K(xqdK_d=}`F2nVK7`+gI8zKDC=^TlF9hk5lidPf@t_Ki499NPB zZq%})7k|IQXZaesHbT^>HPjTJfx%d!{4y2++OT#(8vvz1&L?*Id{4J@S!%=o32-)g zf0$RMUvk~PtG)CiN~s!b^G=U<@746*8-HJ#Vi^dXrr=amw{Q45%83uXO@EWl*yAB8 z<#5!(v@*A{(K^B7K7n;xN>h6H!zVo|lCNL5W#g|Fr!`(eBzM}d>`EodNB%jNGtZN? zvE?Io-NqvI)6X#u4isXrgSva3d{N>3l}^w)M^`?Dx|%ovh*8H#MndV~fWE|-VMpcI zSVf{_wPfylxsDo-!VhI}np2p!>sPZ8E%XJWgUwu*57wb{h@F0vhRJ%Yem&>(p2;Xh zd4S9Hrgvf+`v(Li{V4_PwrV$DNJ!m-$E?49y#H=sy)X%!4TW+9bC}V1OziromTUbE zN6;39KU2PSZ_)U;lyQ4BZ*Zb_LU2^vS^-MaPra)Zz}2G_co3%>=h3v8y>G88TX11~ zcGF19b$#bN*D!P;FuN9O+Pz$Fvfr*>IO=b`r(?nS%smi2m@T+BwIPpeP4L0hPA!Bg zr>$ZS<=c{3^Ya(UT@4VoJ?5=Z%>mo4MdXyCjVvwln;oXIe>Pc4?aag`jmV`4 zBMCaX@$v_=FDL5r;&PzxRu3yy9$;m-ly)E8dV%aI4=V_Yr-7tbRo7WH2$Q|Sdy4Qh zxgG*K?kV(Jpej~visLZvf;u~BfIUT%js7xkU4mj~5V%T-&Diku3biW8Kk~&R?0D(bS>B#BQJ)3Kk@7FIhx=Qwj%J1v5ONxy_}z zf@J?4FOAPmZ^#&{_nbE$k-A$YI?HcgzQ2~PKP#EMU&&l}>&M4d=Yjg(P1E{8_$E(= z_$gp|$-B5jO9?P)v#ot_XQ;>7{i;SDZ-c`3;BFLTtxdykU}Saz_?)4ECs_=`8EoPMLV86wSw+yTQU?S6w?0^a=?**PNo^(WL zFK-=Iby~OEvAbsYIOXpd@<~5;mdCD7Hiup<>-N)oN6A@%Q`m0autLh)pUX#Xb#AUd zJd8CIb?uDuPKb%(MVsF&I`Ce%O5=oSm7)8xvTxzmBXEJuJ{rS^y*vT4Zz~epYQ?S} zcuX%%xNp964m~im<@amT=u&n{=I`rNe4FU3y_AD1pqRZhnG|MK30x8Sv(bDxGpAPU z;oN1U&t;6XfKIi2GdG$T@($HT-bdg!3|x0=y8KoX7M;cDZCa}MOI z;I(#H9X6rv%HHP>O}p_i&S^}jn{3}EQa0A5MW260E?N4j^X)7s79<2r|43D39D_Up z=hZ#M)N~oFMaG|K{)Rrpm1mINRY3h{=yKzFAVC&2EY<3kK~eW7i|>QNAmjq95?ZuO zYk`#Po1I1Yao-x8g=vG~`k*ZC<~Y7KA_8a6oNva&*ws@$qpK*%_N^P5TyLi%g?fal zZFRQW`PiGYj9=`nD8uMEfhVDaVi=ES)RQ3;-1N~$mGIJ7K)y}C`NL)WyJL8Ja)L_$JqOk>!R7ReH*`ug$El}UB^_$7*YDvP?qBeKD|my5bSwi}U?i#u2g)->fj+~2{&T~Y?>;;usU>hR#AjZ&W_6o>J7 za~d6+7+BloUUZ_lut+3{HAkD-xTE9mt%aOwgI^>PWHWfWze&;2cs)SU2obQKZ4qGE zQDkNs7#{3e!Ii~tyz`vyqSnGVYrR2;*r0shNNL=}vPhw+cj8yggZt!~h8X|J;VrPZ zTjxF2{L#V2$f)wpyfdEpt@tQNaqO3(Alq~IbP0?kO(kM=VGlIP-1S$K^_y; zJ3Bj{(+6Bkx}R8y_ttqsSDSgbRJg@nSmkd{G;ROMJHzjTIGQ^8aYmt>gXLypB}-qo zyiM`B4QDLeUH3%AimPzRThm$uX^Nk!c4+~*BZ%FKsNzFYv3u1Z8-u6uY7zZ4foFB+g2NA4-r zr(+3LX+dk*G(hxFS6G+bCb4n@7+vQ$Nf?HrYZ>8)ZrMKYv~b# z*sk?=lkSvqrSRWHqcI&7>gFYDd4q;01tcHm#aS$D(pMtJ)*tRAu~ngO5Hi?-#z^{p zv8y!^*J6zJ_ax4b&1senDhCeAC(gDBd8$%I%j^_n0r9~PP+P;SPY9}T)T%MeqNa?JU5mQq-gm1W|Ltr z=T59?z>W4nF{7mnqmKsh>SL!op`q?$t97{+1!>NwO*#T@5K0K(g_Nz=(CPR3kf!U9- z3Hob>Uo{;UZa7qP<~*IiOov7Fg3xU|#?Ma&yhF^$HXH4#0dn+gR*mME3ukAgJQ^nDFs*=9&f(Xhb(nw=i{9Mq)J&5QvDA)vgSQeUDqvu z9U6!pvyF^?%&5l$KG$ww1~{gvW0=$Bb-HwbXvv2lMvrd+u^(E|z zOZl*d-Shr*j^G+Mmn@LIHubxK?PirJp6AA4S{#V?I`y{lVC5PyaM< zI?l2IWnvXW$fp)CGT{q@(_ToNd|7RVUr5gcq%3Y)7+$%J80$nydJ2`r;jD{GMX{{3 zoOg7`dOE|_a^pThX~H^XEZ%>W$<+C-u@!hqIK_d}rC^{YL|~`xuMU`E9k~pJK-hYt zQX)!N2;DIKpt3IRv1jv30kh4RKq)ME35*=551e`z-z(7$;tlZ7O?2lBaN$$Hf2#7& z($w2Li7#ENV%u=G%%cb9zGa4U+a?H>&K*tz-wiA7RQiD zK6b2f4-~YxSNF9*`GBv;f1yi1vKxd>f~OeO$uiC<)=yz$Uv8(Jq3^aIalSb`vFNka zkYVJd{lp8a>%KDidaZ@AH*TzkD+>LMcaZ5%w3B1`L~=pA%V)RKplm-BX1Mk<^w+jB z;>qF$mLs3#nb`i2dYq>x`MsYCSgN~|keN{nZ*X_MRTQ`WLl8Y_I;PqWU%sI!O(=b7 z7v8jZxMo!smHi2mqpCbp1r!ZJtKn7Y1k7HQNWZ8$3aZjk`Z8 zeJ*MaN5eV*AI|EQMP%p^w}o0SM$>zCW8(Iw3-yIR)Wkh@USA5(*!h9e^ebylfwq2$ z0&v~nY7M}}X74xq&_yk@8p|^nRV;>uuIo6q)7V@zmgWzR_YunP(pq>D5%zma`#BN0 z4NDFYM4J-|1xsUToBv&PyY`n=|7k}wmY+&3jn2*|#PsKo_=r{M@wWwkdH!eIcrtum zw4T15;9*TEpf;nCu)Y5%G|lPC@2L7UdA2y?_F~OD(xasmWaHxU!{hdU?R>Ns^php0 z37!Tr8+owSEW*dTfy642z!-)~lCoPc_=eMSOU@+^l#zUpi~8X@#MYytxe}e+{`3a?Yiqd3wxaNsZ2$H)7M}+x#l&y@dmgNqMIM3ebI^;h4o;1x=zfmEigW$!& z#&z?Kb+0p5$&y2y<^}G|BcLpoi%x@V>W$Y14O5Z|cXT zE^!{ic=>7T){=rjGwaJsQ~%3RNpoBd6FSa`%DU2hscshn`kRp2ypI!YlKT z_2`$CQHNdSxc0w$RsVQHaf!lKl`V$GzZg_qwPhf4tm)^gHaVpPjxJd|f8c@ckX4A( zB~n8%kixe0Y$Q!U-%5vFp>L*hAl_{w{J)6Hw}EvD0&&UwV;>XeK=neO^O6SFGTxW` z*L<*DYHMJLj4OVg`CU1Li*t;5b7z+oOZ-V# zGXE)Bj|-OeC0@IN4j|(tECabi_)qS_i`-+I&K2HhlNOUSu`pHVC|D}X=6CgWX?h~J z7r&zr3zjMYd{;;Gv_2V7le>Y1!A}tpDT0t>$g+)Ss21ti-%jW$tYa7r3cwB|UWSqzt*ot+hqLT3TSgwIhCEkEfYEOk$z zI+|kfS?|XNlfiY=Gn%*DR9qouuCd< z=4#dtlO$OT$L<0EtP^<8so{!4PX)Lq4ZNHhj4``~nNceO3X42nKjhM~svetx=1>!g PbP{zHojZlMK|%iqReViw diff --git a/ios/KeyboardControllerModule.mm b/ios/KeyboardControllerModule.mm index 9c19b32f42..e8a7ac3a6b 100644 --- a/ios/KeyboardControllerModule.mm +++ b/ios/KeyboardControllerModule.mm @@ -60,6 +60,11 @@ - (NSDictionary *)constantsToExport }; } +- (NSDictionary *)getConstants +{ + return [self constantsToExport]; +} + #ifdef RCT_NEW_ARCH_ENABLED - (void)setDefaultMode #else diff --git a/src/bindings.native.ts b/src/bindings.native.ts index b7481dc513..8f29cc10d2 100644 --- a/src/bindings.native.ts +++ b/src/bindings.native.ts @@ -36,9 +36,6 @@ export const KeyboardControllerNative = ( ) ) as KeyboardControllerNativeModule; -export const keyboardBorderRadius: number = - RCTKeyboardController?.getConstants()?.keyboardBorderRadius ?? 0; - const KEYBOARD_CONTROLLER_NAMESPACE = "KeyboardController::"; const eventEmitter = new NativeEventEmitter(KeyboardControllerNative); diff --git a/src/bindings.ts b/src/bindings.ts index c1f50d383a..c968aa43a5 100644 --- a/src/bindings.ts +++ b/src/bindings.ts @@ -17,8 +17,6 @@ import type { EmitterSubscription } from "react-native"; const NOOP = () => {}; -export const keyboardBorderRadius: number = 0; - export const KeyboardControllerNative: KeyboardControllerNativeModule = { setDefaultMode: NOOP, setInputMode: NOOP, @@ -29,6 +27,9 @@ export const KeyboardControllerNative: KeyboardControllerNativeModule = { Promise.resolve({ x: 0, y: 0, width: 0, height: 0 }), addListener: NOOP, removeListeners: NOOP, + getConstants: () => ({ + keyboardBorderRadius: 0, + }), }; /** * An event emitter that provides a way to subscribe to next keyboard events: diff --git a/src/components/KeyboardToolbar/constants.ts b/src/components/KeyboardToolbar/constants.ts index 016be4668f..5ad47132d6 100644 --- a/src/components/KeyboardToolbar/constants.ts +++ b/src/components/KeyboardToolbar/constants.ts @@ -1,4 +1,4 @@ -import { keyboardBorderRadius } from "../../bindings"; +import { KEYBOARD_BORDER_RADIUS } from "../../constants"; import type { HEX } from "./types"; @@ -10,5 +10,5 @@ export const TEST_ID_KEYBOARD_TOOLBAR_DONE = `${TEST_ID_KEYBOARD_TOOLBAR}.done`; export const KEYBOARD_TOOLBAR_HEIGHT = 42; export const DEFAULT_OPACITY: HEX = "FF"; -export const KEYBOARD_HAS_ROUNDED_CORNERS = keyboardBorderRadius > 0; +export const KEYBOARD_HAS_ROUNDED_CORNERS = KEYBOARD_BORDER_RADIUS > 0; export const OPENED_OFFSET = KEYBOARD_HAS_ROUNDED_CORNERS ? -11 : 0; diff --git a/src/constants.ts b/src/constants.ts index 16904cff96..0884fe8cc7 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,3 +1,5 @@ +import { KeyboardControllerNative } from "./bindings"; + // copied from `android.view.WindowManager.LayoutParams` export enum AndroidSoftInputModes { SOFT_INPUT_ADJUST_NOTHING = 48, @@ -17,3 +19,5 @@ export enum AndroidSoftInputModes { SOFT_INPUT_STATE_UNSPECIFIED = 0, SOFT_INPUT_STATE_VISIBLE = 4, } +export const KEYBOARD_BORDER_RADIUS = + KeyboardControllerNative.getConstants().keyboardBorderRadius; diff --git a/src/specs/NativeKeyboardController.ts b/src/specs/NativeKeyboardController.ts index e3174276f4..7a2bc67cd8 100644 --- a/src/specs/NativeKeyboardController.ts +++ b/src/specs/NativeKeyboardController.ts @@ -3,7 +3,9 @@ import { TurboModuleRegistry } from "react-native"; import type { TurboModule } from "react-native"; export interface Spec extends TurboModule { - readonly getConstants: () => { keyboardBorderRadius: number }; + readonly getConstants: () => { + keyboardBorderRadius: number; + }; // methods setInputMode(mode: number): void; diff --git a/src/types/module.ts b/src/types/module.ts index 86117d6b9a..0d60d5577a 100644 --- a/src/types/module.ts +++ b/src/types/module.ts @@ -130,4 +130,8 @@ export type KeyboardControllerNativeModule = { // native event module stuff addListener: (eventName: string) => void; removeListeners: (count: number) => void; + // constants + getConstants: () => { + keyboardBorderRadius: number; + }; }; From 3207c851dccc1988ceb28265b7090a4d48f5192d Mon Sep 17 00:00:00 2001 From: kirillzyusko Date: Tue, 31 Mar 2026 10:35:17 +0300 Subject: [PATCH 3/5] fix: ktlint --- .../reactnativekeyboardcontroller/KeyboardControllerModule.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt b/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt index 33171c0071..64cda0a19c 100644 --- a/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt +++ b/android/src/fabric/java/com/reactnativekeyboardcontroller/KeyboardControllerModule.kt @@ -11,9 +11,7 @@ class KeyboardControllerModule( override fun getName(): String = KeyboardControllerModuleImpl.NAME - override fun getTypedExportedConstants(): Map { - return module.getConstants() - } + override fun getTypedExportedConstants(): Map = module.getConstants() override fun setInputMode(mode: Double) { module.setInputMode(mode.toInt()) From d3923d4839f649b9c996ac56113864ee2b21e7bd Mon Sep 17 00:00:00 2001 From: kirillzyusko Date: Tue, 31 Mar 2026 10:35:55 +0300 Subject: [PATCH 4/5] chore: run iOS on all platforms --- .github/workflows/ios-e2e-test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ios-e2e-test.yml b/.github/workflows/ios-e2e-test.yml index edcf8720f9..7ffb4292e0 100644 --- a/.github/workflows/ios-e2e-test.yml +++ b/.github/workflows/ios-e2e-test.yml @@ -114,7 +114,8 @@ jobs: run: | if [[ "${{ github.event_name }}" == "pull_request" ]]; then # Subset for PRs: Only ios 15, 26, 26e (adjust as needed) - echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT + echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 16, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "16.4", "iphone": "iPhone 14 Pro", "os": "16.4"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": 18, artifact: "16.4", "xcode": "16.4", "macos": 15, "iphone": "iPhone 16 Pro", "os": "18.5"}, {"ios": 26, artifact: "16.4", "xcode": "26.0", "macos": 15, "iphone": "iPhone 17 Pro", "os": "26.2"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT + # echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT else # Full set for main echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 16, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "16.4", "iphone": "iPhone 14 Pro", "os": "16.4"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": 18, artifact: "16.4", "xcode": "16.4", "macos": 15, "iphone": "iPhone 16 Pro", "os": "18.5"}, {"ios": 26, artifact: "16.4", "xcode": "26.0", "macos": 15, "iphone": "iPhone 17 Pro", "os": "26.2"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT From b8adc4777938ec81709c9e85e10f66cea4e8c937 Mon Sep 17 00:00:00 2001 From: kirillzyusko Date: Tue, 31 Mar 2026 10:51:21 +0300 Subject: [PATCH 5/5] chore: don't run all tests for PR --- .github/workflows/ios-e2e-test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ios-e2e-test.yml b/.github/workflows/ios-e2e-test.yml index 7ffb4292e0..edcf8720f9 100644 --- a/.github/workflows/ios-e2e-test.yml +++ b/.github/workflows/ios-e2e-test.yml @@ -114,8 +114,7 @@ jobs: run: | if [[ "${{ github.event_name }}" == "pull_request" ]]; then # Subset for PRs: Only ios 15, 26, 26e (adjust as needed) - echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 16, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "16.4", "iphone": "iPhone 14 Pro", "os": "16.4"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": 18, artifact: "16.4", "xcode": "16.4", "macos": 15, "iphone": "iPhone 16 Pro", "os": "18.5"}, {"ios": 26, artifact: "16.4", "xcode": "26.0", "macos": 15, "iphone": "iPhone 17 Pro", "os": "26.2"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT - # echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT + echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT else # Full set for main echo 'matrix={"devices": [{"ios": 15, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "15.5", "iphone": "iPhone 13 Pro", "os": "15.5"}, {"ios": 16, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "16.4", "iphone": "iPhone 14 Pro", "os": "16.4"}, {"ios": 17, artifact: "16.4", "xcode": "16.4", "macos": 15, "runtime": "17.5", "iphone": "iPhone 15 Pro", "os": "17.5"}, {"ios": 18, artifact: "16.4", "xcode": "16.4", "macos": 15, "iphone": "iPhone 16 Pro", "os": "18.5"}, {"ios": 26, artifact: "16.4", "xcode": "26.0", "macos": 15, "iphone": "iPhone 17 Pro", "os": "26.2"}, {"ios": "26e", artifact: "26.1", "xcode": "26.1", "macos": 15, "iphone": "iPhone 16e", "os": "26.1"}]}' >> $GITHUB_OUTPUT