xref: /MusicFree/src/pages/searchPage/components/resultPanel/resultSubPanel.tsx (revision 10c78fce87d37af9c165962df888577d9ae5c14b)
12b80a429S猫头猫import React, {memo, useEffect, useMemo, useRef, useState} from 'react';
24060c00aS猫头猫import {Text} from 'react-native';
33b155a65S猫头猫import rpx, {vw} 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';
121119c2eaS猫头猫import useColors from '@/hooks/useColors';
13*10c78fceS猫头猫import Empty from '@/components/base/empty';
14bf6e62f2S猫头猫
15bf6e62f2S猫头猫interface IResultSubPanelProps {
16bf6e62f2S猫头猫    tab: ICommon.SupportMediaType;
17bf6e62f2S猫头猫}
18bf6e62f2S猫头猫
19bf6e62f2S猫头猫// 展示结果的视图
204f2deeb0S猫头猫function getResultComponent(
214f2deeb0S猫头猫    tab: ICommon.SupportMediaType,
224f2deeb0S猫头猫    pluginHash: string,
234f2deeb0S猫头猫    pluginName: string,
244f2deeb0S猫头猫) {
25bf6e62f2S猫头猫    return tab in renderMap
26d139abf1S猫头猫        ? memo(
27a4ae8da5S猫头猫              () => {
28a4ae8da5S猫头猫                  const searchResults = useAtomValue(searchResultsAtom);
29a4ae8da5S猫头猫                  const pluginSearchResult = searchResults[tab][pluginHash];
3022de5a24S猫头猫                  const pluginSearchResultRef = useRef(pluginSearchResult);
3122de5a24S猫头猫
3222de5a24S猫头猫                  useEffect(() => {
3322de5a24S猫头猫                      pluginSearchResultRef.current = pluginSearchResult;
3422de5a24S猫头猫                  }, [pluginSearchResult]);
3522de5a24S猫头猫
364060c00aS猫头猫                  return (
374060c00aS猫头猫                      <ResultWrapper
384f2deeb0S猫头猫                          tab={tab}
39a4ae8da5S猫头猫                          searchResult={pluginSearchResult}
404f2deeb0S猫头猫                          pluginHash={pluginHash}
414060c00aS猫头猫                          pluginName={pluginName}
4222de5a24S猫头猫                          pluginSearchResultRef={pluginSearchResultRef}
434060c00aS猫头猫                      />
444060c00aS猫头猫                  );
45a4ae8da5S猫头猫              },
46d139abf1S猫头猫              () => true,
47d139abf1S猫头猫          )
484060c00aS猫头猫        : () => <DefaultResults />;
49bf6e62f2S猫头猫}
50bf6e62f2S猫头猫
51bf6e62f2S猫头猫/** 结果scene */
52bf6e62f2S猫头猫function getSubRouterScene(
53bf6e62f2S猫头猫    tab: ICommon.SupportMediaType,
54bf6e62f2S猫头猫    routes: Array<{key: string; title: string}>,
55bf6e62f2S猫头猫) {
56d139abf1S猫头猫    const scene: Record<string, React.FC> = {};
57bf6e62f2S猫头猫    routes.forEach(r => {
58efb9da24S猫头猫        // todo: 是否声明不可搜索
599d40a3faS猫头猫        scene[r.key] = getResultComponent(tab, r.key, r.title);
60bf6e62f2S猫头猫    });
61bf6e62f2S猫头猫    return SceneMap(scene);
62bf6e62f2S猫头猫}
63bf6e62f2S猫头猫
64d139abf1S猫头猫function ResultSubPanel(props: IResultSubPanelProps) {
65bf6e62f2S猫头猫    const [index, setIndex] = useState(0);
661119c2eaS猫头猫    const colors = useColors();
67efb9da24S猫头猫
682b80a429S猫头猫    const routes = PluginManager.getSortedSearchablePlugins(props.tab).map(
692b80a429S猫头猫        _ => ({
70d139abf1S猫头猫            key: _.hash,
719d40a3faS猫头猫            title: _.name,
722b80a429S猫头猫        }),
732b80a429S猫头猫    );
742b80a429S猫头猫    const renderScene = useMemo(
752b80a429S猫头猫        () => getSubRouterScene(props.tab, routes),
762b80a429S猫头猫        [props.tab],
772b80a429S猫头猫    );
78d139abf1S猫头猫
79*10c78fceS猫头猫    if (!routes.length) {
80*10c78fceS猫头猫        return <Empty />;
81*10c78fceS猫头猫    }
82*10c78fceS猫头猫
83bf6e62f2S猫头猫    return (
84bf6e62f2S猫头猫        <TabView
850b940038S猫头猫            lazy
86bf6e62f2S猫头猫            navigationState={{
87bf6e62f2S猫头猫                index,
88bf6e62f2S猫头猫                routes,
89bf6e62f2S猫头猫            }}
904060c00aS猫头猫            renderTabBar={_ => (
91bf6e62f2S猫头猫                <TabBar
924060c00aS猫头猫                    {..._}
93ef60be1cS猫头猫                    scrollEnabled
94bf6e62f2S猫头猫                    style={{
95ab55f125S猫头猫                        backgroundColor: 'transparent',
96bf6e62f2S猫头猫                        shadowColor: 'transparent',
97bf6e62f2S猫头猫                        borderColor: 'transparent',
98bf6e62f2S猫头猫                    }}
991119c2eaS猫头猫                    inactiveColor={colors.text}
1001119c2eaS猫头猫                    activeColor={colors.primary}
101bf6e62f2S猫头猫                    tabStyle={{
1021119c2eaS猫头猫                        width: 'auto',
103bf6e62f2S猫头猫                    }}
104bf6e62f2S猫头猫                    renderIndicator={() => null}
105bf6e62f2S猫头猫                    pressColor="transparent"
106bf6e62f2S猫头猫                    renderLabel={({route, focused, color}) => (
107bf6e62f2S猫头猫                        <Text
1084f2deeb0S猫头猫                            numberOfLines={1}
109bf6e62f2S猫头猫                            style={{
1101119c2eaS猫头猫                                width: rpx(140),
111d139abf1S猫头猫                                fontWeight: focused
112d139abf1S猫头猫                                    ? fontWeightConst.bolder
1131119c2eaS猫头猫                                    : fontWeightConst.medium,
114bf6e62f2S猫头猫                                color,
1151119c2eaS猫头猫                                textAlign: 'center',
116bf6e62f2S猫头猫                            }}>
117bf6e62f2S猫头猫                            {route.title ?? '(未命名)'}
118bf6e62f2S猫头猫                        </Text>
1194060c00aS猫头猫                    )}
1204060c00aS猫头猫                />
121bf6e62f2S猫头猫            )}
1222b80a429S猫头猫            renderScene={renderScene}
123bf6e62f2S猫头猫            onIndexChange={setIndex}
1243b155a65S猫头猫            initialLayout={{width: vw(100)}}
1254060c00aS猫头猫        />
126bf6e62f2S猫头猫    );
127bf6e62f2S猫头猫}
128d139abf1S猫头猫
129d139abf1S猫头猫// 不然会一直重新渲染
130d139abf1S猫头猫export default memo(ResultSubPanel);
131