xref: /MusicFree/src/pages/searchMusicList/index.tsx (revision 1fa77b042dffea2ad8db31c1b15672ed8f3755cf)
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                    accessible
55                    accessibilityLabel="搜索框"
56                    accessibilityHint={'在列表中搜索歌曲'}
57                    value={query}
58                    onChangeText={onChangeSearch}
59                />
60            </Appbar.Header>
61            <SearchResult result={result} />
62            <MusicBar />
63        </VerticalSafeAreaView>
64    );
65}
66
67const style = StyleSheet.create({
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