xref: /MusicFree/src/components/musicBar/index.tsx (revision e7fa3837138cc7f9a5fa0fb610c27f442edfacc2)
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';
8*e7fa3837S猫头猫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猫头猫
164060c00aS猫头猫export default function () {
17bf6e62f2S猫头猫    const musicItem = MusicQueue.useCurrentMusicItem();
18bf6e62f2S猫头猫    const musicState = MusicQueue.usePlaybackState();
1900d0309bS猫头猫    const [showKeyboard, setKeyboardStatus] = useState(false);
2008a8e62cS猫头猫    const {showPanel} = usePanel();
21*e7fa3837S猫头猫    const navigate = useNavigate();
22bf6e62f2S猫头猫    const progress = MusicQueue.useProgress();
23bf6e62f2S猫头猫    const {colors} = useTheme();
24bf6e62f2S猫头猫
2500d0309bS猫头猫    useEffect(() => {
2600d0309bS猫头猫        const showSubscription = Keyboard.addListener('keyboardDidShow', () => {
2700d0309bS猫头猫            setKeyboardStatus(true);
2800d0309bS猫头猫        });
2900d0309bS猫头猫        const hideSubscription = Keyboard.addListener('keyboardDidHide', () => {
3000d0309bS猫头猫            setKeyboardStatus(false);
3100d0309bS猫头猫        });
3200d0309bS猫头猫
3300d0309bS猫头猫        return () => {
3400d0309bS猫头猫            showSubscription.remove();
3500d0309bS猫头猫            hideSubscription.remove();
3600d0309bS猫头猫        };
3700d0309bS猫头猫    }, []);
3800d0309bS猫头猫
39bf6e62f2S猫头猫    return (
40bf6e62f2S猫头猫        <Fragment>
4100d0309bS猫头猫            {musicItem && !showKeyboard && (
42bf6e62f2S猫头猫                <Pressable
43bf6e62f2S猫头猫                    style={[
44bf6e62f2S猫头猫                        style.wrapper,
454060c00aS猫头猫                        {
464060c00aS猫头猫                            backgroundColor: Color(colors.primary)
474060c00aS猫头猫                                .alpha(0.66)
484060c00aS猫头猫                                .toString(),
494060c00aS猫头猫                        },
50bf6e62f2S猫头猫                    ]}
51bf6e62f2S猫头猫                    onPress={() => {
52*e7fa3837S猫头猫                        navigate(ROUTE_PATH.MUSIC_DETAIL);
53bf6e62f2S猫头猫                    }}>
54bf6e62f2S猫头猫                    <View style={style.artworkWrapper}>
55bf6e62f2S猫头猫                        <Avatar.Image
56bf6e62f2S猫头猫                            size={rpx(96)}
571befdbcdS猫头猫                            source={
581befdbcdS猫头猫                                musicItem.artwork
591befdbcdS猫头猫                                    ? {
60bf6e62f2S猫头猫                                          uri: musicItem.artwork,
611befdbcdS猫头猫                                      }
621befdbcdS猫头猫                                    : ImgAsset.albumDefault
634060c00aS猫头猫                            }
644060c00aS猫头猫                        />
65bf6e62f2S猫头猫                    </View>
66bf6e62f2S猫头猫                    <Text
67bf6e62f2S猫头猫                        ellipsizeMode="tail"
68bf6e62f2S猫头猫                        style={style.textWrapper}
69bf6e62f2S猫头猫                        numberOfLines={1}>
704060c00aS猫头猫                        <ThemeText fontSize="content">
714060c00aS猫头猫                            {musicItem.title}
724060c00aS猫头猫                        </ThemeText>
73bf6e62f2S猫头猫                        {musicItem?.artist && (
744060c00aS猫头猫                            <ThemeText
754060c00aS猫头猫                                fontSize="description"
764060c00aS猫头猫                                fontColor="secondary">
771befdbcdS猫头猫                                {' '}
781befdbcdS猫头猫                                -{musicItem.artist}
791befdbcdS猫头猫                            </ThemeText>
80bf6e62f2S猫头猫                        )}
81bf6e62f2S猫头猫                    </Text>
82bf6e62f2S猫头猫                    <View style={style.actionGroup}>
83bf6e62f2S猫头猫                        <CircularProgressBase
84bf6e62f2S猫头猫                            activeStrokeWidth={rpx(4)}
85bf6e62f2S猫头猫                            inActiveStrokeWidth={rpx(2)}
86bf6e62f2S猫头猫                            inActiveStrokeOpacity={0.2}
87bf6e62f2S猫头猫                            value={
88bf6e62f2S猫头猫                                progress?.duration
894060c00aS猫头猫                                    ? (100 * progress.position) /
904060c00aS猫头猫                                      progress.duration
91bf6e62f2S猫头猫                                    : 0
92bf6e62f2S猫头猫                            }
93bf6e62f2S猫头猫                            duration={100}
94bf6e62f2S猫头猫                            radius={rpx(36)}
95bf6e62f2S猫头猫                            activeStrokeColor={colors.text}
964060c00aS猫头猫                            inActiveStrokeColor={Color(colors.text)
974060c00aS猫头猫                                .alpha(0.5)
984060c00aS猫头猫                                .toString()}>
99bf6e62f2S猫头猫                            {musicIsPaused(musicState) ? (
100bf6e62f2S猫头猫                                <IconButton
101bf6e62f2S猫头猫                                    icon="play"
102bf6e62f2S猫头猫                                    size={rpx(48)}
103bf6e62f2S猫头猫                                    onPress={async () => {
104bf6e62f2S猫头猫                                        await MusicQueue.play();
105bf6e62f2S猫头猫                                    }}
106bf6e62f2S猫头猫                                />
107bf6e62f2S猫头猫                            ) : (
108bf6e62f2S猫头猫                                <IconButton
109bf6e62f2S猫头猫                                    icon="pause"
110bf6e62f2S猫头猫                                    size={rpx(48)}
111bf6e62f2S猫头猫                                    onPress={async () => {
112bf6e62f2S猫头猫                                        await MusicQueue.pause();
113bf6e62f2S猫头猫                                    }}
114bf6e62f2S猫头猫                                />
115bf6e62f2S猫头猫                            )}
116bf6e62f2S猫头猫                        </CircularProgressBase>
117bf6e62f2S猫头猫
118bf6e62f2S猫头猫                        <Icon
119bf6e62f2S猫头猫                            name="playlist-music"
120bf6e62f2S猫头猫                            size={rpx(56)}
121bf6e62f2S猫头猫                            onPress={() => {
122bf6e62f2S猫头猫                                showPanel('PlayList');
123bf6e62f2S猫头猫                            }}
1244060c00aS猫头猫                            style={[style.actionIcon, {color: colors.text}]}
1254060c00aS猫头猫                        />
126bf6e62f2S猫头猫                    </View>
127bf6e62f2S猫头猫                </Pressable>
128bf6e62f2S猫头猫            )}
129bf6e62f2S猫头猫        </Fragment>
130bf6e62f2S猫头猫    );
131bf6e62f2S猫头猫}
132bf6e62f2S猫头猫
133bf6e62f2S猫头猫const style = StyleSheet.create({
134bf6e62f2S猫头猫    wrapper: {
135bf6e62f2S猫头猫        width: rpx(750),
136bf6e62f2S猫头猫        height: rpx(120),
137bf6e62f2S猫头猫        flexDirection: 'row',
138bf6e62f2S猫头猫        alignItems: 'center',
139bf6e62f2S猫头猫        paddingHorizontal: rpx(24),
140bf6e62f2S猫头猫    },
141bf6e62f2S猫头猫    artworkWrapper: {
142bf6e62f2S猫头猫        height: rpx(120),
143bf6e62f2S猫头猫        width: rpx(120),
144bf6e62f2S猫头猫    },
145bf6e62f2S猫头猫    textWrapper: {
146bf6e62f2S猫头猫        flexGrow: 1,
147bf6e62f2S猫头猫        maxWidth: rpx(382),
148bf6e62f2S猫头猫    },
149bf6e62f2S猫头猫    actionGroup: {
150bf6e62f2S猫头猫        width: rpx(200),
151bf6e62f2S猫头猫        justifyContent: 'flex-end',
152bf6e62f2S猫头猫        flexDirection: 'row',
153bf6e62f2S猫头猫        alignItems: 'center',
154bf6e62f2S猫头猫    },
155bf6e62f2S猫头猫    actionIcon: {
156bf6e62f2S猫头猫        marginLeft: rpx(36),
157bf6e62f2S猫头猫    },
158bf6e62f2S猫头猫});
159