1import React, {useState} from 'react'; 2import {StyleSheet} from 'react-native'; 3import rpx from '@/utils/rpx'; 4import MusicBar from '@/components/musicBar'; 5import SearchResult from './searchResult'; 6import StatusBar from '@/components/base/statusBar'; 7import useColors from '@/hooks/useColors'; 8import {fontSizeConst} from '@/constants/uiConst'; 9import {useParams} from '@/entry/router'; 10import globalStyle from '@/constants/globalStyle'; 11import VerticalSafeAreaView from '@/components/base/verticalSafeAreaView'; 12import Input from '@/components/base/input'; 13import AppBar from '@/components/base/appBar'; 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, musicSheet} = useParams<'search-music-list'>(); 28 const [result, setResult] = useState<IMusic.IMusicItem[]>(musicList ?? []); 29 const [query, setQuery] = useState(''); 30 31 const colors = useColors(); 32 33 const onChangeSearch = (_: string) => { 34 setQuery(_); 35 // useTransition做优化 36 setResult(filterMusic(_.trim(), musicList ?? [])); 37 }; 38 39 return ( 40 <VerticalSafeAreaView style={globalStyle.fwflex1}> 41 <StatusBar /> 42 <AppBar> 43 <Input 44 style={style.searchBar} 45 fontColor={colors.appBarText} 46 placeholder="在列表中搜索歌曲" 47 accessible 48 accessibilityLabel="搜索框" 49 accessibilityHint={'在列表中搜索歌曲'} 50 value={query} 51 onChangeText={onChangeSearch} 52 /> 53 </AppBar> 54 <SearchResult result={result} musicSheet={musicSheet} /> 55 <MusicBar /> 56 </VerticalSafeAreaView> 57 ); 58} 59 60const style = StyleSheet.create({ 61 appbar: { 62 shadowColor: 'transparent', 63 backgroundColor: '#2b333eaa', 64 }, 65 searchBar: { 66 minWidth: rpx(375), 67 flex: 1, 68 borderRadius: rpx(64), 69 height: rpx(64), 70 fontSize: rpx(32), 71 }, 72 input: { 73 padding: 0, 74 color: '#666666', 75 height: rpx(64), 76 fontSize: fontSizeConst.subTitle, 77 textAlignVertical: 'center', 78 includeFontPadding: false, 79 }, 80}); 81