xref: /MusicFree/src/pages/searchPage/components/resultPanel/resultWrapper.tsx (revision 21f1ca1358f6d9bc5d2d1559221a72f162acdce5)
1a4ae8da5S猫头猫import React, {memo, useEffect, useState} from 'react';
2bf6e62f2S猫头猫import {useAtomValue} from 'jotai';
3*21f1ca13S猫头猫import {ISearchResult, queryAtom, searchResultsAtom} 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';
84f2deeb0S猫头猫import ThemeText from '@/components/base/themeText';
920e2869eS猫头猫import {RequestStateCode} from '@/constants/commonConst';
10*21f1ca13S猫头猫import ListLoading from '@/components/base/listLoading';
11*21f1ca13S猫头猫import Empty from '@/components/base/empty';
12*21f1ca13S猫头猫import ListReachEnd from '@/components/base/listReachEnd';
13bf6e62f2S猫头猫
14a4ae8da5S猫头猫interface IResultWrapperProps<
15a4ae8da5S猫头猫  T extends ICommon.SupportMediaType = ICommon.SupportMediaType,
16a4ae8da5S猫头猫> {
17a4ae8da5S猫头猫  tab: T;
189d40a3faS猫头猫  pluginHash: string;
193a76c6afS猫头猫  pluginName: string;
20a4ae8da5S猫头猫  searchResult: ISearchResult<T>;
21bf6e62f2S猫头猫}
22a4ae8da5S猫头猫function ResultWrapper(props: IResultWrapperProps) {
23a4ae8da5S猫头猫  const {tab, pluginHash, searchResult, pluginName} = 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*21f1ca13S猫头猫    <ResultComponent
45*21f1ca13S猫头猫      item={item}
46*21f1ca13S猫头猫      index={index}
47*21f1ca13S猫头猫      pluginHash={pluginHash}></ResultComponent>
48be474dd8S猫头猫  );
49be474dd8S猫头猫
5020e2869eS猫头猫  return searchState === RequestStateCode.PENDING_FP ? (
513a76c6afS猫头猫    <Loading></Loading>
523a76c6afS猫头猫  ) : (
533a76c6afS猫头猫    <FlatList
544f2deeb0S猫头猫      extraData={searchState}
554f2deeb0S猫头猫      style={style.list}
56*21f1ca13S猫头猫      ListEmptyComponent={() => <Empty></Empty>}
57*21f1ca13S猫头猫      ListFooterComponent={() =>
58*21f1ca13S猫头猫        searchState === RequestStateCode.PENDING ? (
59*21f1ca13S猫头猫          <ListLoading></ListLoading>
60*21f1ca13S猫头猫        ) : searchState === RequestStateCode.FINISHED ? (
61*21f1ca13S猫头猫          <ListReachEnd></ListReachEnd>
62*21f1ca13S猫头猫        ) : (
63*21f1ca13S猫头猫          <></>
64*21f1ca13S猫头猫        )
65*21f1ca13S猫头猫      }
660b940038S猫头猫      data={data}
67a4ae8da5S猫头猫      refreshing={false}
68a4ae8da5S猫头猫      onRefresh={() => {
69a4ae8da5S猫头猫        search(query, 1, tab, pluginHash);
70a4ae8da5S猫头猫      }}
713a76c6afS猫头猫      onEndReached={() => {
7220e2869eS猫头猫        (searchState === RequestStateCode.PARTLY_DONE ||
7320e2869eS猫头猫          searchState === RequestStateCode.IDLE) &&
740b940038S猫头猫          search(undefined, undefined, tab, pluginHash);
753a76c6afS猫头猫      }}
76be474dd8S猫头猫      renderItem={renderItem}></FlatList>
7792a7e801S猫头猫  );
78bf6e62f2S猫头猫}
794f2deeb0S猫头猫const style = StyleSheet.create({
804f2deeb0S猫头猫  list: {
81a4ae8da5S猫头猫    flex: 1,
824f2deeb0S猫头猫  },
834f2deeb0S猫头猫});
84a4ae8da5S猫头猫
85a4ae8da5S猫头猫export default memo(ResultWrapper);
86