xref: /MusicFree/src/components/musicList/index.tsx (revision 4060c00a75883036bbd315fb25c90065209312b3)
1378a6099S猫头猫import React from 'react';
2caaa811bS猫头猫import {FlatListProps, StyleSheet} from 'react-native';
3378a6099S猫头猫import rpx from '@/utils/rpx';
4242960d3S猫头猫import MusicQueue from '@/core/musicQueue';
5378a6099S猫头猫import {FlatList} from 'react-native-gesture-handler';
6378a6099S猫头猫
7a3b33415S猫头猫import MusicItem from '../mediaItem/musicItem';
8378a6099S猫头猫
9378a6099S猫头猫interface IMusicListProps {
10378a6099S猫头猫    /** 顶部 */
11378a6099S猫头猫    Header?: FlatListProps<IMusic.IMusicItem>['ListHeaderComponent'];
12378a6099S猫头猫    /** 音乐列表 */
13378a6099S猫头猫    musicList?: IMusic.IMusicItem[];
14378a6099S猫头猫    /** 所在歌单 */
15378a6099S猫头猫    musicSheet?: IMusic.IMusicSheetItem;
16378a6099S猫头猫    /** 是否展示序号 */
17378a6099S猫头猫    showIndex?: boolean;
189e24e067S猫头猫    /** 点击 */
199e24e067S猫头猫    onItemPress?: (musicItem: IMusic.IMusicItem) => void;
20378a6099S猫头猫}
2145510a04S猫头猫const ITEM_HEIGHT = rpx(120);
22378a6099S猫头猫export default function MusicList(props: IMusicListProps) {
239e24e067S猫头猫    const {Header, musicList, musicSheet, showIndex, onItemPress} = props;
24378a6099S猫头猫
25378a6099S猫头猫    return (
26378a6099S猫头猫        <FlatList
27378a6099S猫头猫            style={style.wrapper}
28378a6099S猫头猫            ListHeaderComponent={Header}
29378a6099S猫头猫            data={musicList ?? []}
30*4060c00aS猫头猫            keyExtractor={musicItem =>
31*4060c00aS猫头猫                `ml-${musicItem.id}${musicItem.platform}`
32*4060c00aS猫头猫            }
3345510a04S猫头猫            getItemLayout={(_, index) => ({
3445510a04S猫头猫                length: ITEM_HEIGHT,
3545510a04S猫头猫                offset: ITEM_HEIGHT * index,
3645510a04S猫头猫                index,
3745510a04S猫头猫            })}
38378a6099S猫头猫            renderItem={({index, item: musicItem}) => {
39378a6099S猫头猫                return (
403a76c6afS猫头猫                    <MusicItem
413a76c6afS猫头猫                        musicItem={musicItem}
423a76c6afS猫头猫                        index={showIndex ? index + 1 : undefined}
433a76c6afS猫头猫                        onItemPress={() => {
449e24e067S猫头猫                            if (onItemPress) {
459e24e067S猫头猫                                onItemPress(musicItem);
469e24e067S猫头猫                            } else {
47*4060c00aS猫头猫                                MusicQueue.playWithReplaceQueue(
48*4060c00aS猫头猫                                    musicItem,
49*4060c00aS猫头猫                                    musicList ?? [],
50*4060c00aS猫头猫                                );
51378a6099S猫头猫                            }
529e24e067S猫头猫                        }}
53*4060c00aS猫头猫                        musicSheet={musicSheet}
54*4060c00aS猫头猫                    />
55378a6099S猫头猫                );
56*4060c00aS猫头猫            }}
57*4060c00aS猫头猫        />
58378a6099S猫头猫    );
59378a6099S猫头猫}
60378a6099S猫头猫
61378a6099S猫头猫const style = StyleSheet.create({
62378a6099S猫头猫    wrapper: {
63378a6099S猫头猫        width: rpx(750),
64378a6099S猫头猫    },
65378a6099S猫头猫});
66