-
Notifications
You must be signed in to change notification settings - Fork 24.5k
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 new arch refresh control not shown when refreshing on mount #49240
base: main
Are you sure you want to change the base?
Conversation
Hi @High5Apps! Thank you for your pull request and welcome to our community. Action RequiredIn order to merge any pull request (code, docs, etc.), we require contributors to sign our Contributor License Agreement, and we don't seem to have one on file for you. ProcessIn order for us to review and merge your suggested changes, please sign at https://code.facebook.com/cla. If you are contributing on behalf of someone else (eg your employer), the individual CLA may not be sufficient and your employer may need to sign the corporate CLA. Once the CLA is signed, our tooling will perform checks and validations. Afterwards, the pull request will be tagged with If you have received this in error or have any questions, please contact us at [email protected]. Thanks! |
Thank you for signing our Contributor License Agreement. We can now accept your code for this (and any) Meta Open Source project. Thanks! |
Fixes #35779 for new architecture |
- Perform changes recommended by the Upgrade Helper - Didn't update gradle-wrapper.jar since it is a binary file - Didn't manually remove all of the RnDiffAppTests/OrganizeTests references. I only kept the ones that were created by removing OrganizeTests.m and OrganizeTests Info.plist - Converted AppDelegate.mm to AppDelegate.swift - https://github.com/guardianproject/orbot-apple/blob/57dae6f/Orbot/AppDelegate.swift#L29 - https://github.com/haqq-network/haqq-wallet/blob/c6687e3/ios/AppDelegate.swift#L67-L73 - https://react-native-community.github.io/upgrade-helper/?from=0.75.3&to=0.77.0&package=app.getorganize.organize&name=Organize - Update local dev machine node from v23.3.0 to v23.6.1 and npm from 10.9.0 to 10.9.2 to fix a warning that happened when running `npm run` commands - npm/cli#7857 (comment) - Use align-deps to update and align dependencies - Fix "2 vulnerabilities (1 moderate, 1 high)" with `npm audit fix` - Update react-native-vision-camera from 4.5.3 to 4.6.3 to fix a build error - mrousavy/react-native-vision-camera#3263 - Fixed another react-native-vision-camera Android build error - Opened PR: mrousavy/react-native-vision-camera#3394 - Added devDependency on [email protected] to bring this fix in locally until the PR is merged - https://github.com/ds300/patch-package - Upgraded react-native-modal-datetime-picker from 17.1.0 to 18.0.0 to fix a default props warning - mmazzarolo/react-native-modal-datetime-picker#755 - https://github.com/mmazzarolo/react-native-modal-datetime-picker/releases/tag/v18.0.0 - Fix Android shadows looked bad by migrating from elevation to boxShadow, which was newly added in 77 - https://reactnative.dev/docs/view-style-props#boxshadow - https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow - Update react-native-pager-view from 6.4.1 to 6.7.0 to fix an android crash when navigating to FlaggedContent, then hitting the back button - callstack/react-native-pager-view#944 - https://github.com/callstack/react-native-pager-view/releases/tag/v6.6.1 - Fix CountdownClockBorder flicker on touch down by migrating from react native's built-in Animated to react-native-reanimated - This was caused by react native 77 using the new architecture by default - Add dependency on [email protected] - https://docs.swmansion.com/react-native-reanimated/docs/fundamentals/getting-started/ - Previously removed in 7b0b38a - Fix iOS RefreshControl not shown on mount - This was caused by react native 77 using the new architecture by default - Created PR on react-native: facebook/react-native#49240 - Used patch-package to bring this in locally until the PR is merged - Fix failing jest tests by removing jestSetupMockReactNavigation.ts - According to the docs, the mock is only needed when using DrawerNavigator or (non-native) StackNavigator - https://reactnavigation.org/docs/testing/#mocking-native-modules - Fix ListEmptyComponent briefly shown even though first page was non-empty - This was caused by react native 77 using the new architecture by default - This affected useModels, usePrependedModels, and useLeadItems because they used useEffect when they should have used useMemo, causing a render delay between when ready was true and when models were non-empty - As a result of the change from useEffect to useMemo in Models, I had to remove the isEqual check. This caused useModel consumers to have more renders than previously, since previously the isEqual check debounced many re-renders, e.g. when fetching data from the backend updated the cache, but didn't affect any of the ids watched by the specific instance of useModels - I updated useModelCache, which aleviated some of these unnecessary re-renders, but the scenario mentioned above still causes re-renders - The only place these new renders caused real issues was with OrgGraph. The useModelCache change fixed a re-render on pull-to-refresh of the OrgGraph. However, I specifically needed to debounce officers in VisGraphData or else selecting a node would trigger an OrgGraph re-render - Update react-native-screens from 4.5.0 to 4.6.0 to fix an issue where HeaderButton onPress was ignored on Android devices - react-navigation/react-navigation#12274 - software-mansion/react-native-screens#2219 (comment) - Add an override to rnx-kit config, since it expected react-native-screens to be 4.5.0 instead of 4.6.0 for react native 77 - https://microsoft.github.io/rnx-kit/docs/tools/align-deps#presets - https://microsoft.github.io/rnx-kit/docs/architecture/dependency-management#extensions - https://github.com/microsoft/rnx-kit/tree/main/packages/align-deps#configure
Summary:
RefreshControl
backed byRCTRefreshControl.m
on mount (see old arch rn-tester video).RefreshControl
backed byRCTPullToRefreshViewComponentView.mm
is not shown. Additionally, recycledRefreshControl
s are missing theirtitle
s (see new arch rn-tester video).RefreshControlExample
to include a refresh-on-mount to prevent future regressionsChangelog:
[IOS] [FIXED] - Fix new arch RefreshControl wasn't shown when refreshing on mount
[IOS] [FIXED] - Fix new arch recycled RefreshControl was missing its title
[INTERNAL] [CHANGED] - Update rn-tester RefreshControlExample to refresh on mount
Test Plan:
new_arch_enabled
to returnfalse
new_arch_enabled
to returntrue
[email protected]
, with the new arch now enabled by default. Note that this app usesreact-navigation
andreact-native-screens
, which I expected might complicate the fix. The changes in this PR continue to work as expected, even with the complications of those popular libraries.Details:
RCTRefreshControl.m
, which haven't yet been included in the newRCTPullToRefreshViewComponentView.mm
_isBeforeInitialLayout
is inspired by the old_isInitialRender
layoutSubviews
is inspired by the oldlayoutSubviews
beginRefreshingProgrammatically
is inspired by the oldbeginRefreshingProgrammatically
RCTRefreshControl.m
UIRefreshControl
ignores many style updates, and even calls tobeginRefreshing
, until it's been added to the view hierarchy. That's why thelayoutSubviews
hack was needed in the old arch, and is similarly needed in this PR.beingRefreshing
needed to be called in a ViewController'sviewWillAppear
lifecycle callbackviewWillLayoutSubviews
(and by extension, all of the subviews'layoutSubviews
) is indeed called afterviewWillAppear
_refreshControl
effectively ignores updates until the firstlayoutSubviews
call, I needed to buffer all calls toupdateProps:oldProps:
into my new_initialProps
before finally re-callingupdateProps:oldProps:
with_initialProps
againstPullToRefreshViewShadowNode::defaultSharedProps
inlayoutSubviews
if
block regarding refreshing from the top ofupdateProps:oldProps:
to the bottom of it, because_refreshControl
ignores updates that are made after the call tobeginRefreshing
Known issues:
[scrollView setContentOffset:offset]
in the PR code.react-navigation
andreact-native-screens
libraries. In that case, theRefreshControl
exhibited the same buggy behavior of not being shown when refreshing on mount.