1a4ae8da5S猫头猫import React, {memo, 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猫头猫 3792a7e801S猫头猫 useEffect(() => { 3820e2869eS猫头猫 if (searchState === RequestStateCode.IDLE) { 39a4ae8da5S猫头猫 search(query, 1, tab, pluginHash); 40a4ae8da5S猫头猫 } 41a4ae8da5S猫头猫 }, []); 423a76c6afS猫头猫 43a4ae8da5S猫头猫 useEffect(() => { 4420e2869eS猫头猫 setSearchState(searchResult?.state ?? RequestStateCode.IDLE); 45a4ae8da5S猫头猫 }, [searchResult]); 460b940038S猫头猫 47be474dd8S猫头猫 const renderItem = ({item, index}: any) => ( 4822de5a24S猫头猫 <ResultComponent 4922de5a24S猫头猫 item={item} 5022de5a24S猫头猫 index={index} 5122de5a24S猫头猫 pluginHash={pluginHash} 5222de5a24S猫头猫 pluginSearchResultRef={pluginSearchResultRef} 5322de5a24S猫头猫 /> 54be474dd8S猫头猫 ); 55be474dd8S猫头猫 56*956ee1b7S猫头猫 return searchState === RequestStateCode.PENDING_FIRST_PAGE ? ( 574060c00aS猫头猫 <Loading /> 583a76c6afS猫头猫 ) : ( 59771839b6S猫头猫 <FlashList 604f2deeb0S猫头猫 extraData={searchState} 614060c00aS猫头猫 ListEmptyComponent={() => <Empty />} 62c1df0edfSTheo ListFooterComponent={() => ( 63c1df0edfSTheo <View style={style.wrapper}> 64*956ee1b7S猫头猫 {searchState === RequestStateCode.PENDING_REST_PAGE ? ( 654060c00aS猫头猫 <ListLoading /> 6621f1ca13S猫头猫 ) : searchState === RequestStateCode.FINISHED ? ( 674060c00aS猫头猫 <ListReachEnd /> 6821f1ca13S猫头猫 ) : ( 6921f1ca13S猫头猫 <></> 70c1df0edfSTheo )} 71c1df0edfSTheo </View> 72c1df0edfSTheo )} 730b940038S猫头猫 data={data} 74a4ae8da5S猫头猫 refreshing={false} 75a4ae8da5S猫头猫 onRefresh={() => { 76a4ae8da5S猫头猫 search(query, 1, tab, pluginHash); 77a4ae8da5S猫头猫 }} 783a76c6afS猫头猫 onEndReached={() => { 7920e2869eS猫头猫 (searchState === RequestStateCode.PARTLY_DONE || 8020e2869eS猫头猫 searchState === RequestStateCode.IDLE) && 810b940038S猫头猫 search(undefined, undefined, tab, pluginHash); 823a76c6afS猫头猫 }} 83771839b6S猫头猫 estimatedItemSize={tab === 'sheet' ? rpx(306) : rpx(120)} 84771839b6S猫头猫 numColumns={ 85771839b6S猫头猫 tab === 'sheet' ? (orientation === 'vertical' ? 3 : 4) : 1 86771839b6S猫头猫 } 874060c00aS猫头猫 renderItem={renderItem} 884060c00aS猫头猫 /> 8992a7e801S猫头猫 ); 90bf6e62f2S猫头猫} 91a4ae8da5S猫头猫 92a4ae8da5S猫头猫export default memo(ResultWrapper); 93c1df0edfSTheoconst style = StyleSheet.create({ 94c1df0edfSTheo wrapper: { 95c1df0edfSTheo width: '100%', 96c1df0edfSTheo height: rpx(140), 97c1df0edfSTheo justifyContent: 'center', 98c1df0edfSTheo alignItems: 'center', 99c1df0edfSTheo }, 100c1df0edfSTheo}); 101