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