1import React from 'react'; 2import {FlatListProps, StyleSheet} from 'react-native'; 3import rpx from '@/utils/rpx'; 4import MusicQueue from '@/core/musicQueue'; 5import {FlatList} from 'react-native-gesture-handler'; 6 7import MusicItem from '../mediaItem/musicItem'; 8import Empty from '../base/empty'; 9 10interface IMusicListProps { 11 /** 顶部 */ 12 Header?: FlatListProps<IMusic.IMusicItem>['ListHeaderComponent']; 13 /** 音乐列表 */ 14 musicList?: IMusic.IMusicItem[]; 15 /** 所在歌单 */ 16 musicSheet?: IMusic.IMusicSheetItem; 17 /** 是否展示序号 */ 18 showIndex?: boolean; 19 /** 点击 */ 20 onItemPress?: ( 21 musicItem: IMusic.IMusicItem, 22 musicList?: IMusic.IMusicItem[], 23 ) => void; 24} 25const ITEM_HEIGHT = rpx(120); 26 27/** 音乐列表 */ 28export default function MusicList(props: IMusicListProps) { 29 const {Header, musicList, musicSheet, showIndex, onItemPress} = props; 30 31 return ( 32 <FlatList 33 style={style.wrapper} 34 ListHeaderComponent={Header} 35 ListEmptyComponent={Empty} 36 data={musicList ?? []} 37 keyExtractor={musicItem => 38 `ml-${musicItem.id}${musicItem.platform}` 39 } 40 getItemLayout={(_, index) => ({ 41 length: ITEM_HEIGHT, 42 offset: ITEM_HEIGHT * index, 43 index, 44 })} 45 renderItem={({index, item: musicItem}) => { 46 return ( 47 <MusicItem 48 musicItem={musicItem} 49 index={showIndex ? index + 1 : undefined} 50 onItemPress={() => { 51 if (onItemPress) { 52 onItemPress(musicItem, musicList); 53 } else { 54 MusicQueue.playWithReplaceQueue( 55 musicItem, 56 musicList ?? [], 57 ); 58 } 59 }} 60 musicSheet={musicSheet} 61 /> 62 ); 63 }} 64 /> 65 ); 66} 67 68const style = StyleSheet.create({ 69 wrapper: { 70 width: rpx(750), 71 }, 72}); 73