xref: /MusicFree/src/pages/searchPage/components/resultPanel/resultWrapper.tsx (revision 20e2869e216f04ba2dbb37ce330d5579608bc45e)
1a4ae8da5S猫头猫import React, {memo, useEffect, useState} from 'react';
2bf6e62f2S猫头猫import {useAtomValue} from 'jotai';
3a4ae8da5S猫头猫import {
4a4ae8da5S猫头猫  ISearchResult,
5a4ae8da5S猫头猫  queryAtom,
6a4ae8da5S猫头猫  searchResultsAtom,
7a4ae8da5S猫头猫} from '../../store/atoms';
8bf6e62f2S猫头猫import {renderMap} from './results';
93a76c6afS猫头猫import useSearch from '../../hooks/useSearch';
103a76c6afS猫头猫import Loading from '@/components/base/loading';
114f2deeb0S猫头猫import {FlatList, StyleSheet} from 'react-native';
124f2deeb0S猫头猫import ThemeText from '@/components/base/themeText';
13*20e2869eS猫头猫import { RequestStateCode } from '@/constants/commonConst';
14bf6e62f2S猫头猫
15a4ae8da5S猫头猫interface IResultWrapperProps<
16a4ae8da5S猫头猫  T extends ICommon.SupportMediaType = ICommon.SupportMediaType,
17a4ae8da5S猫头猫> {
18a4ae8da5S猫头猫  tab: T;
199d40a3faS猫头猫  pluginHash: string;
203a76c6afS猫头猫  pluginName: string;
21a4ae8da5S猫头猫  searchResult: ISearchResult<T>;
22bf6e62f2S猫头猫}
23a4ae8da5S猫头猫function ResultWrapper(props: IResultWrapperProps) {
24a4ae8da5S猫头猫  const {tab, pluginHash, searchResult, pluginName} = props;
253a76c6afS猫头猫  const search = useSearch();
26*20e2869eS猫头猫  const [searchState, setSearchState] = useState<RequestStateCode>(
27*20e2869eS猫头猫    searchResult?.state ?? RequestStateCode.IDLE,
28be474dd8S猫头猫  );
290b940038S猫头猫  const query = useAtomValue(queryAtom);
30a4ae8da5S猫头猫
31a4ae8da5S猫头猫  const ResultComponent = renderMap[tab]!;
32a4ae8da5S猫头猫  const data: any = searchResult?.data ?? [];
3392a7e801S猫头猫
3492a7e801S猫头猫  useEffect(() => {
35*20e2869eS猫头猫    if (searchState === RequestStateCode.IDLE) {
36a4ae8da5S猫头猫      search(query, 1, tab, pluginHash);
37a4ae8da5S猫头猫    }
38a4ae8da5S猫头猫  }, []);
393a76c6afS猫头猫
40a4ae8da5S猫头猫  useEffect(() => {
41*20e2869eS猫头猫    setSearchState(searchResult?.state ?? RequestStateCode.IDLE);
42a4ae8da5S猫头猫  }, [searchResult]);
430b940038S猫头猫
44be474dd8S猫头猫  const renderItem = ({item, index}: any) => (
45*20e2869eS猫头猫    <ResultComponent item={item} index={index} pluginHash={pluginHash}></ResultComponent>
46be474dd8S猫头猫  );
47be474dd8S猫头猫
48*20e2869eS猫头猫  return searchState === RequestStateCode.PENDING_FP ? (
493a76c6afS猫头猫    <Loading></Loading>
503a76c6afS猫头猫  ) : (
513a76c6afS猫头猫    <FlatList
524f2deeb0S猫头猫      extraData={searchState}
534f2deeb0S猫头猫      style={style.list}
54a4ae8da5S猫头猫      ListEmptyComponent={() => <ThemeText>什么都没有</ThemeText>}
550b940038S猫头猫      ListFooterComponent={() => (
560b940038S猫头猫        <ThemeText>
57*20e2869eS猫头猫          {searchState === RequestStateCode.PENDING
580b940038S猫头猫            ? '加载中...'
59*20e2869eS猫头猫            : searchState === RequestStateCode.FINISHED
600b940038S猫头猫            ? '到底啦'
610b940038S猫头猫            : ''}
620b940038S猫头猫        </ThemeText>
630b940038S猫头猫      )}
640b940038S猫头猫      data={data}
65a4ae8da5S猫头猫      refreshing={false}
66a4ae8da5S猫头猫      onRefresh={() => {
67a4ae8da5S猫头猫        search(query, 1, tab, pluginHash);
68a4ae8da5S猫头猫      }}
693a76c6afS猫头猫      onEndReached={() => {
70*20e2869eS猫头猫        (searchState === RequestStateCode.PARTLY_DONE ||
71*20e2869eS猫头猫          searchState === RequestStateCode.IDLE) &&
720b940038S猫头猫          search(undefined, undefined, tab, pluginHash);
733a76c6afS猫头猫      }}
74be474dd8S猫头猫      renderItem={renderItem}></FlatList>
7592a7e801S猫头猫  );
76bf6e62f2S猫头猫}
774f2deeb0S猫头猫const style = StyleSheet.create({
784f2deeb0S猫头猫  list: {
79a4ae8da5S猫头猫    flex: 1,
804f2deeb0S猫头猫  },
814f2deeb0S猫头猫});
82a4ae8da5S猫头猫
83a4ae8da5S猫头猫export default memo(ResultWrapper);
84