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