import React, {memo, useEffect, useMemo, useRef, useState} from 'react'; import {Text} from 'react-native'; import rpx, {vw} from '@/utils/rpx'; import {SceneMap, TabBar, TabView} from 'react-native-tab-view'; import DefaultResults from './results/defaultResults'; import {renderMap} from './results'; import ResultWrapper from './resultWrapper'; import {fontWeightConst} from '@/constants/uiConst'; import {useAtomValue} from 'jotai'; import {searchResultsAtom} from '../../store/atoms'; import PluginManager from '@/core/pluginManager'; import useColors from '@/hooks/useColors'; interface IResultSubPanelProps { tab: ICommon.SupportMediaType; } // 展示结果的视图 function getResultComponent( tab: ICommon.SupportMediaType, pluginHash: string, pluginName: string, ) { return tab in renderMap ? memo( () => { const searchResults = useAtomValue(searchResultsAtom); const pluginSearchResult = searchResults[tab][pluginHash]; const pluginSearchResultRef = useRef(pluginSearchResult); useEffect(() => { pluginSearchResultRef.current = pluginSearchResult; }, [pluginSearchResult]); return ( ); }, () => true, ) : () => ; } /** 结果scene */ function getSubRouterScene( tab: ICommon.SupportMediaType, routes: Array<{key: string; title: string}>, ) { const scene: Record = {}; routes.forEach(r => { // todo: 是否声明不可搜索 scene[r.key] = getResultComponent(tab, r.key, r.title); }); return SceneMap(scene); } function ResultSubPanel(props: IResultSubPanelProps) { const [index, setIndex] = useState(0); const colors = useColors(); const routes = PluginManager.getSortedSearchablePlugins(props.tab).map( _ => ({ key: _.hash, title: _.name, }), ); const renderScene = useMemo( () => getSubRouterScene(props.tab, routes), [props.tab], ); return ( ( null} pressColor="transparent" renderLabel={({route, focused, color}) => ( {route.title ?? '(未命名)'} )} /> )} renderScene={renderScene} onIndexChange={setIndex} initialLayout={{width: vw(100)}} /> ); } // 不然会一直重新渲染 export default memo(ResultSubPanel);