xref: /MusicFree/src/pages/searchPage/components/resultPanel/resultSubPanel.tsx (revision 0b940038696677ddf4d2a91434ce49a8383fecf4)
1d139abf1S猫头猫import React, {memo, useCallback, useEffect, useState} from 'react';
2bf6e62f2S猫头猫import {StyleSheet, Text, View} from 'react-native';
3bf6e62f2S猫头猫import rpx from '@/utils/rpx';
4bf6e62f2S猫头猫import {SceneMap, TabBar, TabView} from 'react-native-tab-view';
5d139abf1S猫头猫import {pluginManager, usePlugins} from '@/common/pluginManager';
6bf6e62f2S猫头猫import DefaultResults from './results/defaultResults';
7bf6e62f2S猫头猫import {renderMap} from './results';
8bf6e62f2S猫头猫import ResultWrapper from './resultWrapper';
9bf6e62f2S猫头猫import {fontWeightConst} from '@/constants/uiConst';
10bf6e62f2S猫头猫
11bf6e62f2S猫头猫interface IResultSubPanelProps {
12bf6e62f2S猫头猫  tab: ICommon.SupportMediaType;
13bf6e62f2S猫头猫}
14bf6e62f2S猫头猫
15bf6e62f2S猫头猫// 展示结果的视图
164f2deeb0S猫头猫function getResultComponent(
174f2deeb0S猫头猫  tab: ICommon.SupportMediaType,
184f2deeb0S猫头猫  pluginHash: string,
194f2deeb0S猫头猫  pluginName: string,
204f2deeb0S猫头猫) {
21bf6e62f2S猫头猫  return tab in renderMap
22d139abf1S猫头猫    ? memo(
234f2deeb0S猫头猫        () => (
244f2deeb0S猫头猫          <ResultWrapper
254f2deeb0S猫头猫            tab={tab}
264f2deeb0S猫头猫            pluginHash={pluginHash}
274f2deeb0S猫头猫            pluginName={pluginName}></ResultWrapper>
284f2deeb0S猫头猫        ),
29d139abf1S猫头猫        () => true,
30d139abf1S猫头猫      )
31bf6e62f2S猫头猫    : () => <DefaultResults></DefaultResults>;
32bf6e62f2S猫头猫}
33bf6e62f2S猫头猫
34bf6e62f2S猫头猫/** 结果scene */
35bf6e62f2S猫头猫function getSubRouterScene(
36bf6e62f2S猫头猫  tab: ICommon.SupportMediaType,
37bf6e62f2S猫头猫  routes: Array<{key: string; title: string}>,
38bf6e62f2S猫头猫) {
39d139abf1S猫头猫  const scene: Record<string, React.FC> = {};
40bf6e62f2S猫头猫  routes.forEach(r => {
419d40a3faS猫头猫    scene[r.key] = getResultComponent(tab, r.key, r.title);
42bf6e62f2S猫头猫  });
43bf6e62f2S猫头猫  return SceneMap(scene);
44bf6e62f2S猫头猫}
45bf6e62f2S猫头猫
46d139abf1S猫头猫function ResultSubPanel(props: IResultSubPanelProps) {
47bf6e62f2S猫头猫  const [index, setIndex] = useState(0);
489d40a3faS猫头猫  // todo 是否聚合结果,如果是的话
49*0b940038S猫头猫  const routes = pluginManager.getPlugins().map(_ => ({
50d139abf1S猫头猫    key: _.hash,
519d40a3faS猫头猫    title: _.name,
52*0b940038S猫头猫  }));
53d139abf1S猫头猫
54bf6e62f2S猫头猫  return (
55bf6e62f2S猫头猫    <TabView
56*0b940038S猫头猫      lazy
57bf6e62f2S猫头猫      navigationState={{
58bf6e62f2S猫头猫        index,
59bf6e62f2S猫头猫        routes,
60bf6e62f2S猫头猫      }}
61bf6e62f2S猫头猫      renderTabBar={props => (
62bf6e62f2S猫头猫        <TabBar
63bf6e62f2S猫头猫          {...props}
64bf6e62f2S猫头猫          style={{
65bf6e62f2S猫头猫            backgroundColor: 'transparent',
66bf6e62f2S猫头猫            shadowColor: 'transparent',
67bf6e62f2S猫头猫            borderColor: 'transparent',
68bf6e62f2S猫头猫          }}
69bf6e62f2S猫头猫          tabStyle={{
70bf6e62f2S猫头猫            width: rpx(128),
71bf6e62f2S猫头猫          }}
72bf6e62f2S猫头猫          renderIndicator={() => null}
73bf6e62f2S猫头猫          pressColor="transparent"
74bf6e62f2S猫头猫          renderLabel={({route, focused, color}) => (
75bf6e62f2S猫头猫            <Text
764f2deeb0S猫头猫              numberOfLines={1}
77bf6e62f2S猫头猫              style={{
78d139abf1S猫头猫                fontWeight: focused
79d139abf1S猫头猫                  ? fontWeightConst.bolder
80d139abf1S猫头猫                  : fontWeightConst.bold,
81bf6e62f2S猫头猫                color,
82bf6e62f2S猫头猫              }}>
83bf6e62f2S猫头猫              {route.title ?? '(未命名)'}
84bf6e62f2S猫头猫            </Text>
85bf6e62f2S猫头猫          )}></TabBar>
86bf6e62f2S猫头猫      )}
87d139abf1S猫头猫      renderScene={useCallback(getSubRouterScene(props.tab, routes), [
88d139abf1S猫头猫        props.tab,
89d139abf1S猫头猫      ])}
90bf6e62f2S猫头猫      onIndexChange={setIndex}
91bf6e62f2S猫头猫      initialLayout={{width: rpx(750)}}></TabView>
92bf6e62f2S猫头猫  );
93bf6e62f2S猫头猫}
94d139abf1S猫头猫
95d139abf1S猫头猫// 不然会一直重新渲染
96d139abf1S猫头猫export default memo(ResultSubPanel);
97