xref: /MusicFree/src/components/musicBar/index.tsx (revision 4060c00a75883036bbd315fb25c90065209312b3)
1bf6e62f2S猫头猫import React, {Fragment, useEffect, useState} from 'react';
2*4060c00aS猫头猫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';
6*4060c00aS猫头猫import {Avatar, IconButton, useTheme} from 'react-native-paper';
7bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator';
8bf6e62f2S猫头猫import {useNavigation} from '@react-navigation/native';
9bf6e62f2S猫头猫import {ROUTE_PATH} from '@/entry/router';
10bf6e62f2S猫头猫
11bf6e62f2S猫头猫import musicIsPaused from '@/utils/musicIsPaused';
12378a6099S猫头猫import usePanel from '../panels/usePanel';
13bf6e62f2S猫头猫import Color from 'color';
1419dc08ecS猫头猫import ThemeText from '../base/themeText';
151befdbcdS猫头猫import {ImgAsset} from '@/constants/assetsConst';
16bf6e62f2S猫头猫
17*4060c00aS猫头猫export default function () {
18bf6e62f2S猫头猫    // const currentMusicState = useAtomValue(loadableCurrentMusicStateAtom);
19bf6e62f2S猫头猫    const musicItem = MusicQueue.useCurrentMusicItem();
20bf6e62f2S猫头猫    const musicState = MusicQueue.usePlaybackState();
2100d0309bS猫头猫    const [showKeyboard, setKeyboardStatus] = useState(false);
2208a8e62cS猫头猫    const {showPanel} = usePanel();
23bf6e62f2S猫头猫    const navigation = useNavigation<any>();
24bf6e62f2S猫头猫    const progress = MusicQueue.useProgress();
25bf6e62f2S猫头猫    const {colors} = useTheme();
26bf6e62f2S猫头猫
2700d0309bS猫头猫    useEffect(() => {
2800d0309bS猫头猫        const showSubscription = Keyboard.addListener('keyboardDidShow', () => {
2900d0309bS猫头猫            setKeyboardStatus(true);
3000d0309bS猫头猫        });
3100d0309bS猫头猫        const hideSubscription = Keyboard.addListener('keyboardDidHide', () => {
3200d0309bS猫头猫            setKeyboardStatus(false);
3300d0309bS猫头猫        });
3400d0309bS猫头猫
3500d0309bS猫头猫        return () => {
3600d0309bS猫头猫            showSubscription.remove();
3700d0309bS猫头猫            hideSubscription.remove();
3800d0309bS猫头猫        };
3900d0309bS猫头猫    }, []);
4000d0309bS猫头猫
41bf6e62f2S猫头猫    return (
42bf6e62f2S猫头猫        <Fragment>
4300d0309bS猫头猫            {musicItem && !showKeyboard && (
44bf6e62f2S猫头猫                <Pressable
45bf6e62f2S猫头猫                    style={[
46bf6e62f2S猫头猫                        style.wrapper,
47*4060c00aS猫头猫                        {
48*4060c00aS猫头猫                            backgroundColor: Color(colors.primary)
49*4060c00aS猫头猫                                .alpha(0.66)
50*4060c00aS猫头猫                                .toString(),
51*4060c00aS猫头猫                        },
52bf6e62f2S猫头猫                    ]}
53bf6e62f2S猫头猫                    onPress={() => {
54bf6e62f2S猫头猫                        navigation.navigate(ROUTE_PATH.MUSIC_DETAIL);
55bf6e62f2S猫头猫                    }}>
56bf6e62f2S猫头猫                    <View style={style.artworkWrapper}>
57bf6e62f2S猫头猫                        <Avatar.Image
58bf6e62f2S猫头猫                            size={rpx(96)}
591befdbcdS猫头猫                            source={
601befdbcdS猫头猫                                musicItem.artwork
611befdbcdS猫头猫                                    ? {
62bf6e62f2S猫头猫                                          uri: musicItem.artwork,
631befdbcdS猫头猫                                      }
641befdbcdS猫头猫                                    : ImgAsset.albumDefault
65*4060c00aS猫头猫                            }
66*4060c00aS猫头猫                        />
67bf6e62f2S猫头猫                    </View>
68bf6e62f2S猫头猫                    <Text
69bf6e62f2S猫头猫                        ellipsizeMode="tail"
70bf6e62f2S猫头猫                        style={style.textWrapper}
71bf6e62f2S猫头猫                        numberOfLines={1}>
72*4060c00aS猫头猫                        <ThemeText fontSize="content">
73*4060c00aS猫头猫                            {musicItem.title}
74*4060c00aS猫头猫                        </ThemeText>
75bf6e62f2S猫头猫                        {musicItem?.artist && (
76*4060c00aS猫头猫                            <ThemeText
77*4060c00aS猫头猫                                fontSize="description"
78*4060c00aS猫头猫                                fontColor="secondary">
791befdbcdS猫头猫                                {' '}
801befdbcdS猫头猫                                -{musicItem.artist}
811befdbcdS猫头猫                            </ThemeText>
82bf6e62f2S猫头猫                        )}
83bf6e62f2S猫头猫                    </Text>
84bf6e62f2S猫头猫                    <View style={style.actionGroup}>
85bf6e62f2S猫头猫                        <CircularProgressBase
86bf6e62f2S猫头猫                            activeStrokeWidth={rpx(4)}
87bf6e62f2S猫头猫                            inActiveStrokeWidth={rpx(2)}
88bf6e62f2S猫头猫                            inActiveStrokeOpacity={0.2}
89bf6e62f2S猫头猫                            value={
90bf6e62f2S猫头猫                                progress?.duration
91*4060c00aS猫头猫                                    ? (100 * progress.position) /
92*4060c00aS猫头猫                                      progress.duration
93bf6e62f2S猫头猫                                    : 0
94bf6e62f2S猫头猫                            }
95bf6e62f2S猫头猫                            duration={100}
96bf6e62f2S猫头猫                            radius={rpx(36)}
97bf6e62f2S猫头猫                            activeStrokeColor={colors.text}
98*4060c00aS猫头猫                            inActiveStrokeColor={Color(colors.text)
99*4060c00aS猫头猫                                .alpha(0.5)
100*4060c00aS猫头猫                                .toString()}>
101bf6e62f2S猫头猫                            {musicIsPaused(musicState) ? (
102bf6e62f2S猫头猫                                <IconButton
103bf6e62f2S猫头猫                                    icon="play"
104bf6e62f2S猫头猫                                    size={rpx(48)}
105bf6e62f2S猫头猫                                    onPress={async () => {
106bf6e62f2S猫头猫                                        await MusicQueue.play();
107bf6e62f2S猫头猫                                    }}
108bf6e62f2S猫头猫                                />
109bf6e62f2S猫头猫                            ) : (
110bf6e62f2S猫头猫                                <IconButton
111bf6e62f2S猫头猫                                    icon="pause"
112bf6e62f2S猫头猫                                    size={rpx(48)}
113bf6e62f2S猫头猫                                    onPress={async () => {
114bf6e62f2S猫头猫                                        await MusicQueue.pause();
115bf6e62f2S猫头猫                                    }}
116bf6e62f2S猫头猫                                />
117bf6e62f2S猫头猫                            )}
118bf6e62f2S猫头猫                        </CircularProgressBase>
119bf6e62f2S猫头猫
120bf6e62f2S猫头猫                        <Icon
121bf6e62f2S猫头猫                            name="playlist-music"
122bf6e62f2S猫头猫                            size={rpx(56)}
123bf6e62f2S猫头猫                            onPress={() => {
124bf6e62f2S猫头猫                                showPanel('PlayList');
125bf6e62f2S猫头猫                            }}
126*4060c00aS猫头猫                            style={[style.actionIcon, {color: colors.text}]}
127*4060c00aS猫头猫                        />
128bf6e62f2S猫头猫                    </View>
129bf6e62f2S猫头猫                </Pressable>
130bf6e62f2S猫头猫            )}
131bf6e62f2S猫头猫        </Fragment>
132bf6e62f2S猫头猫    );
133bf6e62f2S猫头猫}
134bf6e62f2S猫头猫
135bf6e62f2S猫头猫const style = StyleSheet.create({
136bf6e62f2S猫头猫    wrapper: {
137bf6e62f2S猫头猫        width: rpx(750),
138bf6e62f2S猫头猫        height: rpx(120),
139bf6e62f2S猫头猫        flexDirection: 'row',
140bf6e62f2S猫头猫        alignItems: 'center',
141bf6e62f2S猫头猫        paddingHorizontal: rpx(24),
142bf6e62f2S猫头猫    },
143bf6e62f2S猫头猫    artworkWrapper: {
144bf6e62f2S猫头猫        height: rpx(120),
145bf6e62f2S猫头猫        width: rpx(120),
146bf6e62f2S猫头猫    },
147bf6e62f2S猫头猫    textWrapper: {
148bf6e62f2S猫头猫        flexGrow: 1,
149bf6e62f2S猫头猫        maxWidth: rpx(382),
150bf6e62f2S猫头猫    },
151bf6e62f2S猫头猫    actionGroup: {
152bf6e62f2S猫头猫        width: rpx(200),
153bf6e62f2S猫头猫        justifyContent: 'flex-end',
154bf6e62f2S猫头猫        flexDirection: 'row',
155bf6e62f2S猫头猫        alignItems: 'center',
156bf6e62f2S猫头猫    },
157bf6e62f2S猫头猫    actionIcon: {
158bf6e62f2S猫头猫        marginLeft: rpx(36),
159bf6e62f2S猫头猫    },
160bf6e62f2S猫头猫});
161