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}`.includes(query), 21 ); 22} 23 24export default function SearchMusicList() { 25 const {musicList} = useParams<'search-music-list'>(); 26 const navigation = useNavigation(); 27 const [result, setResult] = useState<IMusic.IMusicItem[]>(musicList ?? []); 28 const [query, setQuery] = useState(''); 29 30 const colors = useColors(); 31 32 const onChangeSearch = (_: string) => { 33 setQuery(_); 34 setResult(filterMusic(_.trim(), musicList ?? [])); 35 }; 36 37 return ( 38 <VerticalSafeAreaView style={globalStyle.fwflex1}> 39 <StatusBar /> 40 <Appbar.Header 41 style={[style.appbar, {backgroundColor: colors.primary}]}> 42 <Appbar.BackAction 43 onPress={() => { 44 navigation.goBack(); 45 }} 46 /> 47 <Searchbar 48 style={style.searchBar} 49 inputStyle={style.input} 50 placeholder="在列表中搜索歌曲" 51 value={query} 52 onChangeText={onChangeSearch} 53 /> 54 </Appbar.Header> 55 <SearchResult result={result} /> 56 <MusicBar /> 57 </VerticalSafeAreaView> 58 ); 59} 60 61const style = StyleSheet.create({ 62 appbar: { 63 shadowColor: 'transparent', 64 backgroundColor: '#2b333eaa', 65 }, 66 searchBar: { 67 minWidth: rpx(375), 68 flex: 1, 69 borderRadius: rpx(64), 70 height: rpx(64), 71 color: '#666666', 72 }, 73 input: { 74 padding: 0, 75 color: '#666666', 76 height: rpx(64), 77 fontSize: fontSizeConst.subTitle, 78 textAlignVertical: 'center', 79 includeFontPadding: false, 80 }, 81}); 82