xref: /MusicFree/src/pages/artistDetail/components/resultList.tsx (revision a3b33415d37ff72f265b11a58c6cdaf46facf691)
120e2869eS猫头猫import React, {useEffect, useRef, useState} from 'react';
220e2869eS猫头猫import {StyleSheet, Text, View} from 'react-native';
320e2869eS猫头猫import rpx from '@/utils/rpx';
4*a3b33415S猫头猫import MusicItem from '@/components/mediaItem/musicItem';
520e2869eS猫头猫import {FlatList} from 'react-native-gesture-handler';
6*a3b33415S猫头猫import {useAtom, useSetAtom} from 'jotai';
720e2869eS猫头猫import {IQueryResult, scrollToTopAtom} from '../store/atoms';
820e2869eS猫头猫import {RequestStateCode} from '@/constants/commonConst';
920e2869eS猫头猫import useQueryArtist from '../hooks/useQuery';
1020e2869eS猫头猫import {useRoute} from '@react-navigation/native';
1120e2869eS猫头猫
1220e2869eS猫头猫const fakeMusicList = Array(50)
1320e2869eS猫头猫  .fill(1)
1420e2869eS猫头猫  .map(_ => ({
1520e2869eS猫头猫    id: '1125499111' + Math.random(),
1620e2869eS猫头猫    artist: '周杰伦',
1720e2869eS猫头猫    title: '我是如此相信 (电影《天火》主题曲)',
1820e2869eS猫头猫    album: '我是如此相信',
1920e2869eS猫头猫    artwork:
2020e2869eS猫头猫      'https://mcontent.migu.cn/newlv2/new/album/20201103/1125499110/s_Xlihp7auugzpWgbW.jpg',
2120e2869eS猫头猫    url: 'https://freetyst.nf.migu.cn/public%2Fproduct6th%2Fproduct36%2F2019%2F12%2F1319%2F2019%E5%B9%B412%E6%9C%8813%E6%97%A519%E7%82%B933%E5%88%86%E7%B4%A7%E6%80%A5%E5%86%85%E5%AE%B9%E5%87%86%E5%85%A5%E7%BA%B5%E6%A8%AA%E4%B8%96%E4%BB%A31%E9%A6%96%2F%E5%85%A8%E6%9B%B2%E8%AF%95%E5%90%AC%2FMp3_64_22_16%2F60054704118.mp3?Key=418a2b05ec5576d6&Tim=1662191674042&channelid=01&msisdn=dbea15217ccb4a1882585e57f2a23b3e',
2220e2869eS猫头猫    lrc: 'https://tyqk.migu.cn/files/lyric/2019-12-14/dcf94ea8351c4cdc9a60316cdd8f14aa.lrc',
2320e2869eS猫头猫    platform: '咪咕',
2420e2869eS猫头猫  }));
2520e2869eS猫头猫
2620e2869eS猫头猫const ITEM_HEIGHT = rpx(120);
2720e2869eS猫头猫
2820e2869eS猫头猫interface IResultListProps<T = IArtist.ArtistMediaType> {
2920e2869eS猫头猫  tab: T;
3020e2869eS猫头猫  data: IQueryResult<T>;
3120e2869eS猫头猫  renderItem: (...args: any) => any;
3220e2869eS猫头猫}
3320e2869eS猫头猫export default function ResultList(props: IResultListProps) {
3420e2869eS猫头猫  const {data, renderItem, tab} = props;
35*a3b33415S猫头猫  const [scrollToTopState, setScrollToTopState] = useAtom(scrollToTopAtom);
3620e2869eS猫头猫  const lastScrollY = useRef<number>(0);
3720e2869eS猫头猫  const route = useRoute<any>();
3820e2869eS猫头猫  const pluginHash: string = route.params.pluginHash;
3920e2869eS猫头猫  const artistItem: IArtist.IArtistItem = route.params.artistItem;
4020e2869eS猫头猫  const [queryState, setQueryState] = useState<RequestStateCode>(
4120e2869eS猫头猫    data?.state ?? RequestStateCode.IDLE,
4220e2869eS猫头猫  );
4320e2869eS猫头猫
4420e2869eS猫头猫  const queryArtist = useQueryArtist(pluginHash);
4520e2869eS猫头猫
4620e2869eS猫头猫  useEffect(() => {
4720e2869eS猫头猫    queryState === RequestStateCode.IDLE && queryArtist(artistItem, 1, tab);
4820e2869eS猫头猫  }, []);
4920e2869eS猫头猫
5020e2869eS猫头猫  useEffect(() => {
5120e2869eS猫头猫    setQueryState(data?.state ?? RequestStateCode.IDLE);
5220e2869eS猫头猫  }, [data]);
5320e2869eS猫头猫
5420e2869eS猫头猫  return (
5520e2869eS猫头猫    <FlatList
5620e2869eS猫头猫      onScroll={e => {
5720e2869eS猫头猫        const currentY = e.nativeEvent.contentOffset.y;
58*a3b33415S猫头猫        if (!scrollToTopState && currentY < ITEM_HEIGHT * 8 - rpx(350)) {
5920e2869eS猫头猫          currentY < lastScrollY.current && setScrollToTopState(true);
6020e2869eS猫头猫        } else {
61*a3b33415S猫头猫          if (scrollToTopState && currentY > ITEM_HEIGHT * 8) {
62*a3b33415S猫头猫            currentY > lastScrollY.current && setScrollToTopState(false);
63*a3b33415S猫头猫          }
6420e2869eS猫头猫        }
6520e2869eS猫头猫        lastScrollY.current = currentY;
6620e2869eS猫头猫      }}
6720e2869eS猫头猫      onEndReached={() => {
68*a3b33415S猫头猫        (queryState === RequestStateCode.IDLE ||
69*a3b33415S猫头猫          queryState === RequestStateCode.PARTLY_DONE) &&
7020e2869eS猫头猫          queryArtist(artistItem, undefined, tab);
7120e2869eS猫头猫      }}
7220e2869eS猫头猫      getItemLayout={(_, index) => ({
7320e2869eS猫头猫        length: ITEM_HEIGHT,
7420e2869eS猫头猫        offset: ITEM_HEIGHT * index,
7520e2869eS猫头猫        index,
7620e2869eS猫头猫      })}
7720e2869eS猫头猫      overScrollMode="always"
7820e2869eS猫头猫      data={data.data ?? []}
7920e2869eS猫头猫      renderItem={renderItem}></FlatList>
8020e2869eS猫头猫  );
8120e2869eS猫头猫}
82