xref: /MusicFree/src/components/musicBar/index.tsx (revision f511aee942b46704ba24f02b787187ad201f6c10)
1c446f2b8S猫头猫import React, {memo, useEffect, useState} from 'react';
2*f511aee9S猫头猫import {Keyboard, StyleSheet, View} from 'react-native';
3bf6e62f2S猫头猫import rpx from '@/utils/rpx';
4bf6e62f2S猫头猫import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
5bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator';
6bf6e62f2S猫头猫
7c446f2b8S猫头猫import {useSafeAreaInsets} from 'react-native-safe-area-context';
8c15039e2S猫头猫import {showPanel} from '../panels/usePanel';
9e650bfb3S猫头猫import useColors from '@/hooks/useColors';
10e650bfb3S猫头猫import IconButton from '../base/iconButton';
115500cea7S猫头猫import TrackPlayer from '@/core/trackPlayer';
125500cea7S猫头猫import {musicIsPaused} from '@/utils/trackUtils';
13*f511aee9S猫头猫import MusicInfo from './musicInfo';
14bf6e62f2S猫头猫
15c9af9657S猫头猫function CircularPlayBtn() {
165500cea7S猫头猫    const progress = TrackPlayer.useProgress();
175500cea7S猫头猫    const musicState = TrackPlayer.useMusicState();
18e650bfb3S猫头猫    const colors = useColors();
19c9af9657S猫头猫
209dc4d3f3S猫头猫    const isPaused = musicIsPaused(musicState);
219dc4d3f3S猫头猫
22c9af9657S猫头猫    return (
23c9af9657S猫头猫        <CircularProgressBase
24c9af9657S猫头猫            activeStrokeWidth={rpx(4)}
25c9af9657S猫头猫            inActiveStrokeWidth={rpx(2)}
26c9af9657S猫头猫            inActiveStrokeOpacity={0.2}
27c9af9657S猫头猫            value={
28c9af9657S猫头猫                progress?.duration
29c9af9657S猫头猫                    ? (100 * progress.position) / progress.duration
30c9af9657S猫头猫                    : 0
31c9af9657S猫头猫            }
32c9af9657S猫头猫            duration={100}
33c9af9657S猫头猫            radius={rpx(36)}
34277c5280S猫头猫            activeStrokeColor={colors.musicBarText}
35277c5280S猫头猫            inActiveStrokeColor={colors.textSecondary}>
36c9af9657S猫头猫            <IconButton
379dc4d3f3S猫头猫                accessibilityLabel={isPaused ? '播放' : '暂停'}
38e650bfb3S猫头猫                name={isPaused ? 'play' : 'pause'}
39e650bfb3S猫头猫                sizeType={'normal'}
40277c5280S猫头猫                color={colors.musicBarText}
41c9af9657S猫头猫                onPress={async () => {
429dc4d3f3S猫头猫                    if (isPaused) {
435500cea7S猫头猫                        await TrackPlayer.play();
449dc4d3f3S猫头猫                    } else {
455500cea7S猫头猫                        await TrackPlayer.pause();
469dc4d3f3S猫头猫                    }
47c9af9657S猫头猫                }}
48c9af9657S猫头猫            />
49c9af9657S猫头猫        </CircularProgressBase>
50c9af9657S猫头猫    );
51c9af9657S猫头猫}
52bec1e603S猫头猫function MusicBar() {
535500cea7S猫头猫    const musicItem = TrackPlayer.useCurrentMusic();
54c9af9657S猫头猫
5500d0309bS猫头猫    const [showKeyboard, setKeyboardStatus] = useState(false);
56c15039e2S猫头猫
57e650bfb3S猫头猫    const colors = useColors();
58c446f2b8S猫头猫    const safeAreaInsets = useSafeAreaInsets();
59bf6e62f2S猫头猫
6000d0309bS猫头猫    useEffect(() => {
6100d0309bS猫头猫        const showSubscription = Keyboard.addListener('keyboardDidShow', () => {
6200d0309bS猫头猫            setKeyboardStatus(true);
6300d0309bS猫头猫        });
6400d0309bS猫头猫        const hideSubscription = Keyboard.addListener('keyboardDidHide', () => {
6500d0309bS猫头猫            setKeyboardStatus(false);
6600d0309bS猫头猫        });
6700d0309bS猫头猫
6800d0309bS猫头猫        return () => {
6900d0309bS猫头猫            showSubscription.remove();
7000d0309bS猫头猫            hideSubscription.remove();
7100d0309bS猫头猫        };
7200d0309bS猫头猫    }, []);
7300d0309bS猫头猫
74bf6e62f2S猫头猫    return (
75c446f2b8S猫头猫        <>
7600d0309bS猫头猫            {musicItem && !showKeyboard && (
77*f511aee9S猫头猫                <View
78bf6e62f2S猫头猫                    style={[
79bf6e62f2S猫头猫                        style.wrapper,
804060c00aS猫头猫                        {
81e650bfb3S猫头猫                            backgroundColor: colors.musicBar,
823b155a65S猫头猫                            paddingRight: safeAreaInsets.right + rpx(24),
834060c00aS猫头猫                        },
84bf6e62f2S猫头猫                    ]}
859dc4d3f3S猫头猫                    accessible
869dc4d3f3S猫头猫                    accessibilityLabel={`歌曲: ${musicItem.title} 歌手: ${musicItem.artist}`}
87*f511aee9S猫头猫                    // onPress={() => {
88*f511aee9S猫头猫                    //     navigate(ROUTE_PATH.MUSIC_DETAIL);
89*f511aee9S猫头猫                    // }}
90*f511aee9S猫头猫                >
91*f511aee9S猫头猫                    <MusicInfo musicItem={musicItem} />
92bf6e62f2S猫头猫                    <View style={style.actionGroup}>
93c9af9657S猫头猫                        <CircularPlayBtn />
94bf6e62f2S猫头猫                        <Icon
959dc4d3f3S猫头猫                            accessible
969dc4d3f3S猫头猫                            accessibilityLabel="播放列表"
97bf6e62f2S猫头猫                            name="playlist-music"
98bf6e62f2S猫头猫                            size={rpx(56)}
99bf6e62f2S猫头猫                            onPress={() => {
100bf6e62f2S猫头猫                                showPanel('PlayList');
101bf6e62f2S猫头猫                            }}
102277c5280S猫头猫                            style={[
103277c5280S猫头猫                                style.actionIcon,
104277c5280S猫头猫                                {color: colors.musicBarText},
105277c5280S猫头猫                            ]}
1064060c00aS猫头猫                        />
107bf6e62f2S猫头猫                    </View>
108*f511aee9S猫头猫                </View>
109bf6e62f2S猫头猫            )}
110c446f2b8S猫头猫        </>
111bf6e62f2S猫头猫    );
112bf6e62f2S猫头猫}
113bf6e62f2S猫头猫
114bec1e603S猫头猫export default memo(MusicBar, () => true);
115bec1e603S猫头猫
116bf6e62f2S猫头猫const style = StyleSheet.create({
117bf6e62f2S猫头猫    wrapper: {
118c446f2b8S猫头猫        width: '100%',
119e650bfb3S猫头猫        height: rpx(132),
120bf6e62f2S猫头猫        flexDirection: 'row',
121bf6e62f2S猫头猫        alignItems: 'center',
122*f511aee9S猫头猫        paddingRight: rpx(24),
123bf6e62f2S猫头猫    },
124bf6e62f2S猫头猫    actionGroup: {
125bf6e62f2S猫头猫        width: rpx(200),
126bf6e62f2S猫头猫        justifyContent: 'flex-end',
127bf6e62f2S猫头猫        flexDirection: 'row',
128bf6e62f2S猫头猫        alignItems: 'center',
129bf6e62f2S猫头猫    },
130bf6e62f2S猫头猫    actionIcon: {
131bf6e62f2S猫头猫        marginLeft: rpx(36),
132bf6e62f2S猫头猫    },
133bf6e62f2S猫头猫});
134