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