xref: /MusicFree/src/pages/searchPage/components/resultPanel/resultWrapper.tsx (revision bcc589474c419ce80ca7acdb6859d807e589bd99)
15500cea7S猫头猫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猫头猫
375500cea7S猫头猫    const keyExtractor = useCallback(
385500cea7S猫头猫        (item: any, i: number) => `${i}-${item.platform}-${item.id}`,
395500cea7S猫头猫        [],
405500cea7S猫头猫    );
415500cea7S猫头猫
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}
66*bcc58947S猫头猫            ListEmptyComponent={() =>
67*bcc58947S猫头猫                searchState & RequestStateCode.LOADING ? null : <Empty />
68*bcc58947S猫头猫            }
69c1df0edfSTheo            ListFooterComponent={() => (
70c1df0edfSTheo                <View style={style.wrapper}>
71956ee1b7S猫头猫                    {searchState === RequestStateCode.PENDING_REST_PAGE ? (
724060c00aS猫头猫                        <ListLoading />
7321f1ca13S猫头猫                    ) : searchState === RequestStateCode.FINISHED ? (
744060c00aS猫头猫                        <ListReachEnd />
7521f1ca13S猫头猫                    ) : (
7621f1ca13S猫头猫                        <></>
77c1df0edfSTheo                    )}
78c1df0edfSTheo                </View>
79c1df0edfSTheo            )}
800b940038S猫头猫            data={data}
81a4ae8da5S猫头猫            refreshing={false}
82a4ae8da5S猫头猫            onRefresh={() => {
83a4ae8da5S猫头猫                search(query, 1, tab, pluginHash);
84a4ae8da5S猫头猫            }}
853a76c6afS猫头猫            onEndReached={() => {
8620e2869eS猫头猫                (searchState === RequestStateCode.PARTLY_DONE ||
8720e2869eS猫头猫                    searchState === RequestStateCode.IDLE) &&
880b940038S猫头猫                    search(undefined, undefined, tab, pluginHash);
893a76c6afS猫头猫            }}
90771839b6S猫头猫            estimatedItemSize={tab === 'sheet' ? rpx(306) : rpx(120)}
91771839b6S猫头猫            numColumns={
92771839b6S猫头猫                tab === 'sheet' ? (orientation === 'vertical' ? 3 : 4) : 1
93771839b6S猫头猫            }
944060c00aS猫头猫            renderItem={renderItem}
955500cea7S猫头猫            keyExtractor={keyExtractor}
964060c00aS猫头猫        />
9792a7e801S猫头猫    );
98bf6e62f2S猫头猫}
99a4ae8da5S猫头猫
100a4ae8da5S猫头猫export default memo(ResultWrapper);
101c1df0edfSTheoconst style = StyleSheet.create({
102c1df0edfSTheo    wrapper: {
103c1df0edfSTheo        width: '100%',
104c1df0edfSTheo        height: rpx(140),
105c1df0edfSTheo        justifyContent: 'center',
106c1df0edfSTheo        alignItems: 'center',
107c1df0edfSTheo    },
108c1df0edfSTheo});
109