xref: /MusicFree/src/components/musicList/index.tsx (revision 740e39476f71e0e17304d812ac0a4c4cdc183ed1)
1*740e3947S猫头猫import React 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';
105500cea7S猫头猫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*740e3947S猫头猫    // ! keyExtractor需要保证整个生命周期统一? 有些奇怪
44*740e3947S猫头猫    // const keyExtractor = useCallback(
45*740e3947S猫头猫    //     (item: any, index: number) =>
46*740e3947S猫头猫    //         '' + index + '-' + item.platform + '-' + item.id,
47*740e3947S猫头猫    //     [],
48*740e3947S猫头猫    // );
495500cea7S猫头猫
50378a6099S猫头猫    return (
5195c9734fS猫头猫        <FlashList
52378a6099S猫头猫            ListHeaderComponent={Header}
535830c002S猫头猫            ListEmptyComponent={loadMore !== 'loading' ? Empty : null}
54f9afcc0dS猫头猫            ListFooterComponent={
55f9afcc0dS猫头猫                loadMore === 'done'
56f9afcc0dS猫头猫                    ? ListReachEnd
57f9afcc0dS猫头猫                    : loadMore === 'loading'
58f9afcc0dS猫头猫                    ? ListLoading
59f9afcc0dS猫头猫                    : null
60f9afcc0dS猫头猫            }
61378a6099S猫头猫            data={musicList ?? []}
62*740e3947S猫头猫            // keyExtractor={keyExtractor}
6395c9734fS猫头猫            estimatedItemSize={ITEM_HEIGHT}
64378a6099S猫头猫            renderItem={({index, item: musicItem}) => {
65378a6099S猫头猫                return (
663a76c6afS猫头猫                    <MusicItem
673a76c6afS猫头猫                        musicItem={musicItem}
683a76c6afS猫头猫                        index={showIndex ? index + 1 : undefined}
693a76c6afS猫头猫                        onItemPress={() => {
709e24e067S猫头猫                            if (onItemPress) {
71cbb92902S猫头猫                                onItemPress(musicItem, musicList);
729e24e067S猫头猫                            } else {
735500cea7S猫头猫                                TrackPlayer.playWithReplacePlayList(
744060c00aS猫头猫                                    musicItem,
755500cea7S猫头猫                                    musicList ?? [musicItem],
764060c00aS猫头猫                                );
77378a6099S猫头猫                            }
789e24e067S猫头猫                        }}
794060c00aS猫头猫                        musicSheet={musicSheet}
804060c00aS猫头猫                    />
81378a6099S猫头猫                );
824060c00aS猫头猫            }}
83f9afcc0dS猫头猫            onEndReached={() => {
84f9afcc0dS猫头猫                if (loadMore !== 'loading') {
85f9afcc0dS猫头猫                    onEndReached?.();
86f9afcc0dS猫头猫                }
87f9afcc0dS猫头猫            }}
88f9afcc0dS猫头猫            onEndReachedThreshold={0.1}
894060c00aS猫头猫        />
90378a6099S猫头猫    );
91378a6099S猫头猫}
92