@react-native-ohos/flash-list 1.8.3-rc.5 → 2.1.1-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.OpenSource +1 -1
- package/dist/AnimatedFlashList.d.ts +4 -28
- package/dist/AnimatedFlashList.d.ts.map +1 -1
- package/dist/AnimatedFlashList.js +5 -30
- package/dist/AnimatedFlashList.js.map +1 -1
- package/dist/FlashList.d.ts +1 -179
- package/dist/FlashList.d.ts.map +1 -1
- package/dist/FlashList.js +1 -599
- package/dist/FlashList.js.map +1 -1
- package/dist/FlashListProps.d.ts +285 -278
- package/dist/FlashListProps.d.ts.map +1 -1
- package/dist/FlashListProps.js +5 -31
- package/dist/FlashListProps.js.map +1 -1
- package/dist/FlashListRef.d.ts +305 -0
- package/dist/FlashListRef.d.ts.map +1 -0
- package/dist/FlashListRef.js +2 -0
- package/dist/FlashListRef.js.map +1 -0
- package/dist/benchmark/AutoScrollHelper.d.ts +17 -40
- package/dist/benchmark/AutoScrollHelper.d.ts.map +1 -1
- package/dist/benchmark/AutoScrollHelper.js +59 -90
- package/dist/benchmark/AutoScrollHelper.js.map +1 -1
- package/dist/benchmark/JSFPSMonitor.d.ts +22 -45
- package/dist/benchmark/JSFPSMonitor.d.ts.map +1 -1
- package/dist/benchmark/JSFPSMonitor.js +59 -87
- package/dist/benchmark/JSFPSMonitor.js.map +1 -1
- package/dist/benchmark/roundToDecimalPlaces.d.ts +1 -24
- package/dist/benchmark/roundToDecimalPlaces.d.ts.map +1 -1
- package/dist/benchmark/roundToDecimalPlaces.js +4 -31
- package/dist/benchmark/roundToDecimalPlaces.js.map +1 -1
- package/dist/benchmark/useBenchmark.d.ts +40 -57
- package/dist/benchmark/useBenchmark.d.ts.map +1 -1
- package/dist/benchmark/useBenchmark.js +119 -189
- package/dist/benchmark/useBenchmark.js.map +1 -1
- package/dist/benchmark/useDataMultiplier.d.ts +8 -31
- package/dist/benchmark/useDataMultiplier.d.ts.map +1 -1
- package/dist/benchmark/useDataMultiplier.js +19 -47
- package/dist/benchmark/useDataMultiplier.js.map +1 -1
- package/dist/benchmark/useFlatListBenchmark.d.ts +14 -35
- package/dist/benchmark/useFlatListBenchmark.d.ts.map +1 -1
- package/dist/benchmark/useFlatListBenchmark.js +92 -122
- package/dist/benchmark/useFlatListBenchmark.js.map +1 -1
- package/dist/errors/ErrorMessages.d.ts +16 -0
- package/dist/errors/ErrorMessages.d.ts.map +1 -0
- package/dist/errors/ErrorMessages.js +16 -0
- package/dist/errors/ErrorMessages.js.map +1 -0
- package/dist/errors/WarningMessages.d.ts +6 -0
- package/dist/errors/WarningMessages.d.ts.map +1 -0
- package/dist/errors/WarningMessages.js +7 -0
- package/dist/errors/WarningMessages.js.map +1 -0
- package/dist/index.d.ts +15 -36
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -54
- package/dist/index.js.map +1 -1
- package/dist/isNewArch.d.ts +2 -0
- package/dist/isNewArch.d.ts.map +1 -0
- package/dist/isNewArch.js +22 -0
- package/dist/isNewArch.js.map +1 -0
- package/dist/native/config/PlatformHelper.android.d.ts +6 -48
- package/dist/native/config/PlatformHelper.android.d.ts.map +1 -1
- package/dist/native/config/PlatformHelper.android.js +6 -45
- package/dist/native/config/PlatformHelper.android.js.map +1 -1
- package/dist/native/config/PlatformHelper.d.ts +6 -48
- package/dist/native/config/PlatformHelper.d.ts.map +1 -1
- package/dist/native/config/PlatformHelper.harmony.d.ts +29 -48
- package/dist/native/config/PlatformHelper.harmony.d.ts.map +1 -1
- package/dist/native/config/PlatformHelper.harmony.js +29 -44
- package/dist/native/config/PlatformHelper.harmony.js.map +1 -1
- package/dist/native/config/PlatformHelper.ios.d.ts +6 -48
- package/dist/native/config/PlatformHelper.ios.d.ts.map +1 -1
- package/dist/native/config/PlatformHelper.ios.js +6 -44
- package/dist/native/config/PlatformHelper.ios.js.map +1 -1
- package/dist/native/config/PlatformHelper.js +6 -45
- package/dist/native/config/PlatformHelper.js.map +1 -1
- package/dist/native/config/PlatformHelper.web.d.ts +6 -49
- package/dist/native/config/PlatformHelper.web.d.ts.map +1 -1
- package/dist/native/config/PlatformHelper.web.js +6 -47
- package/dist/native/config/PlatformHelper.web.js.map +1 -1
- package/dist/recyclerview/LayoutCommitObserver.d.ts +12 -0
- package/dist/recyclerview/LayoutCommitObserver.d.ts.map +1 -0
- package/dist/recyclerview/LayoutCommitObserver.js +58 -0
- package/dist/recyclerview/LayoutCommitObserver.js.map +1 -0
- package/dist/recyclerview/RecyclerView.d.ts +13 -0
- package/dist/recyclerview/RecyclerView.d.ts.map +1 -0
- package/dist/recyclerview/RecyclerView.js +368 -0
- package/dist/recyclerview/RecyclerView.js.map +1 -0
- package/dist/recyclerview/RecyclerViewContextProvider.d.ts +46 -0
- package/dist/recyclerview/RecyclerViewContextProvider.d.ts.map +1 -0
- package/dist/recyclerview/RecyclerViewContextProvider.js +10 -0
- package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -0
- package/dist/recyclerview/RecyclerViewManager.d.ts +78 -0
- package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -0
- package/dist/recyclerview/RecyclerViewManager.js +343 -0
- package/dist/recyclerview/RecyclerViewManager.js.map +1 -0
- package/dist/recyclerview/RecyclerViewProps.d.ts +2 -0
- package/dist/recyclerview/RecyclerViewProps.d.ts.map +1 -0
- package/dist/recyclerview/RecyclerViewProps.js +2 -0
- package/dist/recyclerview/RecyclerViewProps.js.map +1 -0
- package/dist/recyclerview/RenderStackManager.d.ts +86 -0
- package/dist/recyclerview/RenderStackManager.d.ts.map +1 -0
- package/dist/recyclerview/RenderStackManager.js +252 -0
- package/dist/recyclerview/RenderStackManager.js.map +1 -0
- package/dist/recyclerview/ViewHolder.d.ts +45 -0
- package/dist/recyclerview/ViewHolder.d.ts.map +1 -0
- package/dist/recyclerview/ViewHolder.js +94 -0
- package/dist/recyclerview/ViewHolder.js.map +1 -0
- package/dist/recyclerview/ViewHolderCollection.d.ts +63 -0
- package/dist/recyclerview/ViewHolderCollection.d.ts.map +1 -0
- package/dist/recyclerview/ViewHolderCollection.js +87 -0
- package/dist/recyclerview/ViewHolderCollection.js.map +1 -0
- package/dist/recyclerview/components/CompatScroller.d.ts +7 -0
- package/dist/recyclerview/components/CompatScroller.d.ts.map +1 -0
- package/dist/recyclerview/components/CompatScroller.js +7 -0
- package/dist/recyclerview/components/CompatScroller.js.map +1 -0
- package/dist/recyclerview/components/CompatView.d.ts +7 -0
- package/dist/recyclerview/components/CompatView.d.ts.map +1 -0
- package/dist/recyclerview/components/CompatView.js +7 -0
- package/dist/recyclerview/components/CompatView.js.map +1 -0
- package/dist/recyclerview/components/ScrollAnchor.d.ts +29 -0
- package/dist/recyclerview/components/ScrollAnchor.d.ts.map +1 -0
- package/dist/recyclerview/components/ScrollAnchor.js +33 -0
- package/dist/recyclerview/components/ScrollAnchor.js.map +1 -0
- package/dist/recyclerview/components/StickyHeaders.d.ts +38 -0
- package/dist/recyclerview/components/StickyHeaders.d.ts.map +1 -0
- package/dist/recyclerview/components/StickyHeaders.js +112 -0
- package/dist/recyclerview/components/StickyHeaders.js.map +1 -0
- package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts +51 -0
- package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts.map +1 -0
- package/dist/recyclerview/helpers/ConsecutiveNumbers.js +95 -0
- package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -0
- package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts +105 -0
- package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts.map +1 -0
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js +202 -0
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -0
- package/dist/recyclerview/helpers/RenderTimeTracker.d.ts +14 -0
- package/dist/recyclerview/helpers/RenderTimeTracker.d.ts.map +1 -0
- package/dist/recyclerview/helpers/RenderTimeTracker.js +44 -0
- package/dist/recyclerview/helpers/RenderTimeTracker.js.map +1 -0
- package/dist/recyclerview/helpers/VelocityTracker.d.ts +29 -0
- package/dist/recyclerview/helpers/VelocityTracker.d.ts.map +1 -0
- package/dist/recyclerview/helpers/VelocityTracker.js +64 -0
- package/dist/recyclerview/helpers/VelocityTracker.js.map +1 -0
- package/dist/recyclerview/hooks/useBoundDetection.d.ts +17 -0
- package/dist/recyclerview/hooks/useBoundDetection.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useBoundDetection.js +132 -0
- package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -0
- package/dist/recyclerview/hooks/useLayoutState.d.ts +14 -0
- package/dist/recyclerview/hooks/useLayoutState.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useLayoutState.js +38 -0
- package/dist/recyclerview/hooks/useLayoutState.js.map +1 -0
- package/dist/recyclerview/hooks/useMappingHelper.d.ts +9 -0
- package/dist/recyclerview/hooks/useMappingHelper.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useMappingHelper.js +15 -0
- package/dist/recyclerview/hooks/useMappingHelper.js.map +1 -0
- package/dist/recyclerview/hooks/useOnLoad.d.ts +25 -0
- package/dist/recyclerview/hooks/useOnLoad.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useOnLoad.js +67 -0
- package/dist/recyclerview/hooks/useOnLoad.js.map +1 -0
- package/dist/recyclerview/hooks/useRecyclerViewController.d.ts +28 -0
- package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useRecyclerViewController.js +507 -0
- package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -0
- package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts +8 -0
- package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useRecyclerViewManager.js +32 -0
- package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -0
- package/dist/recyclerview/hooks/useRecyclingState.d.ts +18 -0
- package/dist/recyclerview/hooks/useRecyclingState.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useRecyclingState.js +49 -0
- package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -0
- package/dist/recyclerview/hooks/useSecondaryProps.d.ts +27 -0
- package/dist/recyclerview/hooks/useSecondaryProps.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useSecondaryProps.js +90 -0
- package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -0
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.d.ts +15 -0
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js +58 -0
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js.map +1 -0
- package/dist/recyclerview/hooks/useUnmountFlag.d.ts +10 -0
- package/dist/recyclerview/hooks/useUnmountFlag.d.ts.map +1 -0
- package/dist/recyclerview/hooks/useUnmountFlag.js +25 -0
- package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -0
- package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts +79 -0
- package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts.map +1 -0
- package/dist/recyclerview/layout-managers/GridLayoutManager.js +221 -0
- package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -0
- package/dist/recyclerview/layout-managers/LayoutManager.d.ts +296 -0
- package/dist/recyclerview/layout-managers/LayoutManager.d.ts.map +1 -0
- package/dist/recyclerview/layout-managers/LayoutManager.js +279 -0
- package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -0
- package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts +51 -0
- package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts.map +1 -0
- package/dist/recyclerview/layout-managers/LinearLayoutManager.js +151 -0
- package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -0
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts +81 -0
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts.map +1 -0
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +269 -0
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -0
- package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts +12 -0
- package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts.map +1 -0
- package/dist/recyclerview/utils/adjustOffsetForRTL.js +14 -0
- package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -0
- package/dist/recyclerview/utils/componentUtils.d.ts +19 -0
- package/dist/recyclerview/utils/componentUtils.d.ts.map +1 -0
- package/dist/recyclerview/utils/componentUtils.js +27 -0
- package/dist/recyclerview/utils/componentUtils.js.map +1 -0
- package/dist/recyclerview/utils/findVisibleIndex.d.ts +24 -0
- package/dist/recyclerview/utils/findVisibleIndex.d.ts.map +1 -0
- package/dist/recyclerview/utils/findVisibleIndex.js +76 -0
- package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -0
- package/dist/recyclerview/utils/measureLayout.d.ts +52 -0
- package/dist/recyclerview/utils/measureLayout.d.ts.map +1 -0
- package/dist/recyclerview/utils/measureLayout.js +99 -0
- package/dist/recyclerview/utils/measureLayout.js.map +1 -0
- package/dist/recyclerview/utils/measureLayout.web.d.ts +29 -0
- package/dist/recyclerview/utils/measureLayout.web.d.ts.map +1 -0
- package/dist/recyclerview/utils/measureLayout.web.js +79 -0
- package/dist/recyclerview/utils/measureLayout.web.js.map +1 -0
- package/dist/recyclerview/viewability/ViewToken.d.ts +8 -0
- package/dist/recyclerview/viewability/ViewToken.d.ts.map +1 -0
- package/dist/recyclerview/viewability/ViewToken.js +2 -0
- package/dist/recyclerview/viewability/ViewToken.js.map +1 -0
- package/dist/recyclerview/viewability/ViewabilityHelper.d.ts +26 -0
- package/dist/recyclerview/viewability/ViewabilityHelper.d.ts.map +1 -0
- package/dist/recyclerview/viewability/ViewabilityHelper.js +98 -0
- package/dist/recyclerview/viewability/ViewabilityHelper.js.map +1 -0
- package/dist/recyclerview/viewability/ViewabilityManager.d.ts +25 -0
- package/dist/recyclerview/viewability/ViewabilityManager.d.ts.map +1 -0
- package/dist/recyclerview/viewability/ViewabilityManager.js +94 -0
- package/dist/recyclerview/viewability/ViewabilityManager.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/AverageWindow.d.ts +33 -43
- package/dist/utils/AverageWindow.d.ts.map +1 -1
- package/dist/utils/AverageWindow.js +66 -71
- package/dist/utils/AverageWindow.js.map +1 -1
- package/jestSetup.js +23 -37
- package/package.json +15 -24
- package/src/AnimatedFlashList.ts +2 -25
- package/src/FlashList.ts +1 -0
- package/src/FlashListProps.ts +109 -100
- package/src/FlashListRef.ts +320 -0
- package/src/benchmark/AutoScrollHelper.ts +0 -24
- package/src/benchmark/JSFPSMonitor.ts +2 -26
- package/src/benchmark/roundToDecimalPlaces.ts +0 -24
- package/src/benchmark/useBenchmark.ts +59 -105
- package/src/benchmark/useDataMultiplier.ts +0 -24
- package/src/benchmark/useFlatListBenchmark.ts +43 -32
- package/src/errors/ErrorMessages.ts +26 -0
- package/src/errors/WarningMessages.ts +9 -0
- package/src/index.ts +18 -46
- package/src/isNewArch.ts +25 -0
- package/src/native/config/PlatformHelper.android.ts +3 -49
- package/src/native/config/PlatformHelper.harmony.ts +3 -24
- package/src/native/config/PlatformHelper.ios.ts +3 -48
- package/src/native/config/PlatformHelper.ts +3 -49
- package/src/native/config/PlatformHelper.web.ts +4 -55
- package/src/recyclerview/LayoutCommitObserver.tsx +74 -0
- package/src/recyclerview/RecyclerView.tsx +616 -0
- package/src/recyclerview/RecyclerViewContextProvider.ts +65 -0
- package/src/recyclerview/RecyclerViewManager.ts +461 -0
- package/src/recyclerview/RecyclerViewProps.ts +1 -0
- package/src/recyclerview/RenderStackManager.ts +317 -0
- package/src/recyclerview/ViewHolder.tsx +180 -0
- package/src/recyclerview/ViewHolderCollection.tsx +193 -0
- package/src/recyclerview/components/CompatScroller.ts +9 -0
- package/src/recyclerview/components/CompatView.ts +9 -0
- package/src/recyclerview/components/ScrollAnchor.tsx +66 -0
- package/src/recyclerview/components/StickyHeaders.tsx +222 -0
- package/src/recyclerview/helpers/ConsecutiveNumbers.ts +120 -0
- package/src/recyclerview/helpers/EngagedIndicesTracker.ts +301 -0
- package/src/recyclerview/helpers/RenderTimeTracker.ts +50 -0
- package/src/recyclerview/helpers/VelocityTracker.ts +77 -0
- package/src/recyclerview/hooks/useBoundDetection.ts +176 -0
- package/src/recyclerview/hooks/useLayoutState.ts +55 -0
- package/src/recyclerview/hooks/useMappingHelper.ts +20 -0
- package/src/recyclerview/hooks/useOnLoad.ts +80 -0
- package/src/recyclerview/hooks/useRecyclerViewController.tsx +633 -0
- package/src/recyclerview/hooks/useRecyclerViewManager.ts +42 -0
- package/src/recyclerview/hooks/useRecyclingState.ts +67 -0
- package/src/recyclerview/hooks/useSecondaryProps.tsx +124 -0
- package/src/recyclerview/hooks/useUnmountAwareCallbacks.ts +73 -0
- package/src/recyclerview/hooks/useUnmountFlag.ts +27 -0
- package/src/recyclerview/layout-managers/GridLayoutManager.ts +256 -0
- package/src/recyclerview/layout-managers/LayoutManager.ts +568 -0
- package/src/recyclerview/layout-managers/LinearLayoutManager.ts +171 -0
- package/src/recyclerview/layout-managers/MasonryLayoutManager.ts +323 -0
- package/src/recyclerview/utils/adjustOffsetForRTL.ts +17 -0
- package/src/recyclerview/utils/componentUtils.ts +28 -0
- package/src/recyclerview/utils/findVisibleIndex.ts +93 -0
- package/src/recyclerview/utils/measureLayout.ts +128 -0
- package/src/recyclerview/utils/measureLayout.web.ts +102 -0
- package/src/recyclerview/viewability/ViewToken.ts +7 -0
- package/src/{viewability → recyclerview/viewability}/ViewabilityHelper.ts +8 -33
- package/src/{viewability → recyclerview/viewability}/ViewabilityManager.ts +23 -46
- package/src/utils/AverageWindow.ts +33 -24
- package/dist/GridLayoutProviderWithProps.d.ts +0 -65
- package/dist/GridLayoutProviderWithProps.d.ts.map +0 -1
- package/dist/GridLayoutProviderWithProps.js +0 -138
- package/dist/GridLayoutProviderWithProps.js.map +0 -1
- package/dist/MasonryFlashList.d.ts +0 -74
- package/dist/MasonryFlashList.d.ts.map +0 -1
- package/dist/MasonryFlashList.js +0 -275
- package/dist/MasonryFlashList.js.map +0 -1
- package/dist/PureComponentWrapper.d.ts +0 -45
- package/dist/PureComponentWrapper.d.ts.map +0 -1
- package/dist/PureComponentWrapper.js +0 -60
- package/dist/PureComponentWrapper.js.map +0 -1
- package/dist/__tests__/AverageWindow.test.d.ts +0 -2
- package/dist/__tests__/AverageWindow.test.d.ts.map +0 -1
- package/dist/__tests__/AverageWindow.test.js +0 -69
- package/dist/__tests__/AverageWindow.test.js.map +0 -1
- package/dist/__tests__/ContentContainerUtils.test.d.ts +0 -2
- package/dist/__tests__/ContentContainerUtils.test.d.ts.map +0 -1
- package/dist/__tests__/ContentContainerUtils.test.js +0 -85
- package/dist/__tests__/ContentContainerUtils.test.js.map +0 -1
- package/dist/__tests__/FlashList.test.d.ts +0 -2
- package/dist/__tests__/FlashList.test.d.ts.map +0 -1
- package/dist/__tests__/FlashList.test.js +0 -792
- package/dist/__tests__/FlashList.test.js.map +0 -1
- package/dist/__tests__/GridLayoutProviderWithProps.test.d.ts +0 -2
- package/dist/__tests__/GridLayoutProviderWithProps.test.d.ts.map +0 -1
- package/dist/__tests__/GridLayoutProviderWithProps.test.js +0 -143
- package/dist/__tests__/GridLayoutProviderWithProps.test.js.map +0 -1
- package/dist/__tests__/MasonryFlashList.test.d.ts +0 -2
- package/dist/__tests__/MasonryFlashList.test.d.ts.map +0 -1
- package/dist/__tests__/MasonryFlashList.test.js +0 -254
- package/dist/__tests__/MasonryFlashList.test.js.map +0 -1
- package/dist/__tests__/PlatformHelper.web.test.d.ts +0 -2
- package/dist/__tests__/PlatformHelper.web.test.d.ts.map +0 -1
- package/dist/__tests__/PlatformHelper.web.test.js +0 -33
- package/dist/__tests__/PlatformHelper.web.test.js.map +0 -1
- package/dist/__tests__/ViewabilityHelper.test.d.ts +0 -2
- package/dist/__tests__/ViewabilityHelper.test.d.ts.map +0 -1
- package/dist/__tests__/ViewabilityHelper.test.js +0 -187
- package/dist/__tests__/ViewabilityHelper.test.js.map +0 -1
- package/dist/__tests__/helpers/mountFlashList.d.ts +0 -19
- package/dist/__tests__/helpers/mountFlashList.d.ts.map +0 -1
- package/dist/__tests__/helpers/mountFlashList.js +0 -44
- package/dist/__tests__/helpers/mountFlashList.js.map +0 -1
- package/dist/__tests__/helpers/mountMasonryFlashList.d.ts +0 -18
- package/dist/__tests__/helpers/mountMasonryFlashList.d.ts.map +0 -1
- package/dist/__tests__/helpers/mountMasonryFlashList.js +0 -49
- package/dist/__tests__/helpers/mountMasonryFlashList.js.map +0 -1
- package/dist/__tests__/useBlankAreaTracker.test.d.ts +0 -2
- package/dist/__tests__/useBlankAreaTracker.test.d.ts.map +0 -1
- package/dist/__tests__/useBlankAreaTracker.test.js +0 -177
- package/dist/__tests__/useBlankAreaTracker.test.js.map +0 -1
- package/dist/benchmark/useBlankAreaTracker.d.ts +0 -57
- package/dist/benchmark/useBlankAreaTracker.d.ts.map +0 -1
- package/dist/benchmark/useBlankAreaTracker.js +0 -90
- package/dist/benchmark/useBlankAreaTracker.js.map +0 -1
- package/dist/errors/CustomError.d.ts +0 -31
- package/dist/errors/CustomError.d.ts.map +0 -1
- package/dist/errors/CustomError.js +0 -37
- package/dist/errors/CustomError.js.map +0 -1
- package/dist/errors/ExceptionList.d.ts +0 -47
- package/dist/errors/ExceptionList.d.ts.map +0 -1
- package/dist/errors/ExceptionList.js +0 -49
- package/dist/errors/ExceptionList.js.map +0 -1
- package/dist/errors/Warnings.d.ts +0 -32
- package/dist/errors/Warnings.d.ts.map +0 -1
- package/dist/errors/Warnings.js +0 -36
- package/dist/errors/Warnings.js.map +0 -1
- package/dist/fabric/AutoLayoutNativeComponent.d.ts +0 -42
- package/dist/fabric/AutoLayoutNativeComponent.d.ts.map +0 -1
- package/dist/fabric/AutoLayoutNativeComponent.js +0 -29
- package/dist/fabric/AutoLayoutNativeComponent.js.map +0 -1
- package/dist/fabric/CellContainerNativeComponent.d.ts +0 -31
- package/dist/fabric/CellContainerNativeComponent.d.ts.map +0 -1
- package/dist/fabric/CellContainerNativeComponent.js +0 -29
- package/dist/fabric/CellContainerNativeComponent.js.map +0 -1
- package/dist/native/auto-layout/AutoLayoutView.d.ts +0 -45
- package/dist/native/auto-layout/AutoLayoutView.d.ts.map +0 -1
- package/dist/native/auto-layout/AutoLayoutView.js +0 -71
- package/dist/native/auto-layout/AutoLayoutView.js.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts +0 -27
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js +0 -29
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts +0 -28
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.d.ts +0 -27
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.d.ts.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.js +0 -29
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.js.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts +0 -27
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js +0 -29
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js +0 -29
- package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts +0 -39
- package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts.map +0 -1
- package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js +0 -26
- package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js.map +0 -1
- package/dist/native/cell-container/CellContainer.android.d.ts +0 -29
- package/dist/native/cell-container/CellContainer.android.d.ts.map +0 -1
- package/dist/native/cell-container/CellContainer.android.js +0 -32
- package/dist/native/cell-container/CellContainer.android.js.map +0 -1
- package/dist/native/cell-container/CellContainer.d.ts +0 -31
- package/dist/native/cell-container/CellContainer.d.ts.map +0 -1
- package/dist/native/cell-container/CellContainer.harmony.d.ts +0 -29
- package/dist/native/cell-container/CellContainer.harmony.d.ts.map +0 -1
- package/dist/native/cell-container/CellContainer.harmony.js +0 -32
- package/dist/native/cell-container/CellContainer.harmony.js.map +0 -1
- package/dist/native/cell-container/CellContainer.ios.d.ts +0 -29
- package/dist/native/cell-container/CellContainer.ios.d.ts.map +0 -1
- package/dist/native/cell-container/CellContainer.ios.js +0 -32
- package/dist/native/cell-container/CellContainer.ios.js.map +0 -1
- package/dist/native/cell-container/CellContainer.js +0 -34
- package/dist/native/cell-container/CellContainer.js.map +0 -1
- package/dist/native/cell-container/CellContainer.web.d.ts +0 -30
- package/dist/native/cell-container/CellContainer.web.d.ts.map +0 -1
- package/dist/native/cell-container/CellContainer.web.js +0 -36
- package/dist/native/cell-container/CellContainer.web.js.map +0 -1
- package/dist/utils/ContentContainerUtils.d.ts +0 -50
- package/dist/utils/ContentContainerUtils.d.ts.map +0 -1
- package/dist/utils/ContentContainerUtils.js +0 -71
- package/dist/utils/ContentContainerUtils.js.map +0 -1
- package/dist/viewability/ViewToken.d.ts +0 -31
- package/dist/viewability/ViewToken.d.ts.map +0 -1
- package/dist/viewability/ViewToken.js +0 -26
- package/dist/viewability/ViewToken.js.map +0 -1
- package/dist/viewability/ViewabilityHelper.d.ts +0 -49
- package/dist/viewability/ViewabilityHelper.d.ts.map +0 -1
- package/dist/viewability/ViewabilityHelper.js +0 -130
- package/dist/viewability/ViewabilityHelper.js.map +0 -1
- package/dist/viewability/ViewabilityManager.d.ts +0 -48
- package/dist/viewability/ViewabilityManager.d.ts.map +0 -1
- package/dist/viewability/ViewabilityManager.js +0 -131
- package/dist/viewability/ViewabilityManager.js.map +0 -1
- package/harmony/flash_list/BuildProfile.ets +0 -17
- package/harmony/flash_list/LICENSE +0 -7
- package/harmony/flash_list/build-profile.json5 +0 -8
- package/harmony/flash_list/hvigorfile.ts +0 -1
- package/harmony/flash_list/index.ets +0 -27
- package/harmony/flash_list/obfuscation-rules.txt +0 -18
- package/harmony/flash_list/oh-package.json5 +0 -24
- package/harmony/flash_list/src/main/cpp/AutoLayoutNode.cpp +0 -63
- package/harmony/flash_list/src/main/cpp/AutoLayoutNode.h +0 -54
- package/harmony/flash_list/src/main/cpp/AutoLayoutShadow.cpp +0 -140
- package/harmony/flash_list/src/main/cpp/AutoLayoutShadow.h +0 -66
- package/harmony/flash_list/src/main/cpp/AutoLayoutViewComponentInstance.cpp +0 -208
- package/harmony/flash_list/src/main/cpp/AutoLayoutViewComponentInstance.h +0 -78
- package/harmony/flash_list/src/main/cpp/AutoLayoutViewEventEmitRequestHandler.h +0 -53
- package/harmony/flash_list/src/main/cpp/AutoLayoutViewJSIBinder.h +0 -50
- package/harmony/flash_list/src/main/cpp/CMakeLists.txt +0 -12
- package/harmony/flash_list/src/main/cpp/CellContainerComponentInstance.cpp +0 -80
- package/harmony/flash_list/src/main/cpp/CellContainerComponentInstance.h +0 -64
- package/harmony/flash_list/src/main/cpp/CellContainerJSIBinder.h +0 -39
- package/harmony/flash_list/src/main/cpp/ComponentDescriptors.h +0 -40
- package/harmony/flash_list/src/main/cpp/EventEmitters.cpp +0 -40
- package/harmony/flash_list/src/main/cpp/EventEmitters.h +0 -48
- package/harmony/flash_list/src/main/cpp/FlashListPackage.h +0 -85
- package/harmony/flash_list/src/main/cpp/FlashListStackNode.cpp +0 -87
- package/harmony/flash_list/src/main/cpp/FlashListStackNode.h +0 -57
- package/harmony/flash_list/src/main/cpp/Props.cpp +0 -52
- package/harmony/flash_list/src/main/cpp/Props.h +0 -64
- package/harmony/flash_list/src/main/cpp/ShadowNodes.cpp +0 -34
- package/harmony/flash_list/src/main/cpp/ShadowNodes.h +0 -48
- package/harmony/flash_list/src/main/ets/Logger.ets +0 -64
- package/harmony/flash_list/src/main/ets/RNAutoLayoutShadow.ets +0 -154
- package/harmony/flash_list/src/main/ets/RNAutoLayoutView.ets +0 -277
- package/harmony/flash_list/src/main/ets/RNCellContainer.ets +0 -113
- package/harmony/flash_list/src/main/module.json5 +0 -9
- package/harmony/flash_list/src/main/resources/base/element/color.json +0 -8
- package/harmony/flash_list/src/main/resources/base/element/string.json +0 -16
- package/harmony/flash_list/src/main/resources/base/media/icon.png +0 -0
- package/harmony/flash_list/src/main/resources/base/profile/main_pages.json +0 -5
- package/harmony/flash_list/src/main/resources/en_US/element/string.json +0 -16
- package/harmony/flash_list/src/main/resources/zh_CN/element/string.json +0 -16
- package/harmony/flash_list.har +0 -0
- package/src/FlashList.tsx +0 -949
- package/src/GridLayoutProviderWithProps.ts +0 -204
- package/src/MasonryFlashList.tsx +0 -499
- package/src/PureComponentWrapper.tsx +0 -65
- package/src/benchmark/useBlankAreaTracker.ts +0 -141
- package/src/errors/CustomError.ts +0 -34
- package/src/errors/ExceptionList.ts +0 -52
- package/src/errors/Warnings.ts +0 -39
- package/src/fabric/AutoLayoutNativeComponent.ts +0 -52
- package/src/fabric/CellContainerNativeComponent.ts +0 -35
- package/src/native/auto-layout/AutoLayoutView.tsx +0 -97
- package/src/native/auto-layout/AutoLayoutViewNativeComponent.android.ts +0 -31
- package/src/native/auto-layout/AutoLayoutViewNativeComponent.harmony.ts +0 -31
- package/src/native/auto-layout/AutoLayoutViewNativeComponent.ios.ts +0 -31
- package/src/native/auto-layout/AutoLayoutViewNativeComponent.ts +0 -31
- package/src/native/auto-layout/AutoLayoutViewNativeComponentProps.ts +0 -41
- package/src/native/cell-container/CellContainer.android.ts +0 -31
- package/src/native/cell-container/CellContainer.harmony.ts +0 -31
- package/src/native/cell-container/CellContainer.ios.ts +0 -31
- package/src/native/cell-container/CellContainer.tsx +0 -38
- package/src/native/cell-container/CellContainer.web.tsx +0 -33
- package/src/utils/ContentContainerUtils.ts +0 -116
- package/src/viewability/ViewToken.ts +0 -31
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { useCallback, useMemo, useRef } from "react";
|
|
2
|
+
|
|
3
|
+
import { LayoutStateSetter, useLayoutState } from "./useLayoutState";
|
|
4
|
+
|
|
5
|
+
export type RecyclingStateSetter<T> = LayoutStateSetter<T>;
|
|
6
|
+
|
|
7
|
+
export type RecyclingStateInitialValue<T> = T | (() => T);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A custom hook that provides state management with automatic reset functionality.
|
|
11
|
+
* Similar to useState, but automatically resets the state when specified dependencies change.
|
|
12
|
+
* This is particularly useful for managing state that needs to be reset when certain props or values change when items are recycled.
|
|
13
|
+
* This also avoids another setState call on recycling and helps with performance.
|
|
14
|
+
*
|
|
15
|
+
* @param initialState - The initial state value or a function that returns the initial state
|
|
16
|
+
* @param deps - Array of dependencies that trigger a state reset when changed
|
|
17
|
+
* @param onReset - Optional callback function that is called when the state is reset
|
|
18
|
+
* @returns A tuple containing:
|
|
19
|
+
* - The current state value
|
|
20
|
+
* - A setState function that works like useState's setState
|
|
21
|
+
*/
|
|
22
|
+
export function useRecyclingState<T>(
|
|
23
|
+
initialState: RecyclingStateInitialValue<T>,
|
|
24
|
+
deps: React.DependencyList,
|
|
25
|
+
onReset?: () => void
|
|
26
|
+
): [T, RecyclingStateSetter<T>] {
|
|
27
|
+
// Store the current state value in a ref to persist between renders
|
|
28
|
+
const valueStore = useRef<T>();
|
|
29
|
+
// Use layoutState to trigger re-renders when state changes
|
|
30
|
+
const [_, setCounter] = useLayoutState(0);
|
|
31
|
+
|
|
32
|
+
// Reset state when dependencies change
|
|
33
|
+
useMemo(() => {
|
|
34
|
+
// Calculate initial value from function or direct value
|
|
35
|
+
const initialValue =
|
|
36
|
+
typeof initialState === "function"
|
|
37
|
+
? (initialState as () => T)()
|
|
38
|
+
: initialState;
|
|
39
|
+
valueStore.current = initialValue;
|
|
40
|
+
// Call onReset callback if provided
|
|
41
|
+
onReset?.();
|
|
42
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
43
|
+
}, deps);
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Proxy setState function that updates the stored value and triggers a re-render.
|
|
47
|
+
* Only triggers a re-render if the new value is different from the current value.
|
|
48
|
+
*/
|
|
49
|
+
const setStateProxy: RecyclingStateSetter<T> = useCallback(
|
|
50
|
+
(newValue, skipParentLayout) => {
|
|
51
|
+
// Calculate next state value from function or direct value
|
|
52
|
+
const nextState =
|
|
53
|
+
typeof newValue === "function"
|
|
54
|
+
? (newValue as (prevValue: T) => T)(valueStore.current!)
|
|
55
|
+
: newValue;
|
|
56
|
+
|
|
57
|
+
// Only update and trigger re-render if value has changed
|
|
58
|
+
if (nextState !== valueStore.current) {
|
|
59
|
+
valueStore.current = nextState;
|
|
60
|
+
setCounter((prev) => prev + 1, skipParentLayout);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
[setCounter]
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
return [valueStore.current!, setStateProxy];
|
|
67
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Animated, RefreshControl } from "react-native";
|
|
2
|
+
import React, { useMemo } from "react";
|
|
3
|
+
|
|
4
|
+
import { RecyclerViewProps } from "../RecyclerViewProps";
|
|
5
|
+
import { getValidComponent } from "../utils/componentUtils";
|
|
6
|
+
import { CompatView } from "../components/CompatView";
|
|
7
|
+
import { CompatAnimatedScroller } from "../components/CompatScroller";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Hook that manages secondary props and components for the RecyclerView.
|
|
11
|
+
* This hook handles the creation and management of:
|
|
12
|
+
* 1. Pull-to-refresh functionality
|
|
13
|
+
* 2. Header and footer components
|
|
14
|
+
* 3. Empty state component
|
|
15
|
+
* 4. Custom scroll component with animation support
|
|
16
|
+
*
|
|
17
|
+
* @param props - The RecyclerViewProps containing all configuration options
|
|
18
|
+
* @returns An object containing:
|
|
19
|
+
* - refreshControl: The pull-to-refresh control component
|
|
20
|
+
* - renderHeader: The header component renderer
|
|
21
|
+
* - renderFooter: The footer component renderer
|
|
22
|
+
* - renderEmpty: The empty state component renderer
|
|
23
|
+
* - CompatScrollView: The animated scroll component
|
|
24
|
+
*/
|
|
25
|
+
export function useSecondaryProps<T>(props: RecyclerViewProps<T>) {
|
|
26
|
+
const {
|
|
27
|
+
ListHeaderComponent,
|
|
28
|
+
ListHeaderComponentStyle,
|
|
29
|
+
ListFooterComponent,
|
|
30
|
+
ListFooterComponentStyle,
|
|
31
|
+
ListEmptyComponent,
|
|
32
|
+
renderScrollComponent,
|
|
33
|
+
refreshing,
|
|
34
|
+
progressViewOffset,
|
|
35
|
+
onRefresh,
|
|
36
|
+
data,
|
|
37
|
+
refreshControl: customRefreshControl,
|
|
38
|
+
} = props;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Creates the refresh control component if onRefresh is provided.
|
|
42
|
+
*/
|
|
43
|
+
const refreshControl = useMemo(() => {
|
|
44
|
+
if (customRefreshControl) {
|
|
45
|
+
return customRefreshControl;
|
|
46
|
+
} else if (onRefresh) {
|
|
47
|
+
return (
|
|
48
|
+
<RefreshControl
|
|
49
|
+
refreshing={Boolean(refreshing)}
|
|
50
|
+
progressViewOffset={progressViewOffset}
|
|
51
|
+
onRefresh={onRefresh}
|
|
52
|
+
/>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}, [onRefresh, refreshing, progressViewOffset, customRefreshControl]);
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Creates the header component with optional styling.
|
|
60
|
+
*/
|
|
61
|
+
const renderHeader = useMemo(() => {
|
|
62
|
+
if (!ListHeaderComponent) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
return (
|
|
66
|
+
<CompatView style={ListHeaderComponentStyle}>
|
|
67
|
+
{getValidComponent(ListHeaderComponent)}
|
|
68
|
+
</CompatView>
|
|
69
|
+
);
|
|
70
|
+
}, [ListHeaderComponent, ListHeaderComponentStyle]);
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Creates the footer component with optional styling.
|
|
74
|
+
*/
|
|
75
|
+
const renderFooter = useMemo(() => {
|
|
76
|
+
if (!ListFooterComponent) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
return (
|
|
80
|
+
<CompatView style={ListFooterComponentStyle}>
|
|
81
|
+
{getValidComponent(ListFooterComponent)}
|
|
82
|
+
</CompatView>
|
|
83
|
+
);
|
|
84
|
+
}, [ListFooterComponent, ListFooterComponentStyle]);
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Creates the empty state component when there's no data.
|
|
88
|
+
* Only rendered when ListEmptyComponent is provided and data is empty.
|
|
89
|
+
*/
|
|
90
|
+
const renderEmpty = useMemo(() => {
|
|
91
|
+
if (!ListEmptyComponent || (data && data.length > 0)) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return getValidComponent(ListEmptyComponent);
|
|
95
|
+
}, [ListEmptyComponent, data]);
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Creates an animated scroll component based on the provided renderScrollComponent.
|
|
99
|
+
* If no custom component is provided, uses the default CompatAnimatedScroller.
|
|
100
|
+
*/
|
|
101
|
+
const CompatScrollView = useMemo(() => {
|
|
102
|
+
let scrollComponent = CompatAnimatedScroller;
|
|
103
|
+
if (typeof renderScrollComponent === "function") {
|
|
104
|
+
// Create a forwarded ref wrapper for the custom scroll component
|
|
105
|
+
const ForwardedScrollComponent = React.forwardRef((_props, ref) =>
|
|
106
|
+
(renderScrollComponent as any)({ ..._props, ref } as any)
|
|
107
|
+
);
|
|
108
|
+
ForwardedScrollComponent.displayName = "CustomScrollView";
|
|
109
|
+
scrollComponent = ForwardedScrollComponent as any;
|
|
110
|
+
} else if (renderScrollComponent) {
|
|
111
|
+
scrollComponent = renderScrollComponent;
|
|
112
|
+
}
|
|
113
|
+
// Wrap the scroll component with Animated.createAnimatedComponent
|
|
114
|
+
return Animated.createAnimatedComponent(scrollComponent);
|
|
115
|
+
}, [renderScrollComponent]);
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
refreshControl,
|
|
119
|
+
renderHeader,
|
|
120
|
+
renderFooter,
|
|
121
|
+
renderEmpty,
|
|
122
|
+
CompatScrollView,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hook that provides a setTimeout which is aware of component unmount state.
|
|
5
|
+
* Any timeouts created with this hook will be automatically cleared when the component unmounts.
|
|
6
|
+
*/
|
|
7
|
+
export function useUnmountAwareTimeout() {
|
|
8
|
+
// Store active timeout IDs in a Set for more efficient add/remove operations
|
|
9
|
+
const [timeoutIds] = useState<Set<NodeJS.Timeout>>(() => new Set());
|
|
10
|
+
|
|
11
|
+
// Clear all timeouts on unmount
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
return () => {
|
|
14
|
+
timeoutIds.forEach((id) => global.clearTimeout(id));
|
|
15
|
+
timeoutIds.clear();
|
|
16
|
+
};
|
|
17
|
+
}, [timeoutIds]);
|
|
18
|
+
|
|
19
|
+
// Create a safe setTimeout that will be cleared on unmount
|
|
20
|
+
const setTimeout = useCallback(
|
|
21
|
+
(callback: () => void, delay: number): void => {
|
|
22
|
+
const id = global.setTimeout(() => {
|
|
23
|
+
// Remove this timeout ID from the tracking set
|
|
24
|
+
timeoutIds.delete(id);
|
|
25
|
+
callback();
|
|
26
|
+
}, delay);
|
|
27
|
+
|
|
28
|
+
// Track this timeout ID
|
|
29
|
+
timeoutIds.add(id);
|
|
30
|
+
},
|
|
31
|
+
[timeoutIds]
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
setTimeout,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Hook that provides a requestAnimationFrame which is aware of component unmount state.
|
|
41
|
+
* Any animation frames requested with this hook will be automatically canceled when the component unmounts.
|
|
42
|
+
*/
|
|
43
|
+
export function useUnmountAwareAnimationFrame() {
|
|
44
|
+
// Store active animation frame request IDs in a Set for more efficient add/remove operations
|
|
45
|
+
const [requestIds] = useState<Set<number>>(() => new Set());
|
|
46
|
+
|
|
47
|
+
// Cancel all animation frame requests on unmount
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
return () => {
|
|
50
|
+
requestIds.forEach((id) => cancelAnimationFrame(id));
|
|
51
|
+
requestIds.clear();
|
|
52
|
+
};
|
|
53
|
+
}, [requestIds]);
|
|
54
|
+
|
|
55
|
+
// Create a safe requestAnimationFrame that will be canceled on unmount
|
|
56
|
+
const requestAnimationFrame = useCallback(
|
|
57
|
+
(callback: FrameRequestCallback): void => {
|
|
58
|
+
const id = global.requestAnimationFrame((timestamp) => {
|
|
59
|
+
// Remove this request ID from the tracking set
|
|
60
|
+
requestIds.delete(id);
|
|
61
|
+
callback(timestamp);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Track this request ID
|
|
65
|
+
requestIds.add(id);
|
|
66
|
+
},
|
|
67
|
+
[requestIds]
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
requestAnimationFrame,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useRef, useLayoutEffect } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hook that provides a way to track component unmounting state.
|
|
5
|
+
* This hook is particularly useful for preventing state updates or side effects
|
|
6
|
+
* after a component has unmounted, helping to avoid memory leaks and race conditions.
|
|
7
|
+
*
|
|
8
|
+
* @returns A ref containing a boolean flag that indicates whether the component is unmounted
|
|
9
|
+
* (true) or mounted (false)
|
|
10
|
+
*/
|
|
11
|
+
export const useUnmountFlag = () => {
|
|
12
|
+
// Create a ref to store the unmount state
|
|
13
|
+
// Using ref ensures the value persists between renders without causing re-renders
|
|
14
|
+
const isUnmounted = useRef(false);
|
|
15
|
+
|
|
16
|
+
// Use layoutEffect to set up cleanup on unmount
|
|
17
|
+
// This ensures the flag is set before any other cleanup effects run
|
|
18
|
+
useLayoutEffect(() => {
|
|
19
|
+
isUnmounted.current = false;
|
|
20
|
+
// Cleanup function that runs when the component unmounts
|
|
21
|
+
return () => {
|
|
22
|
+
isUnmounted.current = true;
|
|
23
|
+
};
|
|
24
|
+
}, []);
|
|
25
|
+
|
|
26
|
+
return isUnmounted;
|
|
27
|
+
};
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LayoutParams,
|
|
3
|
+
RVDimension,
|
|
4
|
+
RVLayout,
|
|
5
|
+
RVLayoutInfo,
|
|
6
|
+
RVLayoutManager,
|
|
7
|
+
} from "./LayoutManager";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* GridLayoutManager implementation that arranges items in a grid pattern.
|
|
11
|
+
* Items are placed in rows and columns, with support for items spanning multiple columns.
|
|
12
|
+
*/
|
|
13
|
+
export class RVGridLayoutManagerImpl extends RVLayoutManager {
|
|
14
|
+
/** The width of the bounded area for the grid */
|
|
15
|
+
private boundedSize: number;
|
|
16
|
+
|
|
17
|
+
/** If there's a span change for grid layout, we need to recompute all the widths */
|
|
18
|
+
private fullRelayoutRequired = false;
|
|
19
|
+
|
|
20
|
+
constructor(params: LayoutParams, previousLayoutManager?: RVLayoutManager) {
|
|
21
|
+
super(params, previousLayoutManager);
|
|
22
|
+
this.boundedSize = params.windowSize.width;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Updates layout parameters and triggers recomputation if necessary.
|
|
27
|
+
* @param params New layout parameters
|
|
28
|
+
*/
|
|
29
|
+
updateLayoutParams(params: LayoutParams): void {
|
|
30
|
+
const prevNumColumns = this.maxColumns;
|
|
31
|
+
super.updateLayoutParams(params);
|
|
32
|
+
if (
|
|
33
|
+
this.boundedSize !== params.windowSize.width ||
|
|
34
|
+
prevNumColumns !== params.maxColumns
|
|
35
|
+
) {
|
|
36
|
+
this.boundedSize = params.windowSize.width;
|
|
37
|
+
if (this.layouts.length > 0) {
|
|
38
|
+
// update all widths
|
|
39
|
+
this.updateAllWidths();
|
|
40
|
+
|
|
41
|
+
this.recomputeLayouts(0, this.layouts.length - 1);
|
|
42
|
+
this.requiresRepaint = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Processes layout information for items, updating their dimensions.
|
|
49
|
+
* @param layoutInfo Array of layout information for items
|
|
50
|
+
* @param itemCount Total number of items in the list
|
|
51
|
+
*/
|
|
52
|
+
processLayoutInfo(layoutInfo: RVLayoutInfo[], itemCount: number) {
|
|
53
|
+
for (const info of layoutInfo) {
|
|
54
|
+
const { index, dimensions } = info;
|
|
55
|
+
const layout = this.layouts[index];
|
|
56
|
+
layout.height = dimensions.height;
|
|
57
|
+
layout.isHeightMeasured = true;
|
|
58
|
+
layout.isWidthMeasured = true;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// TODO: Can be optimized
|
|
62
|
+
if (this.fullRelayoutRequired) {
|
|
63
|
+
this.updateAllWidths();
|
|
64
|
+
this.fullRelayoutRequired = false;
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Estimates layout dimensions for an item at the given index.
|
|
71
|
+
* @param index Index of the item to estimate layout for
|
|
72
|
+
*/
|
|
73
|
+
estimateLayout(index: number) {
|
|
74
|
+
const layout = this.layouts[index];
|
|
75
|
+
layout.width = this.getWidth(index);
|
|
76
|
+
layout.height = this.getEstimatedHeight(index);
|
|
77
|
+
|
|
78
|
+
layout.isWidthMeasured = true;
|
|
79
|
+
layout.enforcedWidth = true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Handles span change for an item.
|
|
84
|
+
* @param index Index of the item
|
|
85
|
+
*/
|
|
86
|
+
handleSpanChange(index: number) {
|
|
87
|
+
this.fullRelayoutRequired = true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Returns the total size of the layout area.
|
|
92
|
+
* @returns RVDimension containing width and height of the layout
|
|
93
|
+
*/
|
|
94
|
+
getLayoutSize(): RVDimension {
|
|
95
|
+
if (this.layouts.length === 0) return { width: 0, height: 0 };
|
|
96
|
+
const totalHeight = this.computeTotalHeightTillRow(this.layouts.length - 1);
|
|
97
|
+
return {
|
|
98
|
+
width: this.boundedSize,
|
|
99
|
+
height: totalHeight,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Recomputes layouts for items in the given range.
|
|
105
|
+
* @param startIndex Starting index of items to recompute
|
|
106
|
+
* @param endIndex Ending index of items to recompute
|
|
107
|
+
*/
|
|
108
|
+
recomputeLayouts(startIndex: number, endIndex: number): void {
|
|
109
|
+
const newStartIndex = this.locateFirstIndexInRow(
|
|
110
|
+
Math.max(0, startIndex - 1)
|
|
111
|
+
);
|
|
112
|
+
const startVal = this.getLayout(newStartIndex);
|
|
113
|
+
|
|
114
|
+
let startX = startVal.x;
|
|
115
|
+
let startY = startVal.y;
|
|
116
|
+
|
|
117
|
+
for (let i = newStartIndex; i <= endIndex; i++) {
|
|
118
|
+
const layout = this.getLayout(i);
|
|
119
|
+
if (!this.checkBounds(startX, layout.width)) {
|
|
120
|
+
const tallestItem = this.processAndReturnTallestItemInRow(i - 1);
|
|
121
|
+
startY = tallestItem.y + tallestItem.height;
|
|
122
|
+
startX = 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
layout.x = startX;
|
|
126
|
+
layout.y = startY;
|
|
127
|
+
startX += layout.width;
|
|
128
|
+
}
|
|
129
|
+
if (endIndex === this.layouts.length - 1) {
|
|
130
|
+
this.processAndReturnTallestItemInRow(endIndex);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Calculates the width of an item based on its span.
|
|
136
|
+
* @param index Index of the item
|
|
137
|
+
* @returns Width of the item
|
|
138
|
+
*/
|
|
139
|
+
private getWidth(index: number): number {
|
|
140
|
+
return (this.boundedSize / this.maxColumns) * this.getSpan(index);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Processes items in a row and returns the tallest item.
|
|
145
|
+
* Also handles height normalization for items in the same row.
|
|
146
|
+
* Tallest item per row helps in forcing tallest items height on neighbouring items.
|
|
147
|
+
* @param endIndex Index of the last item in the row
|
|
148
|
+
* @returns The tallest item in the row
|
|
149
|
+
*/
|
|
150
|
+
private processAndReturnTallestItemInRow(endIndex: number): RVLayout {
|
|
151
|
+
const startIndex = this.locateFirstIndexInRow(endIndex);
|
|
152
|
+
let tallestItem: RVLayout | undefined;
|
|
153
|
+
let maxHeight = 0;
|
|
154
|
+
let i = startIndex;
|
|
155
|
+
let isMeasured = false;
|
|
156
|
+
while (i <= endIndex) {
|
|
157
|
+
const layout = this.layouts[i];
|
|
158
|
+
isMeasured = isMeasured || Boolean(layout.isHeightMeasured);
|
|
159
|
+
maxHeight = Math.max(maxHeight, layout.height);
|
|
160
|
+
if (
|
|
161
|
+
layout.height > (layout.minHeight ?? 0) &&
|
|
162
|
+
layout.height > (tallestItem?.height ?? 0)
|
|
163
|
+
) {
|
|
164
|
+
tallestItem = layout;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
i++;
|
|
168
|
+
if (i >= this.layouts.length) {
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (!tallestItem && maxHeight > 0) {
|
|
173
|
+
maxHeight = Number.MAX_SAFE_INTEGER;
|
|
174
|
+
}
|
|
175
|
+
tallestItem = tallestItem ?? this.layouts[startIndex];
|
|
176
|
+
|
|
177
|
+
if (!isMeasured) {
|
|
178
|
+
return tallestItem;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (tallestItem) {
|
|
182
|
+
let targetHeight = tallestItem.height;
|
|
183
|
+
if (maxHeight - tallestItem.height > 1) {
|
|
184
|
+
targetHeight = 0;
|
|
185
|
+
this.requiresRepaint = true;
|
|
186
|
+
}
|
|
187
|
+
i = startIndex;
|
|
188
|
+
while (i <= endIndex) {
|
|
189
|
+
this.layouts[i].minHeight = targetHeight;
|
|
190
|
+
if (targetHeight > 0) {
|
|
191
|
+
this.layouts[i].height = targetHeight;
|
|
192
|
+
}
|
|
193
|
+
i++;
|
|
194
|
+
if (i >= this.layouts.length) {
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
tallestItem.minHeight = 0;
|
|
199
|
+
}
|
|
200
|
+
return tallestItem;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Computes the total height of the layout.
|
|
205
|
+
* @param endIndex Index of the last item in the row
|
|
206
|
+
* @returns Total height of the layout
|
|
207
|
+
*/
|
|
208
|
+
private computeTotalHeightTillRow(endIndex: number): number {
|
|
209
|
+
const startIndex = this.locateFirstIndexInRow(endIndex);
|
|
210
|
+
const y = this.layouts[startIndex].y;
|
|
211
|
+
let maxHeight = 0;
|
|
212
|
+
let i = startIndex;
|
|
213
|
+
while (i <= endIndex) {
|
|
214
|
+
maxHeight = Math.max(maxHeight, this.layouts[i].height);
|
|
215
|
+
i++;
|
|
216
|
+
if (i >= this.layouts.length) {
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return y + maxHeight;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
private updateAllWidths() {
|
|
224
|
+
for (let i = 0; i < this.layouts.length; i++) {
|
|
225
|
+
this.layouts[i].width = this.getWidth(i);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Checks if an item can fit within the bounded width.
|
|
231
|
+
* @param itemX Starting X position of the item
|
|
232
|
+
* @param width Width of the item
|
|
233
|
+
* @returns True if the item fits within bounds
|
|
234
|
+
*/
|
|
235
|
+
private checkBounds(itemX: number, width: number): boolean {
|
|
236
|
+
return itemX + width <= this.boundedSize + 0.9;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Locates the index of the first item in the current row.
|
|
241
|
+
* @param itemIndex Index to start searching from
|
|
242
|
+
* @returns Index of the first item in the row
|
|
243
|
+
*/
|
|
244
|
+
private locateFirstIndexInRow(itemIndex: number): number {
|
|
245
|
+
if (itemIndex === 0) {
|
|
246
|
+
return 0;
|
|
247
|
+
}
|
|
248
|
+
let i = itemIndex;
|
|
249
|
+
for (; i >= 0; i--) {
|
|
250
|
+
if (this.layouts[i].x === 0) {
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return Math.max(i, 0);
|
|
255
|
+
}
|
|
256
|
+
}
|