xref: /MusicFree/src/components/musicBar/index.tsx (revision 277c528005b29b919b3eda695ee03717976a5a83)
1c446f2b8S猫头猫import React, {memo, useEffect, useState} from 'react';
24060c00aS猫头猫import {Keyboard, Pressable, StyleSheet, Text, View} from 'react-native';
3bf6e62f2S猫头猫import rpx from '@/utils/rpx';
4bf6e62f2S猫头猫import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
5242960d3S猫头猫import MusicQueue from '@/core/musicQueue';
6bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator';
7e7fa3837S猫头猫import {ROUTE_PATH, useNavigate} from '@/entry/router';
8bf6e62f2S猫头猫
9bf6e62f2S猫头猫import musicIsPaused from '@/utils/musicIsPaused';
10c15039e2S猫头猫
11bf6e62f2S猫头猫import Color from 'color';
1219dc08ecS猫头猫import ThemeText from '../base/themeText';
131befdbcdS猫头猫import {ImgAsset} from '@/constants/assetsConst';
14c446f2b8S猫头猫import {useSafeAreaInsets} from 'react-native-safe-area-context';
15c15039e2S猫头猫import {showPanel} from '../panels/usePanel';
16024e8a82S猫头猫import FastImage from '../base/fastImage';
17e650bfb3S猫头猫import useColors from '@/hooks/useColors';
18e650bfb3S猫头猫import IconButton from '../base/iconButton';
19bf6e62f2S猫头猫
20c9af9657S猫头猫function CircularPlayBtn() {
21c9af9657S猫头猫    const progress = MusicQueue.useProgress();
22c9af9657S猫头猫    const musicState = MusicQueue.usePlaybackState();
23e650bfb3S猫头猫    const colors = useColors();
24c9af9657S猫头猫
259dc4d3f3S猫头猫    const isPaused = musicIsPaused(musicState);
269dc4d3f3S猫头猫
27c9af9657S猫头猫    return (
28c9af9657S猫头猫        <CircularProgressBase
29c9af9657S猫头猫            activeStrokeWidth={rpx(4)}
30c9af9657S猫头猫            inActiveStrokeWidth={rpx(2)}
31c9af9657S猫头猫            inActiveStrokeOpacity={0.2}
32c9af9657S猫头猫            value={
33c9af9657S猫头猫                progress?.duration
34c9af9657S猫头猫                    ? (100 * progress.position) / progress.duration
35c9af9657S猫头猫                    : 0
36c9af9657S猫头猫            }
37c9af9657S猫头猫            duration={100}
38c9af9657S猫头猫            radius={rpx(36)}
39*277c5280S猫头猫            activeStrokeColor={colors.musicBarText}
40*277c5280S猫头猫            inActiveStrokeColor={colors.textSecondary}>
41c9af9657S猫头猫            <IconButton
429dc4d3f3S猫头猫                accessibilityLabel={isPaused ? '播放' : '暂停'}
43e650bfb3S猫头猫                name={isPaused ? 'play' : 'pause'}
44e650bfb3S猫头猫                sizeType={'normal'}
45*277c5280S猫头猫                color={colors.musicBarText}
46c9af9657S猫头猫                onPress={async () => {
479dc4d3f3S猫头猫                    if (isPaused) {
48c9af9657S猫头猫                        await MusicQueue.play();
499dc4d3f3S猫头猫                    } else {
50c9af9657S猫头猫                        await MusicQueue.pause();
519dc4d3f3S猫头猫                    }
52c9af9657S猫头猫                }}
53c9af9657S猫头猫            />
54c9af9657S猫头猫        </CircularProgressBase>
55c9af9657S猫头猫    );
56c9af9657S猫头猫}
57bec1e603S猫头猫function MusicBar() {
58bf6e62f2S猫头猫    const musicItem = MusicQueue.useCurrentMusicItem();
59c9af9657S猫头猫
6000d0309bS猫头猫    const [showKeyboard, setKeyboardStatus] = useState(false);
61c15039e2S猫头猫
62e7fa3837S猫头猫    const navigate = useNavigate();
63e650bfb3S猫头猫    const colors = useColors();
64c446f2b8S猫头猫    const safeAreaInsets = useSafeAreaInsets();
65bf6e62f2S猫头猫
6600d0309bS猫头猫    useEffect(() => {
6700d0309bS猫头猫        const showSubscription = Keyboard.addListener('keyboardDidShow', () => {
6800d0309bS猫头猫            setKeyboardStatus(true);
6900d0309bS猫头猫        });
7000d0309bS猫头猫        const hideSubscription = Keyboard.addListener('keyboardDidHide', () => {
7100d0309bS猫头猫            setKeyboardStatus(false);
7200d0309bS猫头猫        });
7300d0309bS猫头猫
7400d0309bS猫头猫        return () => {
7500d0309bS猫头猫            showSubscription.remove();
7600d0309bS猫头猫            hideSubscription.remove();
7700d0309bS猫头猫        };
7800d0309bS猫头猫    }, []);
7900d0309bS猫头猫
80bf6e62f2S猫头猫    return (
81c446f2b8S猫头猫        <>
8200d0309bS猫头猫            {musicItem && !showKeyboard && (
83bf6e62f2S猫头猫                <Pressable
84bf6e62f2S猫头猫                    style={[
85bf6e62f2S猫头猫                        style.wrapper,
864060c00aS猫头猫                        {
87e650bfb3S猫头猫                            backgroundColor: colors.musicBar,
88c446f2b8S猫头猫                            paddingLeft: safeAreaInsets.left + rpx(24),
893b155a65S猫头猫                            paddingRight: safeAreaInsets.right + rpx(24),
904060c00aS猫头猫                        },
91bf6e62f2S猫头猫                    ]}
929dc4d3f3S猫头猫                    accessible
939dc4d3f3S猫头猫                    accessibilityLabel={`歌曲: ${musicItem.title} 歌手: ${musicItem.artist}`}
94bf6e62f2S猫头猫                    onPress={() => {
95e7fa3837S猫头猫                        navigate(ROUTE_PATH.MUSIC_DETAIL);
96bf6e62f2S猫头猫                    }}>
97bf6e62f2S猫头猫                    <View style={style.artworkWrapper}>
98024e8a82S猫头猫                        <FastImage
99024e8a82S猫头猫                            style={style.artworkImg}
100024e8a82S猫头猫                            uri={musicItem.artwork}
101024e8a82S猫头猫                            emptySrc={ImgAsset.albumDefault}
1024060c00aS猫头猫                        />
103bf6e62f2S猫头猫                    </View>
104bf6e62f2S猫头猫                    <Text
105bf6e62f2S猫头猫                        ellipsizeMode="tail"
1069dc4d3f3S猫头猫                        accessible={false}
107bf6e62f2S猫头猫                        style={style.textWrapper}
108bf6e62f2S猫头猫                        numberOfLines={1}>
109*277c5280S猫头猫                        <ThemeText fontSize="content" fontColor="musicBarText">
1105e267aa1S猫头猫                            {musicItem?.title}
1114060c00aS猫头猫                        </ThemeText>
112bf6e62f2S猫头猫                        {musicItem?.artist && (
1134060c00aS猫头猫                            <ThemeText
1144060c00aS猫头猫                                fontSize="description"
115*277c5280S猫头猫                                color={Color(colors.musicBarText)
116*277c5280S猫头猫                                    .alpha(0.6)
117*277c5280S猫头猫                                    .toString()}>
1181befdbcdS猫头猫                                {' '}
1191befdbcdS猫头猫                                -{musicItem.artist}
1201befdbcdS猫头猫                            </ThemeText>
121bf6e62f2S猫头猫                        )}
122bf6e62f2S猫头猫                    </Text>
123bf6e62f2S猫头猫                    <View style={style.actionGroup}>
124c9af9657S猫头猫                        <CircularPlayBtn />
125bf6e62f2S猫头猫                        <Icon
1269dc4d3f3S猫头猫                            accessible
1279dc4d3f3S猫头猫                            accessibilityLabel="播放列表"
128bf6e62f2S猫头猫                            name="playlist-music"
129bf6e62f2S猫头猫                            size={rpx(56)}
130bf6e62f2S猫头猫                            onPress={() => {
131bf6e62f2S猫头猫                                showPanel('PlayList');
132bf6e62f2S猫头猫                            }}
133*277c5280S猫头猫                            style={[
134*277c5280S猫头猫                                style.actionIcon,
135*277c5280S猫头猫                                {color: colors.musicBarText},
136*277c5280S猫头猫                            ]}
1374060c00aS猫头猫                        />
138bf6e62f2S猫头猫                    </View>
139bf6e62f2S猫头猫                </Pressable>
140bf6e62f2S猫头猫            )}
141c446f2b8S猫头猫        </>
142bf6e62f2S猫头猫    );
143bf6e62f2S猫头猫}
144bf6e62f2S猫头猫
145bec1e603S猫头猫export default memo(MusicBar, () => true);
146bec1e603S猫头猫
147bf6e62f2S猫头猫const style = StyleSheet.create({
148bf6e62f2S猫头猫    wrapper: {
149c446f2b8S猫头猫        width: '100%',
150e650bfb3S猫头猫        height: rpx(132),
151bf6e62f2S猫头猫        flexDirection: 'row',
152bf6e62f2S猫头猫        alignItems: 'center',
153bf6e62f2S猫头猫        paddingHorizontal: rpx(24),
154bf6e62f2S猫头猫    },
155bf6e62f2S猫头猫    artworkWrapper: {
156bf6e62f2S猫头猫        height: rpx(120),
157bf6e62f2S猫头猫        width: rpx(120),
158e650bfb3S猫头猫        justifyContent: 'center',
159bf6e62f2S猫头猫    },
160bf6e62f2S猫头猫    textWrapper: {
161bf6e62f2S猫头猫        flexGrow: 1,
162c446f2b8S猫头猫        flexShrink: 1,
163bf6e62f2S猫头猫    },
164bf6e62f2S猫头猫    actionGroup: {
165bf6e62f2S猫头猫        width: rpx(200),
166bf6e62f2S猫头猫        justifyContent: 'flex-end',
167bf6e62f2S猫头猫        flexDirection: 'row',
168bf6e62f2S猫头猫        alignItems: 'center',
169bf6e62f2S猫头猫    },
170bf6e62f2S猫头猫    actionIcon: {
171bf6e62f2S猫头猫        marginLeft: rpx(36),
172bf6e62f2S猫头猫    },
173024e8a82S猫头猫    artworkImg: {
174024e8a82S猫头猫        width: rpx(96),
175024e8a82S猫头猫        height: rpx(96),
176024e8a82S猫头猫        borderRadius: rpx(48),
177024e8a82S猫头猫    },
178bf6e62f2S猫头猫});
179