xref: /MusicFree/src/components/musicBar/index.tsx (revision 00d0309bdacea3d3e936a22722ce86c6f7c6ecce)
1bf6e62f2S猫头猫import React, {Fragment, useEffect, useState} from 'react';
2*00d0309bS猫头猫import {
3*00d0309bS猫头猫  Keyboard,
4*00d0309bS猫头猫  Pressable,
5*00d0309bS猫头猫  StyleSheet,
6*00d0309bS猫头猫  Text,
7*00d0309bS猫头猫  ToastAndroid,
8*00d0309bS猫头猫  View,
9*00d0309bS猫头猫} from 'react-native';
10bf6e62f2S猫头猫import rpx from '@/utils/rpx';
11bf6e62f2S猫头猫import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
12bf6e62f2S猫头猫import useTextColor from '@/hooks/useTextColor';
13bf6e62f2S猫头猫import MusicQueue from '@/common/musicQueue';
14bf6e62f2S猫头猫import {Avatar, IconButton, Portal, useTheme} from 'react-native-paper';
15bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator';
16bf6e62f2S猫头猫import {useNavigation} from '@react-navigation/native';
17bf6e62f2S猫头猫import {ROUTE_PATH} from '@/entry/router';
18bf6e62f2S猫头猫
19bf6e62f2S猫头猫import musicIsPaused from '@/utils/musicIsPaused';
20378a6099S猫头猫import usePanel from '../panels/usePanel';
21bf6e62f2S猫头猫import Color from 'color';
2219dc08ecS猫头猫import ThemeText from '../base/themeText';
231befdbcdS猫头猫import {ImgAsset} from '@/constants/assetsConst';
24bf6e62f2S猫头猫
25bf6e62f2S猫头猫interface IProps {}
26bf6e62f2S猫头猫export default function (props: IProps) {
27bf6e62f2S猫头猫  // const currentMusicState = useAtomValue(loadableCurrentMusicStateAtom);
28bf6e62f2S猫头猫  const musicItem = MusicQueue.useCurrentMusicItem();
29bf6e62f2S猫头猫  const musicState = MusicQueue.usePlaybackState();
30*00d0309bS猫头猫  const [showKeyboard, setKeyboardStatus] = useState(false);
3108a8e62cS猫头猫  const {showPanel} = usePanel();
32bf6e62f2S猫头猫  const navigation = useNavigation<any>();
33bf6e62f2S猫头猫  const progress = MusicQueue.useProgress();
34bf6e62f2S猫头猫  const {colors} = useTheme();
35bf6e62f2S猫头猫
36*00d0309bS猫头猫  console.log(musicItem, showKeyboard);
37*00d0309bS猫头猫
38*00d0309bS猫头猫  useEffect(() => {
39*00d0309bS猫头猫    const showSubscription = Keyboard.addListener('keyboardDidShow', () => {
40*00d0309bS猫头猫      setKeyboardStatus(true);
41*00d0309bS猫头猫    });
42*00d0309bS猫头猫    const hideSubscription = Keyboard.addListener('keyboardDidHide', () => {
43*00d0309bS猫头猫      setKeyboardStatus(false);
44*00d0309bS猫头猫    });
45*00d0309bS猫头猫
46*00d0309bS猫头猫    return () => {
47*00d0309bS猫头猫      showSubscription.remove();
48*00d0309bS猫头猫      hideSubscription.remove();
49*00d0309bS猫头猫    };
50*00d0309bS猫头猫  }, []);
51*00d0309bS猫头猫
52bf6e62f2S猫头猫  return (
53bf6e62f2S猫头猫    <Fragment>
54*00d0309bS猫头猫      {musicItem && !showKeyboard && (
55bf6e62f2S猫头猫        <Pressable
56bf6e62f2S猫头猫          style={[
57bf6e62f2S猫头猫            style.wrapper,
5808a8e62cS猫头猫            {backgroundColor: Color(colors.primary).alpha(0.66).toString()},
59bf6e62f2S猫头猫          ]}
60bf6e62f2S猫头猫          onPress={() => {
61bf6e62f2S猫头猫            navigation.navigate(ROUTE_PATH.MUSIC_DETAIL);
62bf6e62f2S猫头猫          }}>
63bf6e62f2S猫头猫          <View style={style.artworkWrapper}>
64bf6e62f2S猫头猫            <Avatar.Image
65bf6e62f2S猫头猫              size={rpx(96)}
661befdbcdS猫头猫              source={
671befdbcdS猫头猫                musicItem.artwork
681befdbcdS猫头猫                  ? {
69bf6e62f2S猫头猫                      uri: musicItem.artwork,
701befdbcdS猫头猫                    }
711befdbcdS猫头猫                  : ImgAsset.albumDefault
721befdbcdS猫头猫              }></Avatar.Image>
73bf6e62f2S猫头猫          </View>
74bf6e62f2S猫头猫          <Text
75bf6e62f2S猫头猫            ellipsizeMode="tail"
76bf6e62f2S猫头猫            style={style.textWrapper}
77bf6e62f2S猫头猫            numberOfLines={1}>
781befdbcdS猫头猫            <ThemeText fontSize="content">{musicItem.title}</ThemeText>
79bf6e62f2S猫头猫            {musicItem?.artist && (
801befdbcdS猫头猫              <ThemeText fontSize="description" fontColor="secondary">
811befdbcdS猫头猫                {' '}
821befdbcdS猫头猫                -{musicItem.artist}
831befdbcdS猫头猫              </ThemeText>
84bf6e62f2S猫头猫            )}
85bf6e62f2S猫头猫          </Text>
86bf6e62f2S猫头猫          <View style={style.actionGroup}>
87bf6e62f2S猫头猫            <CircularProgressBase
88bf6e62f2S猫头猫              activeStrokeWidth={rpx(4)}
89bf6e62f2S猫头猫              inActiveStrokeWidth={rpx(2)}
90bf6e62f2S猫头猫              inActiveStrokeOpacity={0.2}
91bf6e62f2S猫头猫              value={
92bf6e62f2S猫头猫                progress?.duration
93bf6e62f2S猫头猫                  ? (100 * progress.position) / progress.duration
94bf6e62f2S猫头猫                  : 0
95bf6e62f2S猫头猫              }
96bf6e62f2S猫头猫              duration={100}
97bf6e62f2S猫头猫              radius={rpx(36)}
98bf6e62f2S猫头猫              activeStrokeColor={colors.text}
99bf6e62f2S猫头猫              inActiveStrokeColor={Color(colors.text).alpha(0.5).toString()}>
100bf6e62f2S猫头猫              {musicIsPaused(musicState) ? (
101bf6e62f2S猫头猫                <IconButton
102bf6e62f2S猫头猫                  icon="play"
103bf6e62f2S猫头猫                  size={rpx(48)}
104bf6e62f2S猫头猫                  onPress={async () => {
105bf6e62f2S猫头猫                    await MusicQueue.play();
106bf6e62f2S猫头猫                  }}
107bf6e62f2S猫头猫                />
108bf6e62f2S猫头猫              ) : (
109bf6e62f2S猫头猫                <IconButton
110bf6e62f2S猫头猫                  icon="pause"
111bf6e62f2S猫头猫                  size={rpx(48)}
112bf6e62f2S猫头猫                  onPress={async () => {
113bf6e62f2S猫头猫                    await MusicQueue.pause();
114bf6e62f2S猫头猫                  }}
115bf6e62f2S猫头猫                />
116bf6e62f2S猫头猫              )}
117bf6e62f2S猫头猫            </CircularProgressBase>
118bf6e62f2S猫头猫
119bf6e62f2S猫头猫            <Icon
120bf6e62f2S猫头猫              name="playlist-music"
121bf6e62f2S猫头猫              size={rpx(56)}
122bf6e62f2S猫头猫              onPress={() => {
123bf6e62f2S猫头猫                showPanel('PlayList');
124bf6e62f2S猫头猫              }}
125bf6e62f2S猫头猫              style={[style.actionIcon, {color: colors.text}]}></Icon>
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