react-native#FlatListProps TypeScript Examples
The following examples show how to use
react-native#FlatListProps.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: index.tsx From react-native-scroll-bottom-sheet with MIT License | 5 votes |
private scrollComponent: React.ComponentType<
FlatListProps<T> | ScrollViewProps | SectionListProps<T>
>;
Example #2
Source File: InstagramFeed.tsx From react-native-gallery-toolkit with MIT License | 5 votes |
export default function InstagramFeed() {
const scrollViewRef = useRef<ScrollView | null>(null);
const activeItemIndex = useSharedValue(-1);
const { controlsStyles, setControlsHidden } = useControls();
const CellRendererComponent = useMemo<
FlatListProps<ListItemT>['CellRendererComponent']
>(
() => ({ children, index, style, ...props }) => {
const animatedStyles = useAnimatedStyle(() => {
const isActive =
activeItemIndex.value !== -1 &&
activeItemIndex.value === index;
return {
zIndex: isActive ? 1 : 0,
};
});
return (
<Animated.View {...props} style={animatedStyles}>
{children}
</Animated.View>
);
},
[],
);
return (
<>
<FlatList
contentContainerStyle={{
// paddingTop: APPBAR_HEIGHT + STATUSBAR_HEIGHT,
}}
initialNumToRender={2}
maxToRenderPerBatch={2}
data={data}
keyExtractor={({ id }) => id}
renderItem={(item) => (
<RenderItem
{...item}
scrollViewRef={scrollViewRef}
activeItemIndex={activeItemIndex}
setControlsHidden={setControlsHidden}
/>
)}
renderScrollComponent={(props) => (
// @ts-ignore
<ScrollView {...props} ref={scrollViewRef} />
)}
CellRendererComponent={CellRendererComponent}
/>
<Animated.View style={controlsStyles}>
<DetachedHeader.Container>
<DetachedHeader />
</DetachedHeader.Container>
</Animated.View>
</>
);
}
Example #3
Source File: index.tsx From jellyfin-audio-player with MIT License | 4 votes |
function Downloads() {
const defaultStyles = useDefaultStyles();
const dispatch = useAppDispatch();
const getImage = useGetImage();
const { entities, ids } = useTypedSelector((state) => state.downloads);
const tracks = useTypedSelector((state) => state.music.tracks.entities);
// Calculate the total download size
const totalDownloadSize = useMemo(() => (
ids?.reduce<number>((sum, id) => sum + (entities[id]?.size || 0), 0)
), [ids, entities]);
/**
* Handlers for actions in this components
*/
// Delete a single downloaded track
const handleDelete = useCallback((id: EntityId) => {
dispatch(removeDownloadedTrack(id));
}, [dispatch]);
// Delete all downloaded tracks
const handleDeleteAllTracks = useCallback(() => ids.forEach(handleDelete), [handleDelete, ids]);
// Retry a single failed track
const retryTrack = useCallback((id: EntityId) => {
dispatch(queueTrackForDownload(id));
}, [dispatch]);
// Retry all failed tracks
const failedIds = useMemo(() => ids.filter((id) => !entities[id]?.isComplete), [ids, entities]);
const handleRetryFailed = useCallback(() => (
failedIds.forEach(retryTrack)
), [failedIds, retryTrack]);
/**
* Render section
*/
const ListHeaderComponent = useMemo(() => (
<View style={[{ paddingHorizontal: 20, paddingBottom: 12, borderBottomWidth: 0.5 }, defaultStyles.border]}>
<View style={{ flexDirection: 'row', alignItems: 'center' }}>
<Text
style={[
defaultStyles.textHalfOpacity,
{ marginRight: 8, flex: 1, fontSize: 12 },
]}
numberOfLines={1}
>
{t('total-download-size')}: {formatBytes(totalDownloadSize)}
</Text>
<Button
icon={TrashIcon}
title={t('delete-all-tracks')}
onPress={handleDeleteAllTracks}
disabled={!ids.length}
size="small"
/>
</View>
{failedIds.length > 0 && (
<Button
icon={ArrowClockwise}
title={t('retry-failed-downloads')}
onPress={handleRetryFailed}
disabled={failedIds.length === 0}
style={{ marginTop: 4 }}
/>
)}
</View>
), [totalDownloadSize, defaultStyles, failedIds.length, handleRetryFailed, handleDeleteAllTracks, ids.length]);
const renderItem = useCallback<NonNullable<FlatListProps<EntityId>['renderItem']>>(({ item }) => (
<DownloadedTrack>
<View style={{ marginRight: 12 }}>
<ShadowWrapper size="small">
<AlbumImage source={{ uri: getImage(item as string) }} style={defaultStyles.imageBackground} />
</ShadowWrapper>
</View>
<View style={{ flexShrink: 1, marginRight: 8 }}>
<Text style={[{ fontSize: 16, marginBottom: 4 }, defaultStyles.text]} numberOfLines={1}>
{tracks[item]?.Name}
</Text>
<Text style={[{ flexShrink: 1, fontSize: 11 }, defaultStyles.textHalfOpacity]} numberOfLines={1}>
{tracks[item]?.AlbumArtist} {tracks[item]?.Album ? `— ${tracks[item]?.Album}` : ''}
</Text>
</View>
<View style={{ marginLeft: 'auto', flexDirection: 'row', alignItems: 'center' }}>
{entities[item]?.isComplete && entities[item]?.size ? (
<Text style={[defaultStyles.textQuarterOpacity, { marginRight: 12, fontSize: 12 }]}>
{formatBytes(entities[item]?.size || 0)}
</Text>
) : null}
<View style={{ marginRight: 12 }}>
<DownloadIcon trackId={item} />
</View>
<Button onPress={() => handleDelete(item)} size="small" icon={TrashIcon} />
{!entities[item]?.isComplete && (
<Button onPress={() => retryTrack(item)} size="small" icon={ArrowClockwise} style={{ marginLeft: 4 }} />
)}
</View>
</DownloadedTrack>
), [entities, retryTrack, handleDelete, defaultStyles, tracks, getImage]);
// If no tracks have been downloaded, show a short message describing this
if (!ids.length) {
return (
<View style={{ margin: 24, flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text style={[{ textAlign: 'center'}, defaultStyles.textHalfOpacity]}>
{t('no-downloads')}
</Text>
</View>
);
}
return (
<SafeAreaView style={{ flex: 1 }}>
{ListHeaderComponent}
<FlatList
data={ids}
style={{ flex: 1, paddingTop: 12 }}
contentContainerStyle={{ flexGrow: 1 }}
renderItem={renderItem}
/>
</SafeAreaView>
);
}