xref: /MusicFree/src/pages/searchMusicList/index.tsx (revision cd669353b6a483aad2a61863c7df332c267907c6)
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