Skip to content
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

[Mobile] Remove Keyboard Aware Flatlist #48791

Merged
merged 55 commits into from
Apr 10, 2023

Conversation

geriux
Copy link
Member

@geriux geriux commented Mar 6, 2023

Fixes #40029
Fixes wordpress-mobile/gutenberg-mobile#4894

Related PRs:

What?

This PR fixes a high-priority bug on iOS where the scroll would jump to the top and then scroll back to the currently focused text input.

Why?

Because it affects the basic writing flow, and after several attempts to try to workaround that library I went to a different route by implementing it within the project and stop using our fork for react-native-keyboard-aware-scroll-view.

How?

BlockList

  • It removes the OnCaretVerticalPositionChange context and provider since it won't be used anymore.
  • Simplifies the number of properties set for the KeyboardAwareFlatList component.
  • Fixes the logic for isFloatingToolbarVisible since it was not returning the correct value.

RichText (Block-editor)

  • Removes useNativeProps since it won't be used anymore.

KeyboardAwareFlatList

This component got a full refactor, it will leverage on the InputState from RCTAztecView for different cases by using new hooks:

  • useKeyboardOffset: Hook that adds Keyboard listeners to get the offset space when the keyboard is opened, taking into account focused AztecViews.
  • useScrollToTextInput: Hook that provides the scrollToTextInputOffset function to scroll to the currently focused TextInput depending on where the caret is placed.
  • useTextInputCaretPosition: Hook that listens to caret changes from AztecView TextInputs.
  • useTextInputOffset: Hook that calculates the currently focused TextInput's current caret Y coordinate position within the ScrollView.

VisualEditor

  • Removes the isAutoScrollEnabled state value which is no longer needed.

AztecInputState

  • It introduces new logic to store the current caret's Y coordinate, as well as a new listener to trigger a notification when this value changes.

AztecView

  • Removes usage of onCaretVerticalPositionChange and now it will only set the value in AztecInputState.

E2E Tests

  • Improves the getTitleElement helper and the block insertion canary test.

Testing Instructions

Test case 1

  • Open the app using the builds linked to this PR.
  • Create a new post
  • Add a Paragraph block
  • Tap on the return key of the keyboard
  • Repeat the same step until you reach the end of the editor
  • Keep adding paragraph blocks and expect the scroll to not scroll up to the title

Test case 2

  • Open the app using the builds linked to this PR.
  • Open a post that has at least 12 paragraph blocks
  • Tap on the very last one and expect the scroll to move and focus on the caret's position
  • Add more text and expect the scroll to keep the focus on the caret's position if it's right at the bottom of the editor.

Testing Instructions for Keyboard

N/A

Screenshots or screencast

## Test case 1

Before After
TestCase1Before.mov
TestCase1After.mov

## Test case 2

Before After
TestCase2Before.mov
TestCase2After.mov

Gerardo added 5 commits March 6, 2023 16:06
- Remove usage of onCaretVerticalPositionChange
- Add support for adding a listener when the caret Y coordinate position changes
…AutoScrollEnabled in the state of the component
- Removes usage of the react-native-keyboard-aware-scroll-view library
- Adds custom implementation to scroll to the focused TextInput element
@geriux geriux added [Status] In Progress Tracking issues with work in progress Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change) labels Mar 6, 2023
@github-actions
Copy link

github-actions bot commented Mar 6, 2023

Size Change: 0 B

