Skip to content

perf: More performant items reordering#435

Merged
MatiPl01 merged 2 commits intomainfrom
perf/more-performant-items-reordering
Jul 27, 2025
Merged

perf: More performant items reordering#435
MatiPl01 merged 2 commits intomainfrom
perf/more-performant-items-reordering

Conversation

@MatiPl01
Copy link
Copy Markdown
Owner

Description

This PR implements more performant items reordering in sortable components that takes architectural differences into account (the onLayout callback is called more often on the New Architecture if we use layout-based items positioning).

@MatiPl01 MatiPl01 self-assigned this Jul 27, 2025
@MatiPl01 MatiPl01 added enhancement New feature or request performance labels Jul 27, 2025
@vercel
Copy link
Copy Markdown

vercel Bot commented Jul 27, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

1 Skipped Deployment
Name Status Preview Comments Updated (UTC)
react-native-sortables-docs ⬜️ Ignored (Inspect) Jul 27, 2025 9:45pm

@MatiPl01 MatiPl01 requested a review from Copilot July 27, 2025 21:45
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR optimizes item reordering performance in sortable components by implementing architecture-specific positioning strategies. It addresses performance issues in the New Architecture (Fabric) where layout changes trigger excessive onLayout callbacks.

  • Introduces separate positioning logic for Paper (old architecture) vs Fabric (new architecture)
  • Implements hybrid positioning approach for Fabric using transforms during animations and layout props otherwise
  • Adds architecture detection utility to determine runtime behavior

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
packages/react-native-sortables/src/providers/shared/hooks/useItemStyles.ts Refactors item positioning logic into architecture-specific functions with performance optimizations
packages/react-native-sortables/src/constants/platform.ts Adds Fabric architecture detection function

return isFabric() || IS_WEB
? // eslint-disable-next-line react-hooks/rules-of-hooks
useItemStylesFabric(position, layoutPosition, decoration, zIndex)
: // eslint-disable-next-line react-hooks/rules-of-hooks
Copy link

Copilot AI Jul 27, 2025

Choose a reason for hiding this comment

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

Conditionally calling hooks violates the Rules of Hooks. Consider restructuring to always call the same hooks in the same order, perhaps by moving the conditional logic inside the hook implementations.

Copilot uses AI. Check for mistakes.
Comment thread packages/react-native-sortables/src/constants/platform.ts
@MatiPl01 MatiPl01 merged commit be78141 into main Jul 27, 2025
6 checks passed
@MatiPl01 MatiPl01 deleted the perf/more-performant-items-reordering branch July 27, 2025 21:46
MatiPl01 pushed a commit that referenced this pull request Jul 29, 2025
# [1.8.0](v1.7.1...v1.8.0) (2025-07-29)

### Bug Fixes

* Allow disabling default layer provider ([#424](#424)) ([ded5c92](ded5c92)), closes [#417](#417) [#36877](https://github.com/MatiPl01/react-native-sortables/issues/36877)
* Buggy grid swapping in some edge cases ([#414](#414)) ([3617f86](3617f86))
* DragProvider drag end index assignment ([#411](#411)) ([69ad8a6](69ad8a6))
* Hiding of the sortable item when teleported ([#436](#436)) ([4c3796f](4c3796f))
* Invalid flex container height on initial render and other small issues ([#437](#437)) ([48e905b](48e905b))
* Invalid ScrollView position on input focus ([#431](#431)) ([2693234](2693234)), closes [#ef4444](https://github.com/MatiPl01/react-native-sortables/issues/ef4444)
* Long drop duration reordering issues ([#406](#406)) ([ace7037](ace7037))
* Multiple minor improvements ([#439](#439)) ([f9d83e3](f9d83e3))
* Paper flickering and positioning issues ([#426](#426)) ([744e291](744e291))
* Teleported active item flickering ([#405](#405)) ([1413af2](1413af2))

### Features

* Base multi zone provider ([#409](#409)) ([56f0ef3](56f0ef3))
* Base zone with event callbacks ([#413](#413)) ([e51ca61](e51ca61))
* Fixed items support in sortable flex ([#416](#416)) ([1d23fcc](1d23fcc)), closes [#374](#374)
* Max overscroll settings ([#423](#423)) ([167dc4e](167dc4e)), closes [#419](#419)
* Separate controlled item dimensions from measured dimensions ([#433](#433)) ([cad95e5](cad95e5))

### Performance Improvements

* Merge item decoration styles with position styles ([#407](#407)) ([5066edd](5066edd))
* More performant items reordering ([#435](#435)) ([be78141](be78141))
* Reduce the number of unnecessary onLayout calls ([#434](#434)) ([ce56159](ce56159)), closes [#431](#431)
* Replace useSharedValue with useMutableValue ([#408](#408)) ([6994c7a](6994c7a))
@MatiPl01
Copy link
Copy Markdown
Owner Author

🎉 This issue has been resolved in version 1.8.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants