xref: /MusicFree/src/pages/searchMusicList/index.tsx (revision 831ada31f00b70ef30a6661c5f6940d0c755fbca)
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                    value={query}
55                    onChangeText={onChangeSearch}
56                />
57            </Appbar.Header>
58            <SearchResult result={result} />
59            <MusicBar />
60        </VerticalSafeAreaView>
61    );
62}
63
64const style = StyleSheet.create({
65    appbar: {
66        shadowColor: 'transparent',
67        backgroundColor: '#2b333eaa',
68    },
69    searchBar: {
70        minWidth: rpx(375),
71        flex: 1,
72        borderRadius: rpx(64),
73        height: rpx(64),
74        color: '#666666',
75    },
76    input: {
77        padding: 0,
78        color: '#666666',
79        height: rpx(64),
80        fontSize: fontSizeConst.subTitle,
81        textAlignVertical: 'center',
82        includeFontPadding: false,
83    },
84});
85