xref: /MusicFree/src/pages/searchMusicList/index.tsx (revision 9501a53846abeb6e52d388c9c5031f73671944ef)
1import React, {useState} from 'react';
2import {StyleSheet} from 'react-native';
3import rpx from '@/utils/rpx';
4import {useNavigation, useRoute} 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';
12
13function filterMusic(query: string, musicList: IMusic.IMusicItem[]) {
14    if (query?.length === 0) {
15        return musicList;
16    }
17    return musicList.filter(_ =>
18        `${_.title} ${_.artist} ${_.album} ${_.platform}`.includes(
19            query.trim(),
20        ),
21    );
22}
23
24export default function SearchMusicList() {
25    const route = useRoute<any>();
26    const navigation = useNavigation();
27    const musicList: IMusic.IMusicItem[] = route.params?.musicList ?? [];
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