1*740e3947S猫头猫import React 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'; 105500cea7S猫头猫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*740e3947S猫头猫 // ! keyExtractor需要保证整个生命周期统一? 有些奇怪 44*740e3947S猫头猫 // const keyExtractor = useCallback( 45*740e3947S猫头猫 // (item: any, index: number) => 46*740e3947S猫头猫 // '' + index + '-' + item.platform + '-' + item.id, 47*740e3947S猫头猫 // [], 48*740e3947S猫头猫 // ); 495500cea7S猫头猫 50378a6099S猫头猫 return ( 5195c9734fS猫头猫 <FlashList 52378a6099S猫头猫 ListHeaderComponent={Header} 535830c002S猫头猫 ListEmptyComponent={loadMore !== 'loading' ? Empty : null} 54f9afcc0dS猫头猫 ListFooterComponent={ 55f9afcc0dS猫头猫 loadMore === 'done' 56f9afcc0dS猫头猫 ? ListReachEnd 57f9afcc0dS猫头猫 : loadMore === 'loading' 58f9afcc0dS猫头猫 ? ListLoading 59f9afcc0dS猫头猫 : null 60f9afcc0dS猫头猫 } 61378a6099S猫头猫 data={musicList ?? []} 62*740e3947S猫头猫 // keyExtractor={keyExtractor} 6395c9734fS猫头猫 estimatedItemSize={ITEM_HEIGHT} 64378a6099S猫头猫 renderItem={({index, item: musicItem}) => { 65378a6099S猫头猫 return ( 663a76c6afS猫头猫 <MusicItem 673a76c6afS猫头猫 musicItem={musicItem} 683a76c6afS猫头猫 index={showIndex ? index + 1 : undefined} 693a76c6afS猫头猫 onItemPress={() => { 709e24e067S猫头猫 if (onItemPress) { 71cbb92902S猫头猫 onItemPress(musicItem, musicList); 729e24e067S猫头猫 } else { 735500cea7S猫头猫 TrackPlayer.playWithReplacePlayList( 744060c00aS猫头猫 musicItem, 755500cea7S猫头猫 musicList ?? [musicItem], 764060c00aS猫头猫 ); 77378a6099S猫头猫 } 789e24e067S猫头猫 }} 794060c00aS猫头猫 musicSheet={musicSheet} 804060c00aS猫头猫 /> 81378a6099S猫头猫 ); 824060c00aS猫头猫 }} 83f9afcc0dS猫头猫 onEndReached={() => { 84f9afcc0dS猫头猫 if (loadMore !== 'loading') { 85f9afcc0dS猫头猫 onEndReached?.(); 86f9afcc0dS猫头猫 } 87f9afcc0dS猫头猫 }} 88f9afcc0dS猫头猫 onEndReachedThreshold={0.1} 894060c00aS猫头猫 /> 90378a6099S猫头猫 ); 91378a6099S猫头猫} 92