xref: /MusicFree/src/pages/searchPage/components/resultPanel/resultWrapper.tsx (revision 4f2deeb0e4803944f4bae05d3193238ae004c289)
192a7e801S猫头猫import React, {useEffect, useState} from 'react';
2bf6e62f2S猫头猫import {useAtomValue} from 'jotai';
3be474dd8S猫头猫import {searchResultsAtom, SearchStateCode} from '../../store/atoms';
4bf6e62f2S猫头猫import getMediaItems from '../../common/getMediaItems';
5bf6e62f2S猫头猫import {renderMap} from './results';
63a76c6afS猫头猫import useSearch from '../../hooks/useSearch';
73a76c6afS猫头猫import Loading from '@/components/base/loading';
8*4f2deeb0S猫头猫import {FlatList, StyleSheet} from 'react-native';
9*4f2deeb0S猫头猫import ThemeText from '@/components/base/themeText';
10bf6e62f2S猫头猫
11bf6e62f2S猫头猫interface IResultWrapperProps {
12bf6e62f2S猫头猫  tab: ICommon.SupportMediaType;
139d40a3faS猫头猫  pluginHash: string;
143a76c6afS猫头猫  pluginName: string;
15bf6e62f2S猫头猫}
16bf6e62f2S猫头猫export default function ResultWrapper(props: IResultWrapperProps) {
179d40a3faS猫头猫  const {tab, pluginHash} = props;
183a76c6afS猫头猫  const search = useSearch();
19bf6e62f2S猫头猫  const searchResults = useAtomValue(searchResultsAtom);
20be474dd8S猫头猫  const [searchState, setSearchState] = useState<SearchStateCode>(
21be474dd8S猫头猫    SearchStateCode.PENDING,
22be474dd8S猫头猫  );
239d40a3faS猫头猫  const data = getMediaItems(searchResults, pluginHash, tab);
24bf6e62f2S猫头猫  const ResultComponent = renderMap[tab]!;
2592a7e801S猫头猫
2692a7e801S猫头猫  useEffect(() => {
27be474dd8S猫头猫    if (pluginHash === 'all') {
28ac0d843cS猫头猫      const allCode = Object.values(searchResults).map(_ => _.state);
29ac0d843cS猫头猫
30ac0d843cS猫头猫      const code = allCode.reduce((prev, curr) => prev & curr);
31ac0d843cS猫头猫      if (
32ac0d843cS猫头猫        code === SearchStateCode.IDLE ||
33ac0d843cS猫头猫        (!data?.length && allCode.includes(SearchStateCode.PENDING))
34ac0d843cS猫头猫      ) {
35be474dd8S猫头猫        setSearchState(SearchStateCode.PENDING);
36ac0d843cS猫头猫      } else {
37ac0d843cS猫头猫        setSearchState(code);
38be474dd8S猫头猫      }
39be474dd8S猫头猫    } else {
40be474dd8S猫头猫      setSearchState(
41be474dd8S猫头猫        searchResults[pluginHash]?.state ?? SearchStateCode.PENDING,
42be474dd8S猫头猫      );
43be474dd8S猫头猫    }
4492a7e801S猫头猫  }, [searchResults]);
453a76c6afS猫头猫
46be474dd8S猫头猫  const renderItem = ({item, index}: any) => (
47be474dd8S猫头猫    <ResultComponent item={item} index={index}></ResultComponent>
48be474dd8S猫头猫  );
49be474dd8S猫头猫
50be474dd8S猫头猫  return (!data || !data?.length) && searchState === SearchStateCode.PENDING ? (
513a76c6afS猫头猫    <Loading></Loading>
523a76c6afS猫头猫  ) : (
533a76c6afS猫头猫    <FlatList
54*4f2deeb0S猫头猫    extraData={searchState}
55*4f2deeb0S猫头猫      style={style.list}
56*4f2deeb0S猫头猫      ListFooterComponent={() => <ThemeText>{ searchState === SearchStateCode.PENDING ? '加载中...' : searchState === SearchStateCode.FINISHED ?'到底啦' :''}</ThemeText>}
573a76c6afS猫头猫      data={data ?? []}
583a76c6afS猫头猫      onEndReached={() => {
59be474dd8S猫头猫        // todo 修改
60be474dd8S猫头猫        data.length > 10 &&
61be474dd8S猫头猫          searchState === SearchStateCode.PARTLY_DONE &&
62be474dd8S猫头猫          search(undefined, pluginHash);
633a76c6afS猫头猫      }}
64be474dd8S猫头猫      renderItem={renderItem}></FlatList>
6592a7e801S猫头猫  );
66bf6e62f2S猫头猫}
67*4f2deeb0S猫头猫const style = StyleSheet.create({
68*4f2deeb0S猫头猫  list: {
69*4f2deeb0S猫头猫    flex: 1,
70*4f2deeb0S猫头猫  },
71*4f2deeb0S猫头猫});
72