@ja-ka/react-native-fade-in-flatlist
Version:
An advanced React Native FlatList component with fade-in support for rendered items.
58 lines (57 loc) • 2.91 kB
JavaScript
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import React, { useCallback, useEffect, useRef } from 'react';
import { Animated, Easing, FlatList } from 'react-native';
const FadeInFlatList = React.forwardRef((_a, ref) => {
var { itemsToFadeIn = 10, initialDelay = 0, durationPerItem = 50, parallelItems = 1, renderItem: originalRenderItem, ItemSeparatorComponent } = _a, props = __rest(_a, ["itemsToFadeIn", "initialDelay", "durationPerItem", "parallelItems", "renderItem", "ItemSeparatorComponent"]);
const value = useRef(new Animated.Value(0));
const FadeInComponent = useCallback(({ index, children }) => {
const moveBy = (1 - 1 / parallelItems) * index;
return (<Animated.View style={{
opacity: value.current.interpolate({
inputRange: [
index - 1 - moveBy,
index - moveBy,
index + 1 - moveBy,
index + 2 - moveBy,
],
outputRange: [0, 0, 1, 1],
extrapolate: 'clamp',
}),
}}>
{children}
</Animated.View>);
}, []);
const Separator = useCallback(({ index }) => ItemSeparatorComponent && index !== undefined ? (<FadeInComponent index={index}>
<ItemSeparatorComponent />
</FadeInComponent>) : ItemSeparatorComponent ? (<ItemSeparatorComponent />) : null, []);
const Item = useCallback(({ info }) => {
useEffect(() => {
info.separators.updateProps('leading', { index: info.index });
}, []);
// @ts-expect-error ts(2322)
return <FadeInComponent index={info.index}>{originalRenderItem(info)}</FadeInComponent>;
}, []);
const renderItem = useCallback((info) => info.index < itemsToFadeIn ? <Item info={info}/> : originalRenderItem(info), [originalRenderItem, itemsToFadeIn]);
useEffect(() => {
value.current.setValue(0);
Animated.timing(value.current, {
toValue: itemsToFadeIn + 1,
useNativeDriver: true,
delay: initialDelay,
duration: itemsToFadeIn * durationPerItem,
easing: Easing.linear,
}).start();
}, [initialDelay, durationPerItem, itemsToFadeIn]);
return (<FlatList {...props} ref={ref} renderItem={renderItem} ItemSeparatorComponent={ItemSeparatorComponent ? Separator : null}/>);
});
export default FadeInFlatList;