xref: /MusicFree/src/components/musicList/index.tsx (revision f9afcc0d02c058f568e43dc501a8b0e6dbce15c6)
1378a6099S猫头猫import React from 'react';
295c9734fS猫头猫import {FlatListProps} from 'react-native';
3378a6099S猫头猫import rpx from '@/utils/rpx';
4242960d3S猫头猫import MusicQueue from '@/core/musicQueue';
5378a6099S猫头猫
6a3b33415S猫头猫import MusicItem from '../mediaItem/musicItem';
77d7e864fS猫头猫import Empty from '../base/empty';
895c9734fS猫头猫import {FlashList} from '@shopify/flash-list';
9*f9afcc0dS猫头猫import ListLoading from '../base/listLoading';
10*f9afcc0dS猫头猫import ListReachEnd from '../base/listReachEnd';
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;
26*f9afcc0dS猫头猫    loadMore?: 'loading' | 'done' | 'none';
27*f9afcc0dS猫头猫    onEndReached?: () => void;
28378a6099S猫头猫}
2945510a04S猫头猫const ITEM_HEIGHT = rpx(120);
30be539549S猫头猫
31be539549S猫头猫/** 音乐列表 */
32378a6099S猫头猫export default function MusicList(props: IMusicListProps) {
33*f9afcc0dS猫头猫    const {
34*f9afcc0dS猫头猫        Header,
35*f9afcc0dS猫头猫        musicList,
36*f9afcc0dS猫头猫        musicSheet,
37*f9afcc0dS猫头猫        showIndex,
38*f9afcc0dS猫头猫        onItemPress,
39*f9afcc0dS猫头猫        onEndReached,
40*f9afcc0dS猫头猫        loadMore = 'none',
41*f9afcc0dS猫头猫    } = props;
42378a6099S猫头猫
43378a6099S猫头猫    return (
4495c9734fS猫头猫        <FlashList
45378a6099S猫头猫            ListHeaderComponent={Header}
467d7e864fS猫头猫            ListEmptyComponent={Empty}
47*f9afcc0dS猫头猫            ListFooterComponent={
48*f9afcc0dS猫头猫                loadMore === 'done'
49*f9afcc0dS猫头猫                    ? ListReachEnd
50*f9afcc0dS猫头猫                    : loadMore === 'loading'
51*f9afcc0dS猫头猫                    ? ListLoading
52*f9afcc0dS猫头猫                    : null
53*f9afcc0dS猫头猫            }
54378a6099S猫头猫            data={musicList ?? []}
554060c00aS猫头猫            keyExtractor={musicItem =>
564060c00aS猫头猫                `ml-${musicItem.id}${musicItem.platform}`
574060c00aS猫头猫            }
5895c9734fS猫头猫            estimatedItemSize={ITEM_HEIGHT}
59378a6099S猫头猫            renderItem={({index, item: musicItem}) => {
60378a6099S猫头猫                return (
613a76c6afS猫头猫                    <MusicItem
623a76c6afS猫头猫                        musicItem={musicItem}
633a76c6afS猫头猫                        index={showIndex ? index + 1 : undefined}
643a76c6afS猫头猫                        onItemPress={() => {
659e24e067S猫头猫                            if (onItemPress) {
66cbb92902S猫头猫                                onItemPress(musicItem, musicList);
679e24e067S猫头猫                            } else {
684060c00aS猫头猫                                MusicQueue.playWithReplaceQueue(
694060c00aS猫头猫                                    musicItem,
704060c00aS猫头猫                                    musicList ?? [],
714060c00aS猫头猫                                );
72378a6099S猫头猫                            }
739e24e067S猫头猫                        }}
744060c00aS猫头猫                        musicSheet={musicSheet}
754060c00aS猫头猫                    />
76378a6099S猫头猫                );
774060c00aS猫头猫            }}
78*f9afcc0dS猫头猫            onEndReached={() => {
79*f9afcc0dS猫头猫                if (loadMore !== 'loading') {
80*f9afcc0dS猫头猫                    onEndReached?.();
81*f9afcc0dS猫头猫                }
82*f9afcc0dS猫头猫            }}
83*f9afcc0dS猫头猫            onEndReachedThreshold={0.1}
844060c00aS猫头猫        />
85378a6099S猫头猫    );
86378a6099S猫头猫}
87