xref: /MusicFree/src/components/musicBar/index.tsx (revision c9af9657d3a0536104c5305e90c801db5d9cac39)
1bf6e62f2S猫头猫import React, {Fragment, 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';
64060c00aS猫头猫import {Avatar, IconButton, useTheme} from 'react-native-paper';
7bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator';
8e7fa3837S猫头猫import {ROUTE_PATH, useNavigate} from '@/entry/router';
9bf6e62f2S猫头猫
10bf6e62f2S猫头猫import musicIsPaused from '@/utils/musicIsPaused';
11378a6099S猫头猫import usePanel from '../panels/usePanel';
12bf6e62f2S猫头猫import Color from 'color';
1319dc08ecS猫头猫import ThemeText from '../base/themeText';
141befdbcdS猫头猫import {ImgAsset} from '@/constants/assetsConst';
15bf6e62f2S猫头猫
16*c9af9657S猫头猫function CircularPlayBtn() {
17*c9af9657S猫头猫    const progress = MusicQueue.useProgress();
18*c9af9657S猫头猫    const musicState = MusicQueue.usePlaybackState();
19*c9af9657S猫头猫    const {colors} = useTheme();
20*c9af9657S猫头猫
21*c9af9657S猫头猫    return (
22*c9af9657S猫头猫        <CircularProgressBase
23*c9af9657S猫头猫            activeStrokeWidth={rpx(4)}
24*c9af9657S猫头猫            inActiveStrokeWidth={rpx(2)}
25*c9af9657S猫头猫            inActiveStrokeOpacity={0.2}
26*c9af9657S猫头猫            value={
27*c9af9657S猫头猫                progress?.duration
28*c9af9657S猫头猫                    ? (100 * progress.position) / progress.duration
29*c9af9657S猫头猫                    : 0
30*c9af9657S猫头猫            }
31*c9af9657S猫头猫            duration={100}
32*c9af9657S猫头猫            radius={rpx(36)}
33*c9af9657S猫头猫            activeStrokeColor={colors.text}
34*c9af9657S猫头猫            inActiveStrokeColor={Color(colors.text).alpha(0.5).toString()}>
35*c9af9657S猫头猫            {musicIsPaused(musicState) ? (
36*c9af9657S猫头猫                <IconButton
37*c9af9657S猫头猫                    icon="play"
38*c9af9657S猫头猫                    size={rpx(48)}
39*c9af9657S猫头猫                    onPress={async () => {
40*c9af9657S猫头猫                        await MusicQueue.play();
41*c9af9657S猫头猫                    }}
42*c9af9657S猫头猫                />
43*c9af9657S猫头猫            ) : (
44*c9af9657S猫头猫                <IconButton
45*c9af9657S猫头猫                    icon="pause"
46*c9af9657S猫头猫                    size={rpx(48)}
47*c9af9657S猫头猫                    onPress={async () => {
48*c9af9657S猫头猫                        await MusicQueue.pause();
49*c9af9657S猫头猫                    }}
50*c9af9657S猫头猫                />
51*c9af9657S猫头猫            )}
52*c9af9657S猫头猫        </CircularProgressBase>
53*c9af9657S猫头猫    );
54*c9af9657S猫头猫}
55*c9af9657S猫头猫
564060c00aS猫头猫export default function () {
57bf6e62f2S猫头猫    const musicItem = MusicQueue.useCurrentMusicItem();
58*c9af9657S猫头猫
5900d0309bS猫头猫    const [showKeyboard, setKeyboardStatus] = useState(false);
6008a8e62cS猫头猫    const {showPanel} = usePanel();
61e7fa3837S猫头猫    const navigate = useNavigate();
62bf6e62f2S猫头猫    const {colors} = useTheme();
63bf6e62f2S猫头猫
6400d0309bS猫头猫    useEffect(() => {
6500d0309bS猫头猫        const showSubscription = Keyboard.addListener('keyboardDidShow', () => {
6600d0309bS猫头猫            setKeyboardStatus(true);
6700d0309bS猫头猫        });
6800d0309bS猫头猫        const hideSubscription = Keyboard.addListener('keyboardDidHide', () => {
6900d0309bS猫头猫            setKeyboardStatus(false);
7000d0309bS猫头猫        });
7100d0309bS猫头猫
7200d0309bS猫头猫        return () => {
7300d0309bS猫头猫            showSubscription.remove();
7400d0309bS猫头猫            hideSubscription.remove();
7500d0309bS猫头猫        };
7600d0309bS猫头猫    }, []);
7700d0309bS猫头猫
78bf6e62f2S猫头猫    return (
79bf6e62f2S猫头猫        <Fragment>
8000d0309bS猫头猫            {musicItem && !showKeyboard && (
81bf6e62f2S猫头猫                <Pressable
82bf6e62f2S猫头猫                    style={[
83bf6e62f2S猫头猫                        style.wrapper,
844060c00aS猫头猫                        {
854060c00aS猫头猫                            backgroundColor: Color(colors.primary)
864060c00aS猫头猫                                .alpha(0.66)
874060c00aS猫头猫                                .toString(),
884060c00aS猫头猫                        },
89bf6e62f2S猫头猫                    ]}
90bf6e62f2S猫头猫                    onPress={() => {
91e7fa3837S猫头猫                        navigate(ROUTE_PATH.MUSIC_DETAIL);
92bf6e62f2S猫头猫                    }}>
93bf6e62f2S猫头猫                    <View style={style.artworkWrapper}>
94bf6e62f2S猫头猫                        <Avatar.Image
95bf6e62f2S猫头猫                            size={rpx(96)}
961befdbcdS猫头猫                            source={
971befdbcdS猫头猫                                musicItem.artwork
981befdbcdS猫头猫                                    ? {
99bf6e62f2S猫头猫                                          uri: musicItem.artwork,
1001befdbcdS猫头猫                                      }
1011befdbcdS猫头猫                                    : ImgAsset.albumDefault
1024060c00aS猫头猫                            }
1034060c00aS猫头猫                        />
104bf6e62f2S猫头猫                    </View>
105bf6e62f2S猫头猫                    <Text
106bf6e62f2S猫头猫                        ellipsizeMode="tail"
107bf6e62f2S猫头猫                        style={style.textWrapper}
108bf6e62f2S猫头猫                        numberOfLines={1}>
1094060c00aS猫头猫                        <ThemeText fontSize="content">
1104060c00aS猫头猫                            {musicItem.title}
1114060c00aS猫头猫                        </ThemeText>
112bf6e62f2S猫头猫                        {musicItem?.artist && (
1134060c00aS猫头猫                            <ThemeText
1144060c00aS猫头猫                                fontSize="description"
1154060c00aS猫头猫                                fontColor="secondary">
1161befdbcdS猫头猫                                {' '}
1171befdbcdS猫头猫                                -{musicItem.artist}
1181befdbcdS猫头猫                            </ThemeText>
119bf6e62f2S猫头猫                        )}
120bf6e62f2S猫头猫                    </Text>
121bf6e62f2S猫头猫                    <View style={style.actionGroup}>
122*c9af9657S猫头猫                        <CircularPlayBtn />
123bf6e62f2S猫头猫
124bf6e62f2S猫头猫                        <Icon
125bf6e62f2S猫头猫                            name="playlist-music"
126bf6e62f2S猫头猫                            size={rpx(56)}
127bf6e62f2S猫头猫                            onPress={() => {
128bf6e62f2S猫头猫                                showPanel('PlayList');
129bf6e62f2S猫头猫                            }}
1304060c00aS猫头猫                            style={[style.actionIcon, {color: colors.text}]}
1314060c00aS猫头猫                        />
132bf6e62f2S猫头猫                    </View>
133bf6e62f2S猫头猫                </Pressable>
134bf6e62f2S猫头猫            )}
135bf6e62f2S猫头猫        </Fragment>
136bf6e62f2S猫头猫    );
137bf6e62f2S猫头猫}
138bf6e62f2S猫头猫
139bf6e62f2S猫头猫const style = StyleSheet.create({
140bf6e62f2S猫头猫    wrapper: {
141bf6e62f2S猫头猫        width: rpx(750),
142bf6e62f2S猫头猫        height: rpx(120),
143bf6e62f2S猫头猫        flexDirection: 'row',
144bf6e62f2S猫头猫        alignItems: 'center',
145bf6e62f2S猫头猫        paddingHorizontal: rpx(24),
146bf6e62f2S猫头猫    },
147bf6e62f2S猫头猫    artworkWrapper: {
148bf6e62f2S猫头猫        height: rpx(120),
149bf6e62f2S猫头猫        width: rpx(120),
150bf6e62f2S猫头猫    },
151bf6e62f2S猫头猫    textWrapper: {
152bf6e62f2S猫头猫        flexGrow: 1,
153bf6e62f2S猫头猫        maxWidth: rpx(382),
154bf6e62f2S猫头猫    },
155bf6e62f2S猫头猫    actionGroup: {
156bf6e62f2S猫头猫        width: rpx(200),
157bf6e62f2S猫头猫        justifyContent: 'flex-end',
158bf6e62f2S猫头猫        flexDirection: 'row',
159bf6e62f2S猫头猫        alignItems: 'center',
160bf6e62f2S猫头猫    },
161bf6e62f2S猫头猫    actionIcon: {
162bf6e62f2S猫头猫        marginLeft: rpx(36),
163bf6e62f2S猫头猫    },
164bf6e62f2S猫头猫});
165