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'; 13bf6e62f2S猫头猫 14bf6e62f2S猫头猫interface IResultSubPanelProps { 15bf6e62f2S猫头猫 tab: ICommon.SupportMediaType; 16bf6e62f2S猫头猫} 17bf6e62f2S猫头猫 18bf6e62f2S猫头猫// 展示结果的视图 194f2deeb0S猫头猫function getResultComponent( 204f2deeb0S猫头猫 tab: ICommon.SupportMediaType, 214f2deeb0S猫头猫 pluginHash: string, 224f2deeb0S猫头猫 pluginName: string, 234f2deeb0S猫头猫) { 24bf6e62f2S猫头猫 return tab in renderMap 25d139abf1S猫头猫 ? memo( 26a4ae8da5S猫头猫 () => { 27a4ae8da5S猫头猫 const searchResults = useAtomValue(searchResultsAtom); 28a4ae8da5S猫头猫 const pluginSearchResult = searchResults[tab][pluginHash]; 2922de5a24S猫头猫 const pluginSearchResultRef = useRef(pluginSearchResult); 3022de5a24S猫头猫 3122de5a24S猫头猫 useEffect(() => { 3222de5a24S猫头猫 pluginSearchResultRef.current = pluginSearchResult; 3322de5a24S猫头猫 }, [pluginSearchResult]); 3422de5a24S猫头猫 354060c00aS猫头猫 return ( 364060c00aS猫头猫 <ResultWrapper 374f2deeb0S猫头猫 tab={tab} 38a4ae8da5S猫头猫 searchResult={pluginSearchResult} 394f2deeb0S猫头猫 pluginHash={pluginHash} 404060c00aS猫头猫 pluginName={pluginName} 4122de5a24S猫头猫 pluginSearchResultRef={pluginSearchResultRef} 424060c00aS猫头猫 /> 434060c00aS猫头猫 ); 44a4ae8da5S猫头猫 }, 45d139abf1S猫头猫 () => true, 46d139abf1S猫头猫 ) 474060c00aS猫头猫 : () => <DefaultResults />; 48bf6e62f2S猫头猫} 49bf6e62f2S猫头猫 50bf6e62f2S猫头猫/** 结果scene */ 51bf6e62f2S猫头猫function getSubRouterScene( 52bf6e62f2S猫头猫 tab: ICommon.SupportMediaType, 53bf6e62f2S猫头猫 routes: Array<{key: string; title: string}>, 54bf6e62f2S猫头猫) { 55d139abf1S猫头猫 const scene: Record<string, React.FC> = {}; 56bf6e62f2S猫头猫 routes.forEach(r => { 57efb9da24S猫头猫 // todo: 是否声明不可搜索 589d40a3faS猫头猫 scene[r.key] = getResultComponent(tab, r.key, r.title); 59bf6e62f2S猫头猫 }); 60bf6e62f2S猫头猫 return SceneMap(scene); 61bf6e62f2S猫头猫} 62bf6e62f2S猫头猫 63d139abf1S猫头猫function ResultSubPanel(props: IResultSubPanelProps) { 64bf6e62f2S猫头猫 const [index, setIndex] = useState(0); 651119c2eaS猫头猫 const colors = useColors(); 66efb9da24S猫头猫 672b80a429S猫头猫 const routes = PluginManager.getSortedSearchablePlugins(props.tab).map( 682b80a429S猫头猫 _ => ({ 69d139abf1S猫头猫 key: _.hash, 709d40a3faS猫头猫 title: _.name, 712b80a429S猫头猫 }), 722b80a429S猫头猫 ); 732b80a429S猫头猫 const renderScene = useMemo( 742b80a429S猫头猫 () => getSubRouterScene(props.tab, routes), 752b80a429S猫头猫 [props.tab], 762b80a429S猫头猫 ); 77d139abf1S猫头猫 78bf6e62f2S猫头猫 return ( 79bf6e62f2S猫头猫 <TabView 800b940038S猫头猫 lazy 81bf6e62f2S猫头猫 navigationState={{ 82bf6e62f2S猫头猫 index, 83bf6e62f2S猫头猫 routes, 84bf6e62f2S猫头猫 }} 854060c00aS猫头猫 renderTabBar={_ => ( 86bf6e62f2S猫头猫 <TabBar 874060c00aS猫头猫 {..._} 88ef60be1cS猫头猫 scrollEnabled 89bf6e62f2S猫头猫 style={{ 90*ab55f125S猫头猫 backgroundColor: 'transparent', 91bf6e62f2S猫头猫 shadowColor: 'transparent', 92bf6e62f2S猫头猫 borderColor: 'transparent', 93bf6e62f2S猫头猫 }} 941119c2eaS猫头猫 inactiveColor={colors.text} 951119c2eaS猫头猫 activeColor={colors.primary} 96bf6e62f2S猫头猫 tabStyle={{ 971119c2eaS猫头猫 width: 'auto', 98bf6e62f2S猫头猫 }} 99bf6e62f2S猫头猫 renderIndicator={() => null} 100bf6e62f2S猫头猫 pressColor="transparent" 101bf6e62f2S猫头猫 renderLabel={({route, focused, color}) => ( 102bf6e62f2S猫头猫 <Text 1034f2deeb0S猫头猫 numberOfLines={1} 104bf6e62f2S猫头猫 style={{ 1051119c2eaS猫头猫 width: rpx(140), 106d139abf1S猫头猫 fontWeight: focused 107d139abf1S猫头猫 ? fontWeightConst.bolder 1081119c2eaS猫头猫 : fontWeightConst.medium, 109bf6e62f2S猫头猫 color, 1101119c2eaS猫头猫 textAlign: 'center', 111bf6e62f2S猫头猫 }}> 112bf6e62f2S猫头猫 {route.title ?? '(未命名)'} 113bf6e62f2S猫头猫 </Text> 1144060c00aS猫头猫 )} 1154060c00aS猫头猫 /> 116bf6e62f2S猫头猫 )} 1172b80a429S猫头猫 renderScene={renderScene} 118bf6e62f2S猫头猫 onIndexChange={setIndex} 1193b155a65S猫头猫 initialLayout={{width: vw(100)}} 1204060c00aS猫头猫 /> 121bf6e62f2S猫头猫 ); 122bf6e62f2S猫头猫} 123d139abf1S猫头猫 124d139abf1S猫头猫// 不然会一直重新渲染 125d139abf1S猫头猫export default memo(ResultSubPanel); 126