1import React, {useState} from 'react'; 2import {StyleSheet} from 'react-native'; 3import rpx from '@/utils/rpx'; 4import {useNavigation} from '@react-navigation/native'; 5import MusicBar from '@/components/musicBar'; 6import SearchResult from './searchResult'; 7import StatusBar from '@/components/base/statusBar'; 8import {Appbar, Searchbar} from 'react-native-paper'; 9import useColors from '@/hooks/useColors'; 10import {fontSizeConst} from '@/constants/uiConst'; 11import {useParams} from '@/entry/router'; 12import globalStyle from '@/constants/globalStyle'; 13import VerticalSafeAreaView from '@/components/base/verticalSafeAreaView'; 14 15function filterMusic(query: string, musicList: IMusic.IMusicItem[]) { 16 if (query?.length === 0) { 17 return musicList; 18 } 19 return musicList.filter(_ => 20 `${_.title} ${_.artist} ${_.album} ${_.platform}` 21 .toLowerCase() 22 .includes(query.toLowerCase()), 23 ); 24} 25 26export default function SearchMusicList() { 27 const {musicList} = useParams<'search-music-list'>(); 28 const navigation = useNavigation(); 29 const [result, setResult] = useState<IMusic.IMusicItem[]>(musicList ?? []); 30 const [query, setQuery] = useState(''); 31 32 const colors = useColors(); 33 34 const onChangeSearch = (_: string) => { 35 setQuery(_); 36 // useTransition做优化 37 setResult(filterMusic(_.trim(), musicList ?? [])); 38 }; 39 40 return ( 41 <VerticalSafeAreaView style={globalStyle.fwflex1}> 42 <StatusBar /> 43 <Appbar.Header 44 style={[style.appbar, {backgroundColor: colors.primary}]}> 45 <Appbar.BackAction 46 onPress={() => { 47 navigation.goBack(); 48 }} 49 /> 50 <Searchbar 51 style={style.searchBar} 52 inputStyle={style.input} 53 placeholder="在列表中搜索歌曲" 54 accessible 55 accessibilityLabel="搜索框" 56 accessibilityHint={'在列表中搜索歌曲'} 57 value={query} 58 onChangeText={onChangeSearch} 59 /> 60 </Appbar.Header> 61 <SearchResult result={result} /> 62 <MusicBar /> 63 </VerticalSafeAreaView> 64 ); 65} 66 67const style = StyleSheet.create({ 68 appbar: { 69 shadowColor: 'transparent', 70 backgroundColor: '#2b333eaa', 71 }, 72 searchBar: { 73 minWidth: rpx(375), 74 flex: 1, 75 borderRadius: rpx(64), 76 height: rpx(64), 77 color: '#666666', 78 }, 79 input: { 80 padding: 0, 81 color: '#666666', 82 height: rpx(64), 83 fontSize: fontSizeConst.subTitle, 84 textAlignVertical: 'center', 85 includeFontPadding: false, 86 }, 87}); 88