1*5500cea7S猫头猫import React, {memo, useCallback, useEffect, useState} from 'react'; 2bf6e62f2S猫头猫import {useAtomValue} from 'jotai'; 34060c00aS猫头猫import {ISearchResult, queryAtom} from '../../store/atoms'; 4bf6e62f2S猫头猫import {renderMap} from './results'; 53a76c6afS猫头猫import useSearch from '../../hooks/useSearch'; 63a76c6afS猫头猫import Loading from '@/components/base/loading'; 720e2869eS猫头猫import {RequestStateCode} from '@/constants/commonConst'; 821f1ca13S猫头猫import ListLoading from '@/components/base/listLoading'; 921f1ca13S猫头猫import Empty from '@/components/base/empty'; 1021f1ca13S猫头猫import ListReachEnd from '@/components/base/listReachEnd'; 11771839b6S猫头猫import useOrientation from '@/hooks/useOrientation'; 12771839b6S猫头猫import {FlashList} from '@shopify/flash-list'; 13771839b6S猫头猫import rpx from '@/utils/rpx'; 14c1df0edfSTheoimport {StyleSheet, View} from 'react-native'; 15bf6e62f2S猫头猫 16a4ae8da5S猫头猫interface IResultWrapperProps< 17a4ae8da5S猫头猫 T extends ICommon.SupportMediaType = ICommon.SupportMediaType, 18a4ae8da5S猫头猫> { 19a4ae8da5S猫头猫 tab: T; 209d40a3faS猫头猫 pluginHash: string; 213a76c6afS猫头猫 pluginName: string; 22a4ae8da5S猫头猫 searchResult: ISearchResult<T>; 2322de5a24S猫头猫 pluginSearchResultRef: React.MutableRefObject<ISearchResult<T>>; 24bf6e62f2S猫头猫} 25a4ae8da5S猫头猫function ResultWrapper(props: IResultWrapperProps) { 2622de5a24S猫头猫 const {tab, pluginHash, searchResult, pluginSearchResultRef} = props; 273a76c6afS猫头猫 const search = useSearch(); 2820e2869eS猫头猫 const [searchState, setSearchState] = useState<RequestStateCode>( 2920e2869eS猫头猫 searchResult?.state ?? RequestStateCode.IDLE, 30be474dd8S猫头猫 ); 31771839b6S猫头猫 const orientation = useOrientation(); 320b940038S猫头猫 const query = useAtomValue(queryAtom); 33a4ae8da5S猫头猫 34a4ae8da5S猫头猫 const ResultComponent = renderMap[tab]!; 35a4ae8da5S猫头猫 const data: any = searchResult?.data ?? []; 3692a7e801S猫头猫 37*5500cea7S猫头猫 const keyExtractor = useCallback( 38*5500cea7S猫头猫 (item: any, i: number) => `${i}-${item.platform}-${item.id}`, 39*5500cea7S猫头猫 [], 40*5500cea7S猫头猫 ); 41*5500cea7S猫头猫 4292a7e801S猫头猫 useEffect(() => { 4320e2869eS猫头猫 if (searchState === RequestStateCode.IDLE) { 44a4ae8da5S猫头猫 search(query, 1, tab, pluginHash); 45a4ae8da5S猫头猫 } 46a4ae8da5S猫头猫 }, []); 473a76c6afS猫头猫 48a4ae8da5S猫头猫 useEffect(() => { 4920e2869eS猫头猫 setSearchState(searchResult?.state ?? RequestStateCode.IDLE); 50a4ae8da5S猫头猫 }, [searchResult]); 510b940038S猫头猫 52be474dd8S猫头猫 const renderItem = ({item, index}: any) => ( 5322de5a24S猫头猫 <ResultComponent 5422de5a24S猫头猫 item={item} 5522de5a24S猫头猫 index={index} 5622de5a24S猫头猫 pluginHash={pluginHash} 5722de5a24S猫头猫 pluginSearchResultRef={pluginSearchResultRef} 5822de5a24S猫头猫 /> 59be474dd8S猫头猫 ); 60be474dd8S猫头猫 61956ee1b7S猫头猫 return searchState === RequestStateCode.PENDING_FIRST_PAGE ? ( 624060c00aS猫头猫 <Loading /> 633a76c6afS猫头猫 ) : ( 64771839b6S猫头猫 <FlashList 654f2deeb0S猫头猫 extraData={searchState} 664060c00aS猫头猫 ListEmptyComponent={() => <Empty />} 67c1df0edfSTheo ListFooterComponent={() => ( 68c1df0edfSTheo <View style={style.wrapper}> 69956ee1b7S猫头猫 {searchState === RequestStateCode.PENDING_REST_PAGE ? ( 704060c00aS猫头猫 <ListLoading /> 7121f1ca13S猫头猫 ) : searchState === RequestStateCode.FINISHED ? ( 724060c00aS猫头猫 <ListReachEnd /> 7321f1ca13S猫头猫 ) : ( 7421f1ca13S猫头猫 <></> 75c1df0edfSTheo )} 76c1df0edfSTheo </View> 77c1df0edfSTheo )} 780b940038S猫头猫 data={data} 79a4ae8da5S猫头猫 refreshing={false} 80a4ae8da5S猫头猫 onRefresh={() => { 81a4ae8da5S猫头猫 search(query, 1, tab, pluginHash); 82a4ae8da5S猫头猫 }} 833a76c6afS猫头猫 onEndReached={() => { 8420e2869eS猫头猫 (searchState === RequestStateCode.PARTLY_DONE || 8520e2869eS猫头猫 searchState === RequestStateCode.IDLE) && 860b940038S猫头猫 search(undefined, undefined, tab, pluginHash); 873a76c6afS猫头猫 }} 88771839b6S猫头猫 estimatedItemSize={tab === 'sheet' ? rpx(306) : rpx(120)} 89771839b6S猫头猫 numColumns={ 90771839b6S猫头猫 tab === 'sheet' ? (orientation === 'vertical' ? 3 : 4) : 1 91771839b6S猫头猫 } 924060c00aS猫头猫 renderItem={renderItem} 93*5500cea7S猫头猫 keyExtractor={keyExtractor} 944060c00aS猫头猫 /> 9592a7e801S猫头猫 ); 96bf6e62f2S猫头猫} 97a4ae8da5S猫头猫 98a4ae8da5S猫头猫export default memo(ResultWrapper); 99c1df0edfSTheoconst style = StyleSheet.create({ 100c1df0edfSTheo wrapper: { 101c1df0edfSTheo width: '100%', 102c1df0edfSTheo height: rpx(140), 103c1df0edfSTheo justifyContent: 'center', 104c1df0edfSTheo alignItems: 'center', 105c1df0edfSTheo }, 106c1df0edfSTheo}); 107