-
Notifications
You must be signed in to change notification settings - Fork 2.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix: portion of text shown when changing IOU value #27613
Conversation
Hey! I see that you made changes to our Form component. Make sure to update the docs in FORMS.md accordingly. Cheers! |
CLA Assistant Lite bot All contributors have signed the CLA ✍️ ✅ |
I have read the CLA Document and I hereby sign the CLA |
@ArekChr I accidentally included a merge with this PR. If that's going to cause any issues please let me know and I will resubmit. I apologize for that! |
@neg-0 I found regression during testing. Some wider numbers are truncated, e.g. 4 or 8, 9. Could you fix that? Thanks! |
@ArekChr Still investigating a good fix for this. I believe the problem is related to how different browsers and the react-native renderer handle the width of the text edit cursor. It seems to impact the apps differently. The fix from the previously mentioned PR adds the 2-pixel width to textInputWidth in order to counteract the added width of the cursor, effectively giving the cursor room to wiggle around without impacting the text position. Here's the issue on iOS Safari, note the text is cut off at the beginning and will move as you move the cursor around. iOS.Safari.Text.Bug.mp4And on macOS Safari the beginning of the text is cut off, but will fix itself if you move the cursor all the way to the left. macOS.Safari.Text.Bug.movChrome is the least noticeable but the text will move left or right depending on the cursor position. macOS.Chrome.movAnd finally, Native iOS works fine: iOS.Native.mp4I'm trying to implement a solution that can handle these differences in rendering between platforms. It's tricky because the size of the cursor is not the same across platforms. If I add more space to the Text component used for the autoGrow it will fix the text being cut off like you described, but it brings back the issue of a portion of text being displayed by the RNTextInput component until the width can be properly updated.
More to come. I apologize for the delay in getting this resolved! |
@ArekChr Ok, I got a working solution! The reason why portions of numbers are being cut off is due to the layout width of the Text component not accounting for a cursor or any potential changes in the value. It only outputs the width of the current text value. The previous change added 2 pixels to prevent cutting off numbers due to the cursor. However, it does not give enough room for an additional number in the event that the value changes. This "squeeze" is what causes the text to shift to the left upon adding a new number because the value tries to justify itself to always show the cursor (which is typically on the right side of the screen). First change: I reimplemented the change that I removed in With this change in place, the text will now overflow to the right upon change instead of shifting everything to the left. I believe this is much more appealing. Screen.Recording.2023-09-19.at.12.17.30.AM.movSimulator.Screen.Recording.-.iPhone.14.Pro.-.2023-09-19.at.00.20.24.mp4Now, this extra width shifts everything to the left because the centering style tries to center the entire component hierarchy. To counteract this, in the This results in proper centering of the currency symbol and amount. Simulator.Screen.Recording.-.iPhone.14.Pro.-.2023-09-19.at.00.30.23.mp4With the changes, I don't see any rendering issues in other parts of the app that use |
@neg-0 These extra shifts happen on the web, iOS, and Android when typing numbers. Nagranie.z.ekranu.2023-09-19.o.12.35.42.mov |
@ArekChr Yes, this is due to the nature of resizing the width of RNTextInput using the onLayout of another component. This is the issue of synchronization between the two elements that I mentioned in the initial posting. This delay was previously masked by the smaller width of the RNTextInput driven by the onLayout function of Text. However, this is what introduced the issues in #26628. React-native does not support automatic sizing of TextInput components so this additional Text component was created to render the text off-screen and get its width accordingly. There's a slight delay with this process which results in the popping you see there. I'm looking into additional refactoring of the Thank you! |
I'm currently working on a refactor for the BaseTextInput component that should resolve this issue completely. |
@ArekChr I was not able to refactor BaseTextInput in a way that fixed the synchronization issue. I propose that we only add the additional 2-pixel width to Safari browsers. This will properly account for the cursor width issue we saw before that cuts off the left side of text on Safari browsers. It will also prevent the portion of text showing when repeatedly typing the same number, fixing issue #26628 Result on MacOS Chrome (with 0 additional width):Screen.Recording.2023-09-20.at.11.16.59.PM.movResult on MacOS Safari (with 2 additional width):Screen.Recording.2023-09-20.at.11.18.54.PM.movResult on iOS Safari (with 2 additional width):Screen.Recording.2023-09-20.at.11.30.30.PM.movResult on Desktop (with 0 additional width):Screen.Recording.2023-09-20.at.11.32.38.PM.movResult on iOS Native (with 0 additional width):Screen.Recording.2023-09-20.at.11.28.14.PM.movResult on Android Native (with 0 additional width):Screen.Recording.2023-09-20.at.11.24.29.PM.mov |
Reviewer Checklist
Screenshots/VideosWebweb.movMobile Web - Chromemweb.chrome.movMobile Web - Safarimweb.safari.movDesktopdesktop.moviOSios.movAndroidandroid.mov |
@neg-0 It works for me, I think in future, we should consider refactoring, and simplifying this input by removing width and height logic in onLayout event. |
@ArekChr Thanks for the review. Agreed. It's too bad react-native doesn't support this out of the box. I tried several methods of refactoring to make this look cleaner but all had unwanted side effects. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not great to see the browser specific code but I agree this is a good UX improvement to pursue so going ahead
Lint is failing @neg-0 |
@mountiny Sorry about that. Ran Prettier and committed the code diff. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
🚀 Deployed to staging by https://github.com/mountiny in version: 1.3.74-0 🚀
|
🚀 Deployed to production by https://github.com/chiragsalian in version: 1.3.74-3 🚀
|
Details
The change made from issue #8158 added an additional width of 2 pixels to the Text component used to autoGrow the RNTextInput in BaseTextInput. The value of RNTextInput is changed prior to the Text component resizing, which shows a partial number. The proposed change is to remove the extra 2 pixels applied to the Text component that's being used to implement autoGrow in the BaseInputText component. The original intent of this padding was to fix issue #8158 but it seems that the root cause has been resolved and the extra padding is no longer necessary.
Fixed Issues
$ #26628
PROPOSAL: #26628 (comment)
Tests
Offline tests
N/A
QA Steps
PR Author Checklist
### Fixed Issues
section aboveTests
sectionOffline steps
sectionQA steps
sectiontoggleReport
and notonIconClick
)myBool && <MyComponent />
.src/languages/*
files and using the translation methodWaiting for Copy
label for a copy review on the original GH to get the correct copy.STYLE.md
) were followedAvatar
, I verified the components usingAvatar
are working as expected)/** comment above it */
this
properly so there are no scoping issues (i.e. foronClick={this.submit}
the methodthis.submit
should be bound tothis
in the constructor)this
are necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);
ifthis.submit
is never passed to a component event handler likeonClick
)StyleUtils.getBackgroundAndBorderStyle(themeColors.componentBG)
)Avatar
is modified, I verified thatAvatar
is working as expected in all cases)ScrollView
component to make it scrollable when more elements are added to the page.main
branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTest
steps.Screenshots/Videos
Web
Web.mp4
Mobile Web - Chrome
Fix.Web.mp4
Mobile Web - Safari
iOS.Mobile.Web.mp4
Desktop
Desktop.App.mov
iOS
iOS.mp4
Android
Android.webm