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 {SafeAreaView} from 'react-native-safe-area-context'; 11import {fontSizeConst} from '@/constants/uiConst'; 12import {useParams} from '@/entry/router'; 13 14function filterMusic(query: string, musicList: IMusic.IMusicItem[]) { 15 if (query?.length === 0) { 16 return musicList; 17 } 18 return musicList.filter(_ => 19 `${_.title} ${_.artist} ${_.album} ${_.platform}`.includes( 20 query.trim(), 21 ), 22 ); 23} 24 25export default function SearchMusicList() { 26 const {musicList} = useParams<'search-music-list'>(); 27 const navigation = useNavigation(); 28 const [result, setResult] = useState<IMusic.IMusicItem[]>(musicList ?? []); 29 const [query, setQuery] = useState(''); 30 31 const colors = useColors(); 32 33 const onChangeSearch = (_: string) => { 34 _ = _.trim(); 35 setQuery(_); 36 setResult(filterMusic(_, musicList ?? [])); 37 }; 38 39 return ( 40 <SafeAreaView style={style.wrapper}> 41 <StatusBar /> 42 <Appbar.Header 43 style={[style.appbar, {backgroundColor: colors.primary}]}> 44 <Appbar.BackAction 45 onPress={() => { 46 navigation.goBack(); 47 }} 48 /> 49 <Searchbar 50 style={style.searchBar} 51 inputStyle={style.input} 52 placeholder="在列表中搜索歌曲" 53 value={query} 54 onChangeText={onChangeSearch} 55 /> 56 </Appbar.Header> 57 <SearchResult result={result} /> 58 <MusicBar /> 59 </SafeAreaView> 60 ); 61} 62 63const style = StyleSheet.create({ 64 wrapper: { 65 width: rpx(750), 66 flex: 1, 67 }, 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