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