Total Size: 1.37 MB

ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/index.min.js 7.2 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/index.min.js 203 kB
build/block-editor/style-rtl.css 14.6 kB
build/block-editor/style.css 14.6 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 649 B
build/block-library/blocks/cover/editor.css 651 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 kB
build/block-library/blocks/details-summary/editor-rtl.css 65 B
build/block-library/blocks/details-summary/editor.css 65 B
build/block-library/blocks/details-summary/style-rtl.css 61 B
build/block-library/blocks/details-summary/style.css 61 B
build/block-library/blocks/details/style-rtl.css 54 B
build/block-library/blocks/details/style.css 54 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 716 B
build/block-library/blocks/navigation-link/editor.css 715 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 322 B
build/block-library/blocks/post-featured-image/style.css 322 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 281 B
build/block-library/blocks/post-template/style.css 281 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 463 B
build/block-library/blocks/query/editor.css 463 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 408 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 489 B
build/block-library/blocks/site-logo/editor.css 489 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 359 B
build/block-library/blocks/spacer/editor.css 359 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.12 kB
build/block-library/common.css 1.12 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.7 kB
build/block-library/editor.css 11.7 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 204 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.8 kB
build/block-library/style.css 12.8 kB
build/block-library/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 51.1 kB
build/commands/index.min.js 14.7 kB
build/commands/style-rtl.css 1.1 kB
build/commands/style.css 1.09 kB
build/components/index.min.js 208 kB
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.4 kB
build/core-data/index.min.js 16.3 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.68 kB
build/date/index.min.js 40.4 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.72 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 34.9 kB
build/edit-post/style-rtl.css 7.59 kB
build/edit-post/style.css 7.58 kB
build/edit-site/index.min.js 64.3 kB
build/edit-site/style-rtl.css 10.1 kB
build/edit-site/style.css 10.1 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.56 kB
build/edit-widgets/style.css 4.56 kB
build/editor/index.min.js 45.9 kB
build/editor/style-rtl.css 3.49 kB
build/editor/style.css 3.48 kB
build/element/index.min.js 4.95 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.26 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.94 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 942 B
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.55 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.74 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.3 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@github-actions
Copy link

github-actions bot commented Mar 6, 2023

Flaky tests detected in a080674.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/4656911993
📝 Reported issues:

@geriux geriux removed the [Status] In Progress Tracking issues with work in progress label Mar 10, 2023
@geriux geriux marked this pull request as ready for review March 10, 2023 16:21
Copy link
Member

@dcalhoun dcalhoun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for working on this! The experience seems to be a solid improvement. 👏🏻

This is unfamiliar, complex code to me, so it will likely take me a bit to review and comprehend the logic. I plan to review again next week, but wanted to provide initial findings and questions in the meantime. Of course, if others are more familiar with this code, don't feel a need to await my specific review.

I noticed that with these changes, the calculations for larger text blocks — e.g. Heading blocks — feels a bit off. The Heading block text is partially obscured. I didn't test other blocks with larger text.

RPReplay_Final1678482187.MP4

Copy link
Contributor

@fluiddot fluiddot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've tested using long paragraphs and noticed that the scroll sometimes doesn't go to the proper position, specifically I found the following issues:

1 - Moving the caret to the first line of a block moves the scroll to the wrong position

As you can see in the video, when I move the caret to the first line (i.e. caretY = 0) the scroll moves to a different position than where the caret is.

Kapture.2023-03-14.at.11.38.19.mp4

2- Moving the caret up doesn't move the scroll

Moving the caret down moves the scroll to keep the caret visible on the screen. However, moving the caret up doesn't have this behavior.

Kapture.2023-03-14.at.11.44.18.mp4

