xref: /MusicFree/src/pages/searchPage/components/resultPanel/resultWrapper.tsx (revision 22de5a242619d5fe5178bf4b9b1f9c616a763b3c)
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';
74f2deeb0S猫头猫import {FlatList, StyleSheet} from 'react-native';
820e2869eS猫头猫import {RequestStateCode} from '@/constants/commonConst';
921f1ca13S猫头猫import ListLoading from '@/components/base/listLoading';
1021f1ca13S猫头猫import Empty from '@/components/base/empty';
1121f1ca13S猫头猫import ListReachEnd from '@/components/base/listReachEnd';
12bf6e62f2S猫头猫
13a4ae8da5S猫头猫interface IResultWrapperProps<
14a4ae8da5S猫头猫    T extends ICommon.SupportMediaType = ICommon.SupportMediaType,
15a4ae8da5S猫头猫> {
16a4ae8da5S猫头猫    tab: T;
179d40a3faS猫头猫    pluginHash: string;
183a76c6afS猫头猫    pluginName: string;
19a4ae8da5S猫头猫    searchResult: ISearchResult<T>;
20*22de5a24S猫头猫    pluginSearchResultRef: React.MutableRefObject<ISearchResult<T>>;
21bf6e62f2S猫头猫}
22a4ae8da5S猫头猫function ResultWrapper(props: IResultWrapperProps) {
23*22de5a24S猫头猫    const {tab, pluginHash, searchResult, pluginSearchResultRef} = props;
243a76c6afS猫头猫    const search = useSearch();
2520e2869eS猫头猫    const [searchState, setSearchState] = useState<RequestStateCode>(
2620e2869eS猫头猫        searchResult?.state ?? RequestStateCode.IDLE,
27be474dd8S猫头猫    );
280b940038S猫头猫    const query = useAtomValue(queryAtom);
29a4ae8da5S猫头猫
30a4ae8da5S猫头猫    const ResultComponent = renderMap[tab]!;
31a4ae8da5S猫头猫    const data: any = searchResult?.data ?? [];
3292a7e801S猫头猫
3392a7e801S猫头猫    useEffect(() => {
3420e2869eS猫头猫        if (searchState === RequestStateCode.IDLE) {
35a4ae8da5S猫头猫            search(query, 1, tab, pluginHash);
36a4ae8da5S猫头猫        }
37a4ae8da5S猫头猫    }, []);
383a76c6afS猫头猫
39a4ae8da5S猫头猫    useEffect(() => {
4020e2869eS猫头猫        setSearchState(searchResult?.state ?? RequestStateCode.IDLE);
41a4ae8da5S猫头猫    }, [searchResult]);
420b940038S猫头猫
43be474dd8S猫头猫    const renderItem = ({item, index}: any) => (
44*22de5a24S猫头猫        <ResultComponent
45*22de5a24S猫头猫            item={item}
46*22de5a24S猫头猫            index={index}
47*22de5a24S猫头猫            pluginHash={pluginHash}
48*22de5a24S猫头猫            pluginSearchResultRef={pluginSearchResultRef}
49*22de5a24S猫头猫        />
50be474dd8S猫头猫    );
51be474dd8S猫头猫
5220e2869eS猫头猫    return searchState === RequestStateCode.PENDING_FP ? (
534060c00aS猫头猫        <Loading />
543a76c6afS猫头猫    ) : (
553a76c6afS猫头猫        <FlatList
564f2deeb0S猫头猫            extraData={searchState}
574f2deeb0S猫头猫            style={style.list}
584060c00aS猫头猫            ListEmptyComponent={() => <Empty />}
5921f1ca13S猫头猫            ListFooterComponent={() =>
6021f1ca13S猫头猫                searchState === RequestStateCode.PENDING ? (
614060c00aS猫头猫                    <ListLoading />
6221f1ca13S猫头猫                ) : searchState === RequestStateCode.FINISHED ? (
634060c00aS猫头猫                    <ListReachEnd />
6421f1ca13S猫头猫                ) : (
6521f1ca13S猫头猫                    <></>
6621f1ca13S猫头猫                )
6721f1ca13S猫头猫            }
680b940038S猫头猫            data={data}
69a4ae8da5S猫头猫            refreshing={false}
70a4ae8da5S猫头猫            onRefresh={() => {
71a4ae8da5S猫头猫                search(query, 1, tab, pluginHash);
72a4ae8da5S猫头猫            }}
733a76c6afS猫头猫            onEndReached={() => {
7420e2869eS猫头猫                (searchState === RequestStateCode.PARTLY_DONE ||
7520e2869eS猫头猫                    searchState === RequestStateCode.IDLE) &&
760b940038S猫头猫                    search(undefined, undefined, tab, pluginHash);
773a76c6afS猫头猫            }}
784060c00aS猫头猫            renderItem={renderItem}
794060c00aS猫头猫        />
8092a7e801S猫头猫    );
81bf6e62f2S猫头猫}
824f2deeb0S猫头猫const style = StyleSheet.create({
834f2deeb0S猫头猫    list: {
84a4ae8da5S猫头猫        flex: 1,
854f2deeb0S猫头猫    },
864f2deeb0S猫头猫});
87a4ae8da5S猫头猫
88a4ae8da5S猫头猫export default memo(ResultWrapper);
89