xref: /MusicFree/src/components/musicBar/index.tsx (revision bf6e62f27bf21a011995d7561e0093fae1a2d72e)
1*bf6e62f2S猫头猫import React, {Fragment, useEffect, useState} from 'react';
2*bf6e62f2S猫头猫import {Pressable, StyleSheet, Text, ToastAndroid, View} from 'react-native';
3*bf6e62f2S猫头猫import rpx from '@/utils/rpx';
4*bf6e62f2S猫头猫import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
5*bf6e62f2S猫头猫import useTextColor from '@/hooks/useTextColor';
6*bf6e62f2S猫头猫import MusicQueue from '@/common/musicQueue';
7*bf6e62f2S猫头猫import {Avatar, IconButton, Portal, useTheme} from 'react-native-paper';
8*bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator';
9*bf6e62f2S猫头猫import {useNavigation} from '@react-navigation/native';
10*bf6e62f2S猫头猫import {ROUTE_PATH} from '@/entry/router';
11*bf6e62f2S猫头猫
12*bf6e62f2S猫头猫import musicIsPaused from '@/utils/musicIsPaused';
13*bf6e62f2S猫头猫import usePanelShow from '../panels/usePanelShow';
14*bf6e62f2S猫头猫import {fontSizeConst} from '@/constants/uiConst';
15*bf6e62f2S猫头猫import Color from 'color';
16*bf6e62f2S猫头猫import ThemeText from '../themeText';
17*bf6e62f2S猫头猫
18*bf6e62f2S猫头猫interface IProps {}
19*bf6e62f2S猫头猫export default function (props: IProps) {
20*bf6e62f2S猫头猫  // const currentMusicState = useAtomValue(loadableCurrentMusicStateAtom);
21*bf6e62f2S猫头猫  const musicItem = MusicQueue.useCurrentMusicItem();
22*bf6e62f2S猫头猫  const musicState = MusicQueue.usePlaybackState();
23*bf6e62f2S猫头猫  const {showPanel} = usePanelShow();
24*bf6e62f2S猫头猫  const navigation = useNavigation<any>();
25*bf6e62f2S猫头猫  const progress = MusicQueue.useProgress();
26*bf6e62f2S猫头猫  const {colors} = useTheme();
27*bf6e62f2S猫头猫
28*bf6e62f2S猫头猫  return (
29*bf6e62f2S猫头猫    <Fragment>
30*bf6e62f2S猫头猫      {musicItem && (
31*bf6e62f2S猫头猫        <Pressable
32*bf6e62f2S猫头猫          style={[
33*bf6e62f2S猫头猫            style.wrapper,
34*bf6e62f2S猫头猫            {backgroundColor: Color(colors.primary).alpha(0.66).toString()},
35*bf6e62f2S猫头猫          ]}
36*bf6e62f2S猫头猫          onPress={() => {
37*bf6e62f2S猫头猫            navigation.navigate(ROUTE_PATH.MUSIC_DETAIL);
38*bf6e62f2S猫头猫          }}>
39*bf6e62f2S猫头猫          <View style={style.artworkWrapper}>
40*bf6e62f2S猫头猫            <Avatar.Image
41*bf6e62f2S猫头猫              size={rpx(96)}
42*bf6e62f2S猫头猫              source={{
43*bf6e62f2S猫头猫                uri: musicItem.artwork,
44*bf6e62f2S猫头猫              }}></Avatar.Image>
45*bf6e62f2S猫头猫          </View>
46*bf6e62f2S猫头猫          <Text
47*bf6e62f2S猫头猫            ellipsizeMode="tail"
48*bf6e62f2S猫头猫            style={style.textWrapper}
49*bf6e62f2S猫头猫            numberOfLines={1}>
50*bf6e62f2S猫头猫            <ThemeText style={style.title}>{musicItem.title}</ThemeText>
51*bf6e62f2S猫头猫            {musicItem?.artist && (
52*bf6e62f2S猫头猫              <ThemeText type="secondary"> -{musicItem.artist}</ThemeText>
53*bf6e62f2S猫头猫            )}
54*bf6e62f2S猫头猫          </Text>
55*bf6e62f2S猫头猫          <View style={style.actionGroup}>
56*bf6e62f2S猫头猫            <CircularProgressBase
57*bf6e62f2S猫头猫              activeStrokeWidth={rpx(4)}
58*bf6e62f2S猫头猫              inActiveStrokeWidth={rpx(2)}
59*bf6e62f2S猫头猫              inActiveStrokeOpacity={0.2}
60*bf6e62f2S猫头猫              value={
61*bf6e62f2S猫头猫                progress?.duration
62*bf6e62f2S猫头猫                  ? (100 * progress.position) / progress.duration
63*bf6e62f2S猫头猫                  : 0
64*bf6e62f2S猫头猫              }
65*bf6e62f2S猫头猫              duration={100}
66*bf6e62f2S猫头猫              radius={rpx(36)}
67*bf6e62f2S猫头猫              activeStrokeColor={colors.text}
68*bf6e62f2S猫头猫              inActiveStrokeColor={Color(colors.text).alpha(0.5).toString()}>
69*bf6e62f2S猫头猫              {musicIsPaused(musicState) ? (
70*bf6e62f2S猫头猫                <IconButton
71*bf6e62f2S猫头猫                  icon="play"
72*bf6e62f2S猫头猫                  size={rpx(48)}
73*bf6e62f2S猫头猫                  onPress={async () => {
74*bf6e62f2S猫头猫                    await MusicQueue.play();
75*bf6e62f2S猫头猫                  }}
76*bf6e62f2S猫头猫                />
77*bf6e62f2S猫头猫              ) : (
78*bf6e62f2S猫头猫                <IconButton
79*bf6e62f2S猫头猫                  icon="pause"
80*bf6e62f2S猫头猫                  size={rpx(48)}
81*bf6e62f2S猫头猫                  onPress={async () => {
82*bf6e62f2S猫头猫                    await MusicQueue.pause();
83*bf6e62f2S猫头猫                  }}
84*bf6e62f2S猫头猫                />
85*bf6e62f2S猫头猫              )}
86*bf6e62f2S猫头猫            </CircularProgressBase>
87*bf6e62f2S猫头猫
88*bf6e62f2S猫头猫            <Icon
89*bf6e62f2S猫头猫              name="playlist-music"
90*bf6e62f2S猫头猫              size={rpx(56)}
91*bf6e62f2S猫头猫              onPress={() => {
92*bf6e62f2S猫头猫                showPanel('PlayList');
93*bf6e62f2S猫头猫              }}
94*bf6e62f2S猫头猫              style={[style.actionIcon, {color: colors.text}]}></Icon>
95*bf6e62f2S猫头猫          </View>
96*bf6e62f2S猫头猫        </Pressable>
97*bf6e62f2S猫头猫      )}
98*bf6e62f2S猫头猫    </Fragment>
99*bf6e62f2S猫头猫  );
100*bf6e62f2S猫头猫}
101*bf6e62f2S猫头猫
102*bf6e62f2S猫头猫const style = StyleSheet.create({
103*bf6e62f2S猫头猫  wrapper: {
104*bf6e62f2S猫头猫    width: rpx(750),
105*bf6e62f2S猫头猫    height: rpx(120),
106*bf6e62f2S猫头猫    flexDirection: 'row',
107*bf6e62f2S猫头猫    alignItems: 'center',
108*bf6e62f2S猫头猫    paddingHorizontal: rpx(24),
109*bf6e62f2S猫头猫  },
110*bf6e62f2S猫头猫  artworkWrapper: {
111*bf6e62f2S猫头猫    height: rpx(120),
112*bf6e62f2S猫头猫    width: rpx(120),
113*bf6e62f2S猫头猫  },
114*bf6e62f2S猫头猫  textWrapper: {
115*bf6e62f2S猫头猫    flexGrow: 1,
116*bf6e62f2S猫头猫    maxWidth: rpx(382),
117*bf6e62f2S猫头猫  },
118*bf6e62f2S猫头猫  title: {
119*bf6e62f2S猫头猫    fontSize: fontSizeConst.normal,
120*bf6e62f2S猫头猫  },
121*bf6e62f2S猫头猫  author: {
122*bf6e62f2S猫头猫    fontSize: fontSizeConst.smaller,
123*bf6e62f2S猫头猫  },
124*bf6e62f2S猫头猫  actionGroup: {
125*bf6e62f2S猫头猫    width: rpx(200),
126*bf6e62f2S猫头猫    justifyContent: 'flex-end',
127*bf6e62f2S猫头猫    flexDirection: 'row',
128*bf6e62f2S猫头猫    alignItems: 'center',
129*bf6e62f2S猫头猫  },
130*bf6e62f2S猫头猫  actionIcon: {
131*bf6e62f2S猫头猫    marginLeft: rpx(36),
132*bf6e62f2S猫头猫  },
133*bf6e62f2S猫头猫});
134