UNPKG

@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
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;