1c446f2b8S猫头猫import React, {memo, 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'; 6bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator'; 7e7fa3837S猫头猫import {ROUTE_PATH, useNavigate} from '@/entry/router'; 8bf6e62f2S猫头猫 9bf6e62f2S猫头猫import musicIsPaused from '@/utils/musicIsPaused'; 10c15039e2S猫头猫 11bf6e62f2S猫头猫import Color from 'color'; 1219dc08ecS猫头猫import ThemeText from '../base/themeText'; 131befdbcdS猫头猫import {ImgAsset} from '@/constants/assetsConst'; 14c446f2b8S猫头猫import {useSafeAreaInsets} from 'react-native-safe-area-context'; 15c15039e2S猫头猫import {showPanel} from '../panels/usePanel'; 16024e8a82S猫头猫import FastImage from '../base/fastImage'; 17e650bfb3S猫头猫import useColors from '@/hooks/useColors'; 18e650bfb3S猫头猫import IconButton from '../base/iconButton'; 19bf6e62f2S猫头猫 20c9af9657S猫头猫function CircularPlayBtn() { 21c9af9657S猫头猫 const progress = MusicQueue.useProgress(); 22c9af9657S猫头猫 const musicState = MusicQueue.usePlaybackState(); 23e650bfb3S猫头猫 const colors = useColors(); 24c9af9657S猫头猫 259dc4d3f3S猫头猫 const isPaused = musicIsPaused(musicState); 269dc4d3f3S猫头猫 27c9af9657S猫头猫 return ( 28c9af9657S猫头猫 <CircularProgressBase 29c9af9657S猫头猫 activeStrokeWidth={rpx(4)} 30c9af9657S猫头猫 inActiveStrokeWidth={rpx(2)} 31c9af9657S猫头猫 inActiveStrokeOpacity={0.2} 32c9af9657S猫头猫 value={ 33c9af9657S猫头猫 progress?.duration 34c9af9657S猫头猫 ? (100 * progress.position) / progress.duration 35c9af9657S猫头猫 : 0 36c9af9657S猫头猫 } 37c9af9657S猫头猫 duration={100} 38c9af9657S猫头猫 radius={rpx(36)} 39*277c5280S猫头猫 activeStrokeColor={colors.musicBarText} 40*277c5280S猫头猫 inActiveStrokeColor={colors.textSecondary}> 41c9af9657S猫头猫 <IconButton 429dc4d3f3S猫头猫 accessibilityLabel={isPaused ? '播放' : '暂停'} 43e650bfb3S猫头猫 name={isPaused ? 'play' : 'pause'} 44e650bfb3S猫头猫 sizeType={'normal'} 45*277c5280S猫头猫 color={colors.musicBarText} 46c9af9657S猫头猫 onPress={async () => { 479dc4d3f3S猫头猫 if (isPaused) { 48c9af9657S猫头猫 await MusicQueue.play(); 499dc4d3f3S猫头猫 } else { 50c9af9657S猫头猫 await MusicQueue.pause(); 519dc4d3f3S猫头猫 } 52c9af9657S猫头猫 }} 53c9af9657S猫头猫 /> 54c9af9657S猫头猫 </CircularProgressBase> 55c9af9657S猫头猫 ); 56c9af9657S猫头猫} 57bec1e603S猫头猫function MusicBar() { 58bf6e62f2S猫头猫 const musicItem = MusicQueue.useCurrentMusicItem(); 59c9af9657S猫头猫 6000d0309bS猫头猫 const [showKeyboard, setKeyboardStatus] = useState(false); 61c15039e2S猫头猫 62e7fa3837S猫头猫 const navigate = useNavigate(); 63e650bfb3S猫头猫 const colors = useColors(); 64c446f2b8S猫头猫 const safeAreaInsets = useSafeAreaInsets(); 65bf6e62f2S猫头猫 6600d0309bS猫头猫 useEffect(() => { 6700d0309bS猫头猫 const showSubscription = Keyboard.addListener('keyboardDidShow', () => { 6800d0309bS猫头猫 setKeyboardStatus(true); 6900d0309bS猫头猫 }); 7000d0309bS猫头猫 const hideSubscription = Keyboard.addListener('keyboardDidHide', () => { 7100d0309bS猫头猫 setKeyboardStatus(false); 7200d0309bS猫头猫 }); 7300d0309bS猫头猫 7400d0309bS猫头猫 return () => { 7500d0309bS猫头猫 showSubscription.remove(); 7600d0309bS猫头猫 hideSubscription.remove(); 7700d0309bS猫头猫 }; 7800d0309bS猫头猫 }, []); 7900d0309bS猫头猫 80bf6e62f2S猫头猫 return ( 81c446f2b8S猫头猫 <> 8200d0309bS猫头猫 {musicItem && !showKeyboard && ( 83bf6e62f2S猫头猫 <Pressable 84bf6e62f2S猫头猫 style={[ 85bf6e62f2S猫头猫 style.wrapper, 864060c00aS猫头猫 { 87e650bfb3S猫头猫 backgroundColor: colors.musicBar, 88c446f2b8S猫头猫 paddingLeft: safeAreaInsets.left + rpx(24), 893b155a65S猫头猫 paddingRight: safeAreaInsets.right + rpx(24), 904060c00aS猫头猫 }, 91bf6e62f2S猫头猫 ]} 929dc4d3f3S猫头猫 accessible 939dc4d3f3S猫头猫 accessibilityLabel={`歌曲: ${musicItem.title} 歌手: ${musicItem.artist}`} 94bf6e62f2S猫头猫 onPress={() => { 95e7fa3837S猫头猫 navigate(ROUTE_PATH.MUSIC_DETAIL); 96bf6e62f2S猫头猫 }}> 97bf6e62f2S猫头猫 <View style={style.artworkWrapper}> 98024e8a82S猫头猫 <FastImage 99024e8a82S猫头猫 style={style.artworkImg} 100024e8a82S猫头猫 uri={musicItem.artwork} 101024e8a82S猫头猫 emptySrc={ImgAsset.albumDefault} 1024060c00aS猫头猫 /> 103bf6e62f2S猫头猫 </View> 104bf6e62f2S猫头猫 <Text 105bf6e62f2S猫头猫 ellipsizeMode="tail" 1069dc4d3f3S猫头猫 accessible={false} 107bf6e62f2S猫头猫 style={style.textWrapper} 108bf6e62f2S猫头猫 numberOfLines={1}> 109*277c5280S猫头猫 <ThemeText fontSize="content" fontColor="musicBarText"> 1105e267aa1S猫头猫 {musicItem?.title} 1114060c00aS猫头猫 </ThemeText> 112bf6e62f2S猫头猫 {musicItem?.artist && ( 1134060c00aS猫头猫 <ThemeText 1144060c00aS猫头猫 fontSize="description" 115*277c5280S猫头猫 color={Color(colors.musicBarText) 116*277c5280S猫头猫 .alpha(0.6) 117*277c5280S猫头猫 .toString()}> 1181befdbcdS猫头猫 {' '} 1191befdbcdS猫头猫 -{musicItem.artist} 1201befdbcdS猫头猫 </ThemeText> 121bf6e62f2S猫头猫 )} 122bf6e62f2S猫头猫 </Text> 123bf6e62f2S猫头猫 <View style={style.actionGroup}> 124c9af9657S猫头猫 <CircularPlayBtn /> 125bf6e62f2S猫头猫 <Icon 1269dc4d3f3S猫头猫 accessible 1279dc4d3f3S猫头猫 accessibilityLabel="播放列表" 128bf6e62f2S猫头猫 name="playlist-music" 129bf6e62f2S猫头猫 size={rpx(56)} 130bf6e62f2S猫头猫 onPress={() => { 131bf6e62f2S猫头猫 showPanel('PlayList'); 132bf6e62f2S猫头猫 }} 133*277c5280S猫头猫 style={[ 134*277c5280S猫头猫 style.actionIcon, 135*277c5280S猫头猫 {color: colors.musicBarText}, 136*277c5280S猫头猫 ]} 1374060c00aS猫头猫 /> 138bf6e62f2S猫头猫 </View> 139bf6e62f2S猫头猫 </Pressable> 140bf6e62f2S猫头猫 )} 141c446f2b8S猫头猫 </> 142bf6e62f2S猫头猫 ); 143bf6e62f2S猫头猫} 144bf6e62f2S猫头猫 145bec1e603S猫头猫export default memo(MusicBar, () => true); 146bec1e603S猫头猫 147bf6e62f2S猫头猫const style = StyleSheet.create({ 148bf6e62f2S猫头猫 wrapper: { 149c446f2b8S猫头猫 width: '100%', 150e650bfb3S猫头猫 height: rpx(132), 151bf6e62f2S猫头猫 flexDirection: 'row', 152bf6e62f2S猫头猫 alignItems: 'center', 153bf6e62f2S猫头猫 paddingHorizontal: rpx(24), 154bf6e62f2S猫头猫 }, 155bf6e62f2S猫头猫 artworkWrapper: { 156bf6e62f2S猫头猫 height: rpx(120), 157bf6e62f2S猫头猫 width: rpx(120), 158e650bfb3S猫头猫 justifyContent: 'center', 159bf6e62f2S猫头猫 }, 160bf6e62f2S猫头猫 textWrapper: { 161bf6e62f2S猫头猫 flexGrow: 1, 162c446f2b8S猫头猫 flexShrink: 1, 163bf6e62f2S猫头猫 }, 164bf6e62f2S猫头猫 actionGroup: { 165bf6e62f2S猫头猫 width: rpx(200), 166bf6e62f2S猫头猫 justifyContent: 'flex-end', 167bf6e62f2S猫头猫 flexDirection: 'row', 168bf6e62f2S猫头猫 alignItems: 'center', 169bf6e62f2S猫头猫 }, 170bf6e62f2S猫头猫 actionIcon: { 171bf6e62f2S猫头猫 marginLeft: rpx(36), 172bf6e62f2S猫头猫 }, 173024e8a82S猫头猫 artworkImg: { 174024e8a82S猫头猫 width: rpx(96), 175024e8a82S猫头猫 height: rpx(96), 176024e8a82S猫头猫 borderRadius: rpx(48), 177024e8a82S猫头猫 }, 178bf6e62f2S猫头猫}); 179