xref: /MusicFree/src/pages/searchPage/components/resultPanel/resultSubPanel.tsx (revision 4060c00a75883036bbd315fb25c90065209312b3)
1*4060c00aS猫头猫import React, {memo, useCallback, useState} from 'react';
2*4060c00aS猫头猫import {Text} from 'react-native';
3bf6e62f2S猫头猫import rpx from '@/utils/rpx';
4bf6e62f2S猫头猫import {SceneMap, TabBar, TabView} from 'react-native-tab-view';
5bf6e62f2S猫头猫import DefaultResults from './results/defaultResults';
6bf6e62f2S猫头猫import {renderMap} from './results';
7bf6e62f2S猫头猫import ResultWrapper from './resultWrapper';
8bf6e62f2S猫头猫import {fontWeightConst} from '@/constants/uiConst';
9a4ae8da5S猫头猫import {useAtomValue} from 'jotai';
10a4ae8da5S猫头猫import {searchResultsAtom} from '../../store/atoms';
11927dbe93S猫头猫import PluginManager from '@/core/pluginManager';
12bf6e62f2S猫头猫
13bf6e62f2S猫头猫interface IResultSubPanelProps {
14bf6e62f2S猫头猫    tab: ICommon.SupportMediaType;
15bf6e62f2S猫头猫}
16bf6e62f2S猫头猫
17bf6e62f2S猫头猫// 展示结果的视图
184f2deeb0S猫头猫function getResultComponent(
194f2deeb0S猫头猫    tab: ICommon.SupportMediaType,
204f2deeb0S猫头猫    pluginHash: string,
214f2deeb0S猫头猫    pluginName: string,
224f2deeb0S猫头猫) {
23bf6e62f2S猫头猫    return tab in renderMap
24d139abf1S猫头猫        ? memo(
25a4ae8da5S猫头猫              () => {
26a4ae8da5S猫头猫                  const searchResults = useAtomValue(searchResultsAtom);
27a4ae8da5S猫头猫                  const pluginSearchResult = searchResults[tab][pluginHash];
28*4060c00aS猫头猫                  return (
29*4060c00aS猫头猫                      <ResultWrapper
304f2deeb0S猫头猫                          tab={tab}
31a4ae8da5S猫头猫                          searchResult={pluginSearchResult}
324f2deeb0S猫头猫                          pluginHash={pluginHash}
33*4060c00aS猫头猫                          pluginName={pluginName}
34*4060c00aS猫头猫                      />
35*4060c00aS猫头猫                  );
36a4ae8da5S猫头猫              },
37d139abf1S猫头猫              () => true,
38d139abf1S猫头猫          )
39*4060c00aS猫头猫        : () => <DefaultResults />;
40bf6e62f2S猫头猫}
41bf6e62f2S猫头猫
42bf6e62f2S猫头猫/** 结果scene */
43bf6e62f2S猫头猫function getSubRouterScene(
44bf6e62f2S猫头猫    tab: ICommon.SupportMediaType,
45bf6e62f2S猫头猫    routes: Array<{key: string; title: string}>,
46bf6e62f2S猫头猫) {
47d139abf1S猫头猫    const scene: Record<string, React.FC> = {};
48bf6e62f2S猫头猫    routes.forEach(r => {
499d40a3faS猫头猫        scene[r.key] = getResultComponent(tab, r.key, r.title);
50bf6e62f2S猫头猫    });
51bf6e62f2S猫头猫    return SceneMap(scene);
52bf6e62f2S猫头猫}
53bf6e62f2S猫头猫
54d139abf1S猫头猫function ResultSubPanel(props: IResultSubPanelProps) {
55bf6e62f2S猫头猫    const [index, setIndex] = useState(0);
569d40a3faS猫头猫    // todo 是否聚合结果,如果是的话
578b88e961S猫头猫    const routes = PluginManager.getValidPlugins().map(_ => ({
58d139abf1S猫头猫        key: _.hash,
599d40a3faS猫头猫        title: _.name,
600b940038S猫头猫    }));
61d139abf1S猫头猫
62bf6e62f2S猫头猫    return (
63bf6e62f2S猫头猫        <TabView
640b940038S猫头猫            lazy
65bf6e62f2S猫头猫            navigationState={{
66bf6e62f2S猫头猫                index,
67bf6e62f2S猫头猫                routes,
68bf6e62f2S猫头猫            }}
69*4060c00aS猫头猫            renderTabBar={_ => (
70bf6e62f2S猫头猫                <TabBar
71*4060c00aS猫头猫                    {..._}
72bf6e62f2S猫头猫                    style={{
73bf6e62f2S猫头猫                        backgroundColor: 'transparent',
74bf6e62f2S猫头猫                        shadowColor: 'transparent',
75bf6e62f2S猫头猫                        borderColor: 'transparent',
76bf6e62f2S猫头猫                    }}
77bf6e62f2S猫头猫                    tabStyle={{
7820e2869eS猫头猫                        width: rpx(200),
79bf6e62f2S猫头猫                    }}
80bf6e62f2S猫头猫                    renderIndicator={() => null}
81bf6e62f2S猫头猫                    pressColor="transparent"
82bf6e62f2S猫头猫                    renderLabel={({route, focused, color}) => (
83bf6e62f2S猫头猫                        <Text
844f2deeb0S猫头猫                            numberOfLines={1}
85bf6e62f2S猫头猫                            style={{
86d139abf1S猫头猫                                fontWeight: focused
87d139abf1S猫头猫                                    ? fontWeightConst.bolder
88d139abf1S猫头猫                                    : fontWeightConst.bold,
89bf6e62f2S猫头猫                                color,
90bf6e62f2S猫头猫                            }}>
91bf6e62f2S猫头猫                            {route.title ?? '(未命名)'}
92bf6e62f2S猫头猫                        </Text>
93*4060c00aS猫头猫                    )}
94*4060c00aS猫头猫                />
95bf6e62f2S猫头猫            )}
96d139abf1S猫头猫            renderScene={useCallback(getSubRouterScene(props.tab, routes), [
97d139abf1S猫头猫                props.tab,
98d139abf1S猫头猫            ])}
99bf6e62f2S猫头猫            onIndexChange={setIndex}
100*4060c00aS猫头猫            initialLayout={{width: rpx(750)}}
101*4060c00aS猫头猫        />
102bf6e62f2S猫头猫    );
103bf6e62f2S猫头猫}
104d139abf1S猫头猫
105d139abf1S猫头猫// 不然会一直重新渲染
106d139abf1S猫头猫export default memo(ResultSubPanel);
107