1*5500cea7S猫头猫import React, {useCallback} from 'react'; 295c9734fS猫头猫import {FlatListProps} from 'react-native'; 3378a6099S猫头猫import rpx from '@/utils/rpx'; 4378a6099S猫头猫 5a3b33415S猫头猫import MusicItem from '../mediaItem/musicItem'; 67d7e864fS猫头猫import Empty from '../base/empty'; 795c9734fS猫头猫import {FlashList} from '@shopify/flash-list'; 8f9afcc0dS猫头猫import ListLoading from '../base/listLoading'; 9f9afcc0dS猫头猫import ListReachEnd from '../base/listReachEnd'; 10*5500cea7S猫头猫import TrackPlayer from '@/core/trackPlayer'; 11378a6099S猫头猫 12378a6099S猫头猫interface IMusicListProps { 13378a6099S猫头猫 /** 顶部 */ 14378a6099S猫头猫 Header?: FlatListProps<IMusic.IMusicItem>['ListHeaderComponent']; 15378a6099S猫头猫 /** 音乐列表 */ 16378a6099S猫头猫 musicList?: IMusic.IMusicItem[]; 17378a6099S猫头猫 /** 所在歌单 */ 18378a6099S猫头猫 musicSheet?: IMusic.IMusicSheetItem; 19378a6099S猫头猫 /** 是否展示序号 */ 20378a6099S猫头猫 showIndex?: boolean; 219e24e067S猫头猫 /** 点击 */ 22cbb92902S猫头猫 onItemPress?: ( 23cbb92902S猫头猫 musicItem: IMusic.IMusicItem, 24cbb92902S猫头猫 musicList?: IMusic.IMusicItem[], 25cbb92902S猫头猫 ) => void; 26ceb900cdS猫头猫 loadMore?: 'loading' | 'done' | 'idle'; 27f9afcc0dS猫头猫 onEndReached?: () => void; 28378a6099S猫头猫} 2945510a04S猫头猫const ITEM_HEIGHT = rpx(120); 30be539549S猫头猫 31be539549S猫头猫/** 音乐列表 */ 32378a6099S猫头猫export default function MusicList(props: IMusicListProps) { 33f9afcc0dS猫头猫 const { 34f9afcc0dS猫头猫 Header, 35f9afcc0dS猫头猫 musicList, 36f9afcc0dS猫头猫 musicSheet, 37f9afcc0dS猫头猫 showIndex, 38f9afcc0dS猫头猫 onItemPress, 39f9afcc0dS猫头猫 onEndReached, 40ceb900cdS猫头猫 loadMore = 'idle', 41f9afcc0dS猫头猫 } = props; 42378a6099S猫头猫 43*5500cea7S猫头猫 const keyExtractor = useCallback( 44*5500cea7S猫头猫 (item: any, i: number) => `${i}-${item.platform}-${item.id}`, 45*5500cea7S猫头猫 [], 46*5500cea7S猫头猫 ); 47*5500cea7S猫头猫 48378a6099S猫头猫 return ( 4995c9734fS猫头猫 <FlashList 50378a6099S猫头猫 ListHeaderComponent={Header} 515830c002S猫头猫 ListEmptyComponent={loadMore !== 'loading' ? Empty : null} 52f9afcc0dS猫头猫 ListFooterComponent={ 53f9afcc0dS猫头猫 loadMore === 'done' 54f9afcc0dS猫头猫 ? ListReachEnd 55f9afcc0dS猫头猫 : loadMore === 'loading' 56f9afcc0dS猫头猫 ? ListLoading 57f9afcc0dS猫头猫 : null 58f9afcc0dS猫头猫 } 59378a6099S猫头猫 data={musicList ?? []} 60*5500cea7S猫头猫 keyExtractor={keyExtractor} 6195c9734fS猫头猫 estimatedItemSize={ITEM_HEIGHT} 62378a6099S猫头猫 renderItem={({index, item: musicItem}) => { 63378a6099S猫头猫 return ( 643a76c6afS猫头猫 <MusicItem 653a76c6afS猫头猫 musicItem={musicItem} 663a76c6afS猫头猫 index={showIndex ? index + 1 : undefined} 673a76c6afS猫头猫 onItemPress={() => { 689e24e067S猫头猫 if (onItemPress) { 69cbb92902S猫头猫 onItemPress(musicItem, musicList); 709e24e067S猫头猫 } else { 71*5500cea7S猫头猫 TrackPlayer.playWithReplacePlayList( 724060c00aS猫头猫 musicItem, 73*5500cea7S猫头猫 musicList ?? [musicItem], 744060c00aS猫头猫 ); 75378a6099S猫头猫 } 769e24e067S猫头猫 }} 774060c00aS猫头猫 musicSheet={musicSheet} 784060c00aS猫头猫 /> 79378a6099S猫头猫 ); 804060c00aS猫头猫 }} 81f9afcc0dS猫头猫 onEndReached={() => { 82f9afcc0dS猫头猫 if (loadMore !== 'loading') { 83f9afcc0dS猫头猫 onEndReached?.(); 84f9afcc0dS猫头猫 } 85f9afcc0dS猫头猫 }} 86f9afcc0dS猫头猫 onEndReachedThreshold={0.1} 874060c00aS猫头猫 /> 88378a6099S猫头猫 ); 89378a6099S猫头猫} 90