Comment on lines 144 to 146
if ( scrollEnabled ) {
RCTAztecView.InputState.addCaretChangeListener( onCaretChange );
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If scrollEnabled is set to false, the caret change listener won't be removed upon component unmount. Hence, we could consider removing it in this case:

Suggested change
if ( scrollEnabled ) {
RCTAztecView.InputState.addCaretChangeListener( onCaretChange );
}
if ( scrollEnabled ) {
RCTAztecView.InputState.addCaretChangeListener( onCaretChange );
} else {
RCTAztecView.InputState.removeCaretChangeListener( onCaretChange );
}

const onCaretChange = useCallback(
( { caretY } ) => {
const isFocused =
!! RCTAztecView.InputState.getCurrentFocusedElement();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we could check the focus status by calling the isFocused function instead, WDYT?

Suggested change
!! RCTAztecView.InputState.getCurrentFocusedElement();
!! RCTAztecView.InputState.isFocused();

@geriux
Copy link
Member Author

geriux commented Mar 16, 2023

@dcalhoun @fluiddot thank you so much for the feedback! I will start pushing changes and once I'm done I'll make another review request for another round of reviews.

@geriux geriux removed the request for review from ellatrix March 16, 2023 13:36
@geriux
Copy link
Member Author

geriux commented Apr 4, 2023

Hey @fluiddot thank you again for testing and I'm sorry I missed the most important issue which is what this PR is supposed to be fixing 😅

I've introduced a few changes to solve the issues you reported:

  • Avoid notifying caret change listeners if there's no caret data (avoid triggering them with null values) 4374115
  • Remove the usage of isKeyboardVisible and rely on the offset value instead to avoid syncing issues bf36349
  • Following the above, it removes its usage in the KeyboardAwareFlatlist component fdda82f
  • Bring back the shouldPreventAutomaticScroll prop to avoid scrolling in cases when the inserter is open and closed 8c31c52
  • Add a setTimeout when resetting the keyboard offset to prevent resetting it when changing between text blocks 85bd85a
  • Remove unneeded dash characters c37687b and 3ff3fd4
  • Improve resetting the setTimeout using the keyboardWillShow callback 0572495

Test cases

Moving the caret to the first line of a block moves the scroll to the wrong position
TestIssue1.mp4
Moving the caret up doesn't move the scroll
TestIssue2.mp4
Splitting a long paragraph doesn't scroll to the correct position
TestIssue3.mp4
Selecting text after opening/closing the keyboard doesn't scroll to the correct position
TestIssue4.mov
Editor jumps when inserting a new block
TestIssue5.mp4
Adding a text block should scroll and auto-focus
TestIssue6.mp4
Opening the inserter with a text block focused and closing the inserter shouldn't reset the scroll
TestIssue7.mp4
Landscape 1
TestIssue8.mp4
Landscape 2
TestIssue9.mp4
iPad 1 (Hardware Keyboard)
TestIssueiPad1.mp4
iPad 2 (Hardware and external Keyboard)
TestIssueiPad2.mp4

Hopefully, all issues are now solved, let me know! Thanks again!

Copy link
Contributor

@fluiddot fluiddot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 🎊 ! Awesome job @geriux 🏅 !

I tested again with the last changes and confirm that they are addressed 🎊 :

Apart from the tests, I added some comments but none should block the PR. From my side the PR is ready ✅ 🥳 .

UPDATE: As a side note, it would be great to update the CHANGELOG to include this change as it's a user-facing change.

clearTimeout( timeoutRef.current );
timeoutRef.current = setTimeout( () => {
setKeyboardOffset( 0 );
}, 200 );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand that 200ms would be enough to wait for a change in the focus, but I'm wondering if it will cover the case of slow/old devices. In the future, it would be great to investigate if we can prevent the keyboard to open/close when the focus changes.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Definitely, I think that would be a great improvement for the mobile editor!

Copy link
Member

@dcalhoun dcalhoun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stopping by to say "thank you" to both of you for carrying this forward so well while I was unable to dedicate time for reviewing. The refactor to separate logic into individual Hooks improves comprehensibility immensely. I think this PR is a big improvement. Thank you for completing that. 🙇🏻

I left a couple of comments, but none are blockers.

@geriux
Copy link
Member Author

geriux commented Apr 10, 2023

Thank you all for your valuable feedback and time for the reviews and testing! I can't wait to ship this 🚢

I'll start merging the PRs 🎉 🚀

@geriux geriux force-pushed the rnmobile/remove-keyboard-aware-flatlist branch from 00e9a18 to a519085 Compare April 10, 2023 10:33
@geriux geriux merged commit 4454e82 into trunk Apr 10, 2023
@geriux geriux deleted the rnmobile/remove-keyboard-aware-flatlist branch April 10, 2023 12:01
@github-actions github-actions bot added this to the Gutenberg 15.6 milestone Apr 10, 2023
mokagio added a commit to wordpress-mobile/gutenberg-mobile that referenced this pull request Apr 11, 2023
See Gutenberg commit 4454e829372874130c29b62ba9f04e03ea180480, WordPress/gutenberg#48791
mokagio added a commit to wordpress-mobile/gutenberg-mobile that referenced this pull request Apr 12, 2023
See Gutenberg commit 4454e829372874130c29b62ba9f04e03ea180480, WordPress/gutenberg#48791
@hypest
Copy link
Contributor

hypest commented Apr 18, 2023

Congrats on the fix here @geriux and the review work @fluiddot ! 🎉

Also, can I always be super happy to see phrases like this? stop using our fork for... 😍

@geriux
Copy link
Member Author

geriux commented Apr 18, 2023

Congrats on the fix here @geriux and the review work @fluiddot ! 🎉

Thank you! 🚀

Also, can I always be super happy to see phrases like this? stop using our fork for... 😍

Same! 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Mobile App - i.e. Android or iOS Native mobile impl of the block editor. (Note: used in scripts, ping mobile folks to change)
Projects
None yet
4 participants