xref: /MusicFree/src/pages/searchPage/components/resultPanel/resultWrapper.tsx (revision 5500cea7e936041b68a2f3709a583c2f0181b9e6)
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