xref: /MusicFree/src/components/musicList/index.tsx (revision 5500cea7e936041b68a2f3709a583c2f0181b9e6)
1*5500cea7S猫头猫import React, {useCallback} 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';
10*5500cea7S猫头猫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*5500cea7S猫头猫    const keyExtractor = useCallback(
44*5500cea7S猫头猫        (item: any, i: number) => `${i}-${item.platform}-${item.id}`,
45*5500cea7S猫头猫        [],
46*5500cea7S猫头猫    );
47*5500cea7S猫头猫
48378a6099S猫头猫    return (
4995c9734fS猫头猫        <FlashList
50378a6099S猫头猫            ListHeaderComponent={Header}
515830c002S猫头猫            ListEmptyComponent={loadMore !== 'loading' ? Empty : null}
52f9afcc0dS猫头猫            ListFooterComponent={
53f9afcc0dS猫头猫                loadMore === 'done'
54f9afcc0dS猫头猫                    ? ListReachEnd
55f9afcc0dS猫头猫                    : loadMore === 'loading'
56f9afcc0dS猫头猫                    ? ListLoading
57f9afcc0dS猫头猫                    : null
58f9afcc0dS猫头猫            }
59378a6099S猫头猫            data={musicList ?? []}
60*5500cea7S猫头猫            keyExtractor={keyExtractor}
6195c9734fS猫头猫            estimatedItemSize={ITEM_HEIGHT}
62378a6099S猫头猫            renderItem={({index, item: musicItem}) => {
63378a6099S猫头猫                return (
643a76c6afS猫头猫                    <MusicItem
653a76c6afS猫头猫                        musicItem={musicItem}
663a76c6afS猫头猫                        index={showIndex ? index + 1 : undefined}
673a76c6afS猫头猫                        onItemPress={() => {
689e24e067S猫头猫                            if (onItemPress) {
69cbb92902S猫头猫                                onItemPress(musicItem, musicList);
709e24e067S猫头猫                            } else {
71*5500cea7S猫头猫                                TrackPlayer.playWithReplacePlayList(
724060c00aS猫头猫                                    musicItem,
73*5500cea7S猫头猫                                    musicList ?? [musicItem],
744060c00aS猫头猫                                );
75378a6099S猫头猫                            }
769e24e067S猫头猫                        }}
774060c00aS猫头猫                        musicSheet={musicSheet}
784060c00aS猫头猫                    />
79378a6099S猫头猫                );
804060c00aS猫头猫            }}
81f9afcc0dS猫头猫            onEndReached={() => {
82f9afcc0dS猫头猫                if (loadMore !== 'loading') {
83f9afcc0dS猫头猫                    onEndReached?.();
84f9afcc0dS猫头猫                }
85f9afcc0dS猫头猫            }}
86f9afcc0dS猫头猫            onEndReachedThreshold={0.1}
874060c00aS猫头猫        />
88378a6099S猫头猫    );
89378a6099S猫头猫}
90