xref: /MusicFree/src/components/musicList/index.tsx (revision cbb92902e6fecc4567623639197e1ff614356d18)
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猫头猫    /** 点击 */
19*cbb92902S猫头猫    onItemPress?: (
20*cbb92902S猫头猫        musicItem: IMusic.IMusicItem,
21*cbb92902S猫头猫        musicList?: IMusic.IMusicItem[],
22*cbb92902S猫头猫    ) => void;
23378a6099S猫头猫}
2445510a04S猫头猫const ITEM_HEIGHT = rpx(120);
25378a6099S猫头猫export default function MusicList(props: IMusicListProps) {
269e24e067S猫头猫    const {Header, musicList, musicSheet, showIndex, onItemPress} = props;
27378a6099S猫头猫
28378a6099S猫头猫    return (
29378a6099S猫头猫        <FlatList
30378a6099S猫头猫            style={style.wrapper}
31378a6099S猫头猫            ListHeaderComponent={Header}
32378a6099S猫头猫            data={musicList ?? []}
334060c00aS猫头猫            keyExtractor={musicItem =>
344060c00aS猫头猫                `ml-${musicItem.id}${musicItem.platform}`
354060c00aS猫头猫            }
3645510a04S猫头猫            getItemLayout={(_, index) => ({
3745510a04S猫头猫                length: ITEM_HEIGHT,
3845510a04S猫头猫                offset: ITEM_HEIGHT * index,
3945510a04S猫头猫                index,
4045510a04S猫头猫            })}
41378a6099S猫头猫            renderItem={({index, item: musicItem}) => {
42378a6099S猫头猫                return (
433a76c6afS猫头猫                    <MusicItem
443a76c6afS猫头猫                        musicItem={musicItem}
453a76c6afS猫头猫                        index={showIndex ? index + 1 : undefined}
463a76c6afS猫头猫                        onItemPress={() => {
479e24e067S猫头猫                            if (onItemPress) {
48*cbb92902S猫头猫                                onItemPress(musicItem, musicList);
499e24e067S猫头猫                            } else {
504060c00aS猫头猫                                MusicQueue.playWithReplaceQueue(
514060c00aS猫头猫                                    musicItem,
524060c00aS猫头猫                                    musicList ?? [],
534060c00aS猫头猫                                );
54378a6099S猫头猫                            }
559e24e067S猫头猫                        }}
564060c00aS猫头猫                        musicSheet={musicSheet}
574060c00aS猫头猫                    />
58378a6099S猫头猫                );
594060c00aS猫头猫            }}
604060c00aS猫头猫        />
61378a6099S猫头猫    );
62378a6099S猫头猫}
63378a6099S猫头猫
64378a6099S猫头猫const style = StyleSheet.create({
65378a6099S猫头猫    wrapper: {
66378a6099S猫头猫        width: rpx(750),
67378a6099S猫头猫    },
68378a6099S猫头猫});
69