xref: /MusicFree/src/components/musicBar/index.tsx (revision bec1e603c6b2f7d8e3a11b0c41d3499e77fd9167)
1*bec1e603S猫头猫import React, {Fragment, 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';
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猫头猫
16c9af9657S猫头猫function CircularPlayBtn() {
17c9af9657S猫头猫    const progress = MusicQueue.useProgress();
18c9af9657S猫头猫    const musicState = MusicQueue.usePlaybackState();
19c9af9657S猫头猫    const {colors} = useTheme();
20c9af9657S猫头猫
21c9af9657S猫头猫    return (
22c9af9657S猫头猫        <CircularProgressBase
23c9af9657S猫头猫            activeStrokeWidth={rpx(4)}
24c9af9657S猫头猫            inActiveStrokeWidth={rpx(2)}
25c9af9657S猫头猫            inActiveStrokeOpacity={0.2}
26c9af9657S猫头猫            value={
27c9af9657S猫头猫                progress?.duration
28c9af9657S猫头猫                    ? (100 * progress.position) / progress.duration
29c9af9657S猫头猫                    : 0
30c9af9657S猫头猫            }
31c9af9657S猫头猫            duration={100}
32c9af9657S猫头猫            radius={rpx(36)}
33c9af9657S猫头猫            activeStrokeColor={colors.text}
34c9af9657S猫头猫            inActiveStrokeColor={Color(colors.text).alpha(0.5).toString()}>
35c9af9657S猫头猫            {musicIsPaused(musicState) ? (
36c9af9657S猫头猫                <IconButton
37c9af9657S猫头猫                    icon="play"
38c9af9657S猫头猫                    size={rpx(48)}
39c9af9657S猫头猫                    onPress={async () => {
40c9af9657S猫头猫                        await MusicQueue.play();
41c9af9657S猫头猫                    }}
42c9af9657S猫头猫                />
43c9af9657S猫头猫            ) : (
44c9af9657S猫头猫                <IconButton
45c9af9657S猫头猫                    icon="pause"
46c9af9657S猫头猫                    size={rpx(48)}
47c9af9657S猫头猫                    onPress={async () => {
48c9af9657S猫头猫                        await MusicQueue.pause();
49c9af9657S猫头猫                    }}
50c9af9657S猫头猫                />
51c9af9657S猫头猫            )}
52c9af9657S猫头猫        </CircularProgressBase>
53c9af9657S猫头猫    );
54c9af9657S猫头猫}
55*bec1e603S猫头猫function MusicBar() {
56bf6e62f2S猫头猫    const musicItem = MusicQueue.useCurrentMusicItem();
57c9af9657S猫头猫
5800d0309bS猫头猫    const [showKeyboard, setKeyboardStatus] = useState(false);
5908a8e62cS猫头猫    const {showPanel} = usePanel();
60e7fa3837S猫头猫    const navigate = useNavigate();
61bf6e62f2S猫头猫    const {colors} = useTheme();
62bf6e62f2S猫头猫
6300d0309bS猫头猫    useEffect(() => {
6400d0309bS猫头猫        const showSubscription = Keyboard.addListener('keyboardDidShow', () => {
6500d0309bS猫头猫            setKeyboardStatus(true);
6600d0309bS猫头猫        });
6700d0309bS猫头猫        const hideSubscription = Keyboard.addListener('keyboardDidHide', () => {
6800d0309bS猫头猫            setKeyboardStatus(false);
6900d0309bS猫头猫        });
7000d0309bS猫头猫
7100d0309bS猫头猫        return () => {
7200d0309bS猫头猫            showSubscription.remove();
7300d0309bS猫头猫            hideSubscription.remove();
7400d0309bS猫头猫        };
7500d0309bS猫头猫    }, []);
7600d0309bS猫头猫
77bf6e62f2S猫头猫    return (
78bf6e62f2S猫头猫        <Fragment>
7900d0309bS猫头猫            {musicItem && !showKeyboard && (
80bf6e62f2S猫头猫                <Pressable
81bf6e62f2S猫头猫                    style={[
82bf6e62f2S猫头猫                        style.wrapper,
834060c00aS猫头猫                        {
844060c00aS猫头猫                            backgroundColor: Color(colors.primary)
854060c00aS猫头猫                                .alpha(0.66)
864060c00aS猫头猫                                .toString(),
874060c00aS猫头猫                        },
88bf6e62f2S猫头猫                    ]}
89bf6e62f2S猫头猫                    onPress={() => {
90e7fa3837S猫头猫                        navigate(ROUTE_PATH.MUSIC_DETAIL);
91bf6e62f2S猫头猫                    }}>
92bf6e62f2S猫头猫                    <View style={style.artworkWrapper}>
93bf6e62f2S猫头猫                        <Avatar.Image
94bf6e62f2S猫头猫                            size={rpx(96)}
951befdbcdS猫头猫                            source={
961befdbcdS猫头猫                                musicItem.artwork
971befdbcdS猫头猫                                    ? {
98bf6e62f2S猫头猫                                          uri: musicItem.artwork,
991befdbcdS猫头猫                                      }
1001befdbcdS猫头猫                                    : ImgAsset.albumDefault
1014060c00aS猫头猫                            }
1024060c00aS猫头猫                        />
103bf6e62f2S猫头猫                    </View>
104bf6e62f2S猫头猫                    <Text
105bf6e62f2S猫头猫                        ellipsizeMode="tail"
106bf6e62f2S猫头猫                        style={style.textWrapper}
107bf6e62f2S猫头猫                        numberOfLines={1}>
1084060c00aS猫头猫                        <ThemeText fontSize="content">
1094060c00aS猫头猫                            {musicItem.title}
1104060c00aS猫头猫                        </ThemeText>
111bf6e62f2S猫头猫                        {musicItem?.artist && (
1124060c00aS猫头猫                            <ThemeText
1134060c00aS猫头猫                                fontSize="description"
1144060c00aS猫头猫                                fontColor="secondary">
1151befdbcdS猫头猫                                {' '}
1161befdbcdS猫头猫                                -{musicItem.artist}
1171befdbcdS猫头猫                            </ThemeText>
118bf6e62f2S猫头猫                        )}
119bf6e62f2S猫头猫                    </Text>
120bf6e62f2S猫头猫                    <View style={style.actionGroup}>
121c9af9657S猫头猫                        <CircularPlayBtn />
122bf6e62f2S猫头猫
123bf6e62f2S猫头猫                        <Icon
124bf6e62f2S猫头猫                            name="playlist-music"
125bf6e62f2S猫头猫                            size={rpx(56)}
126bf6e62f2S猫头猫                            onPress={() => {
127bf6e62f2S猫头猫                                showPanel('PlayList');
128bf6e62f2S猫头猫                            }}
1294060c00aS猫头猫                            style={[style.actionIcon, {color: colors.text}]}
1304060c00aS猫头猫                        />
131bf6e62f2S猫头猫                    </View>
132bf6e62f2S猫头猫                </Pressable>
133bf6e62f2S猫头猫            )}
134bf6e62f2S猫头猫        </Fragment>
135bf6e62f2S猫头猫    );
136bf6e62f2S猫头猫}
137bf6e62f2S猫头猫
138*bec1e603S猫头猫export default memo(MusicBar, () => true);
139*bec1e603S猫头猫
140bf6e62f2S猫头猫const style = StyleSheet.create({
141bf6e62f2S猫头猫    wrapper: {
142bf6e62f2S猫头猫        width: rpx(750),
143bf6e62f2S猫头猫        height: rpx(120),
144bf6e62f2S猫头猫        flexDirection: 'row',
145bf6e62f2S猫头猫        alignItems: 'center',
146bf6e62f2S猫头猫        paddingHorizontal: rpx(24),
147bf6e62f2S猫头猫    },
148bf6e62f2S猫头猫    artworkWrapper: {
149bf6e62f2S猫头猫        height: rpx(120),
150bf6e62f2S猫头猫        width: rpx(120),
151bf6e62f2S猫头猫    },
152bf6e62f2S猫头猫    textWrapper: {
153bf6e62f2S猫头猫        flexGrow: 1,
154bf6e62f2S猫头猫        maxWidth: rpx(382),
155bf6e62f2S猫头猫    },
156bf6e62f2S猫头猫    actionGroup: {
157bf6e62f2S猫头猫        width: rpx(200),
158bf6e62f2S猫头猫        justifyContent: 'flex-end',
159bf6e62f2S猫头猫        flexDirection: 'row',
160bf6e62f2S猫头猫        alignItems: 'center',
161bf6e62f2S猫头猫    },
162bf6e62f2S猫头猫    actionIcon: {
163bf6e62f2S猫头猫        marginLeft: rpx(36),
164bf6e62f2S猫头猫    },
165bf6e62f2S猫头猫});
166