xref: /MusicFree/src/components/musicBar/index.tsx (revision 42a9f3e6edf48cfb1acc40cd35cb6621e7f940e9)
1c446f2b8S猫头猫import React, {memo, useEffect, useState} from 'react';
2f511aee9S猫头猫import {Keyboard, StyleSheet, View} from 'react-native';
3bf6e62f2S猫头猫import rpx from '@/utils/rpx';
4bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator';
5bf6e62f2S猫头猫
6c446f2b8S猫头猫import {useSafeAreaInsets} from 'react-native-safe-area-context';
7c15039e2S猫头猫import {showPanel} from '../panels/usePanel';
8e650bfb3S猫头猫import useColors from '@/hooks/useColors';
9e650bfb3S猫头猫import IconButton from '../base/iconButton';
105500cea7S猫头猫import TrackPlayer from '@/core/trackPlayer';
115500cea7S猫头猫import {musicIsPaused} from '@/utils/trackUtils';
12f511aee9S猫头猫import MusicInfo from './musicInfo';
135589cdf3S猫头猫import Icon from '@/components/base/icon.tsx';
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
3795270b83S猫头猫                accessibilityLabel={'播放或暂停歌曲'}
38e650bfb3S猫头猫                name={isPaused ? 'play' : 'pause'}
39e650bfb3S猫头猫                sizeType={'normal'}
40*42a9f3e6Smaotoumao                hitSlop={{
41*42a9f3e6Smaotoumao                    top: 10,
42*42a9f3e6Smaotoumao                    left: 10,
43*42a9f3e6Smaotoumao                    right: 10,
44*42a9f3e6Smaotoumao                    bottom: 10,
45*42a9f3e6Smaotoumao                }}
46277c5280S猫头猫                color={colors.musicBarText}
47c9af9657S猫头猫                onPress={async () => {
489dc4d3f3S猫头猫                    if (isPaused) {
495500cea7S猫头猫                        await TrackPlayer.play();
509dc4d3f3S猫头猫                    } else {
515500cea7S猫头猫                        await TrackPlayer.pause();
529dc4d3f3S猫头猫                    }
53c9af9657S猫头猫                }}
54c9af9657S猫头猫            />
55c9af9657S猫头猫        </CircularProgressBase>
56c9af9657S猫头猫    );
57c9af9657S猫头猫}
58bec1e603S猫头猫function MusicBar() {
595500cea7S猫头猫    const musicItem = TrackPlayer.useCurrentMusic();
60c9af9657S猫头猫
6100d0309bS猫头猫    const [showKeyboard, setKeyboardStatus] = useState(false);
62c15039e2S猫头猫
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 && (
83f511aee9S猫头猫                <View
84bf6e62f2S猫头猫                    style={[
85bf6e62f2S猫头猫                        style.wrapper,
864060c00aS猫头猫                        {
87e650bfb3S猫头猫                            backgroundColor: colors.musicBar,
883b155a65S猫头猫                            paddingRight: safeAreaInsets.right + rpx(24),
894060c00aS猫头猫                        },
90bf6e62f2S猫头猫                    ]}
919dc4d3f3S猫头猫                    accessible
929dc4d3f3S猫头猫                    accessibilityLabel={`歌曲: ${musicItem.title} 歌手: ${musicItem.artist}`}
93f511aee9S猫头猫                    // onPress={() => {
94f511aee9S猫头猫                    //     navigate(ROUTE_PATH.MUSIC_DETAIL);
95f511aee9S猫头猫                    // }}
96f511aee9S猫头猫                >
97f511aee9S猫头猫                    <MusicInfo musicItem={musicItem} />
98bf6e62f2S猫头猫                    <View style={style.actionGroup}>
99c9af9657S猫头猫                        <CircularPlayBtn />
100bf6e62f2S猫头猫                        <Icon
1019dc4d3f3S猫头猫                            accessible
1029dc4d3f3S猫头猫                            accessibilityLabel="播放列表"
1035589cdf3S猫头猫                            name="playlist"
104bf6e62f2S猫头猫                            size={rpx(56)}
105bf6e62f2S猫头猫                            onPress={() => {
106bf6e62f2S猫头猫                                showPanel('PlayList');
107bf6e62f2S猫头猫                            }}
1085589cdf3S猫头猫                            color={colors.musicBarText}
1095589cdf3S猫头猫                            style={[style.actionIcon]}
1104060c00aS猫头猫                        />
111bf6e62f2S猫头猫                    </View>
112f511aee9S猫头猫                </View>
113bf6e62f2S猫头猫            )}
114c446f2b8S猫头猫        </>
115bf6e62f2S猫头猫    );
116bf6e62f2S猫头猫}
117bf6e62f2S猫头猫
118bec1e603S猫头猫export default memo(MusicBar, () => true);
119bec1e603S猫头猫
120bf6e62f2S猫头猫const style = StyleSheet.create({
121bf6e62f2S猫头猫    wrapper: {
122c446f2b8S猫头猫        width: '100%',
123e650bfb3S猫头猫        height: rpx(132),
124bf6e62f2S猫头猫        flexDirection: 'row',
125bf6e62f2S猫头猫        alignItems: 'center',
126f511aee9S猫头猫        paddingRight: rpx(24),
127bf6e62f2S猫头猫    },
128bf6e62f2S猫头猫    actionGroup: {
129bf6e62f2S猫头猫        width: rpx(200),
130bf6e62f2S猫头猫        justifyContent: 'flex-end',
131bf6e62f2S猫头猫        flexDirection: 'row',
132bf6e62f2S猫头猫        alignItems: 'center',
133bf6e62f2S猫头猫    },
134bf6e62f2S猫头猫    actionIcon: {
135bf6e62f2S猫头猫        marginLeft: rpx(36),
136bf6e62f2S猫头猫    },
137bf6e62f2S猫头猫});
138