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