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'; 5bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator'; 6e7fa3837S猫头猫import {ROUTE_PATH, useNavigate} from '@/entry/router'; 7bf6e62f2S猫头猫 8bf6e62f2S猫头猫import Color from 'color'; 919dc08ecS猫头猫import ThemeText from '../base/themeText'; 101befdbcdS猫头猫import {ImgAsset} from '@/constants/assetsConst'; 11c446f2b8S猫头猫import {useSafeAreaInsets} from 'react-native-safe-area-context'; 12c15039e2S猫头猫import {showPanel} from '../panels/usePanel'; 13024e8a82S猫头猫import FastImage from '../base/fastImage'; 14e650bfb3S猫头猫import useColors from '@/hooks/useColors'; 15e650bfb3S猫头猫import IconButton from '../base/iconButton'; 16*5500cea7S猫头猫import TrackPlayer from '@/core/trackPlayer'; 17*5500cea7S猫头猫import {musicIsPaused} from '@/utils/trackUtils'; 18bf6e62f2S猫头猫 19c9af9657S猫头猫function CircularPlayBtn() { 20*5500cea7S猫头猫 const progress = TrackPlayer.useProgress(); 21*5500cea7S猫头猫 const musicState = TrackPlayer.useMusicState(); 22e650bfb3S猫头猫 const colors = useColors(); 23c9af9657S猫头猫 249dc4d3f3S猫头猫 const isPaused = musicIsPaused(musicState); 259dc4d3f3S猫头猫 26c9af9657S猫头猫 return ( 27c9af9657S猫头猫 <CircularProgressBase 28c9af9657S猫头猫 activeStrokeWidth={rpx(4)} 29c9af9657S猫头猫 inActiveStrokeWidth={rpx(2)} 30c9af9657S猫头猫 inActiveStrokeOpacity={0.2} 31c9af9657S猫头猫 value={ 32c9af9657S猫头猫 progress?.duration 33c9af9657S猫头猫 ? (100 * progress.position) / progress.duration 34c9af9657S猫头猫 : 0 35c9af9657S猫头猫 } 36c9af9657S猫头猫 duration={100} 37c9af9657S猫头猫 radius={rpx(36)} 38277c5280S猫头猫 activeStrokeColor={colors.musicBarText} 39277c5280S猫头猫 inActiveStrokeColor={colors.textSecondary}> 40c9af9657S猫头猫 <IconButton 419dc4d3f3S猫头猫 accessibilityLabel={isPaused ? '播放' : '暂停'} 42e650bfb3S猫头猫 name={isPaused ? 'play' : 'pause'} 43e650bfb3S猫头猫 sizeType={'normal'} 44277c5280S猫头猫 color={colors.musicBarText} 45c9af9657S猫头猫 onPress={async () => { 469dc4d3f3S猫头猫 if (isPaused) { 47*5500cea7S猫头猫 await TrackPlayer.play(); 489dc4d3f3S猫头猫 } else { 49*5500cea7S猫头猫 await TrackPlayer.pause(); 509dc4d3f3S猫头猫 } 51c9af9657S猫头猫 }} 52c9af9657S猫头猫 /> 53c9af9657S猫头猫 </CircularProgressBase> 54c9af9657S猫头猫 ); 55c9af9657S猫头猫} 56bec1e603S猫头猫function MusicBar() { 57*5500cea7S猫头猫 const musicItem = TrackPlayer.useCurrentMusic(); 58c9af9657S猫头猫 5900d0309bS猫头猫 const [showKeyboard, setKeyboardStatus] = useState(false); 60c15039e2S猫头猫 61e7fa3837S猫头猫 const navigate = useNavigate(); 62e650bfb3S猫头猫 const colors = useColors(); 63c446f2b8S猫头猫 const safeAreaInsets = useSafeAreaInsets(); 64bf6e62f2S猫头猫 6500d0309bS猫头猫 useEffect(() => { 6600d0309bS猫头猫 const showSubscription = Keyboard.addListener('keyboardDidShow', () => { 6700d0309bS猫头猫 setKeyboardStatus(true); 6800d0309bS猫头猫 }); 6900d0309bS猫头猫 const hideSubscription = Keyboard.addListener('keyboardDidHide', () => { 7000d0309bS猫头猫 setKeyboardStatus(false); 7100d0309bS猫头猫 }); 7200d0309bS猫头猫 7300d0309bS猫头猫 return () => { 7400d0309bS猫头猫 showSubscription.remove(); 7500d0309bS猫头猫 hideSubscription.remove(); 7600d0309bS猫头猫 }; 7700d0309bS猫头猫 }, []); 7800d0309bS猫头猫 79bf6e62f2S猫头猫 return ( 80c446f2b8S猫头猫 <> 8100d0309bS猫头猫 {musicItem && !showKeyboard && ( 82bf6e62f2S猫头猫 <Pressable 83bf6e62f2S猫头猫 style={[ 84bf6e62f2S猫头猫 style.wrapper, 854060c00aS猫头猫 { 86e650bfb3S猫头猫 backgroundColor: colors.musicBar, 87c446f2b8S猫头猫 paddingLeft: safeAreaInsets.left + rpx(24), 883b155a65S猫头猫 paddingRight: safeAreaInsets.right + rpx(24), 894060c00aS猫头猫 }, 90bf6e62f2S猫头猫 ]} 919dc4d3f3S猫头猫 accessible 929dc4d3f3S猫头猫 accessibilityLabel={`歌曲: ${musicItem.title} 歌手: ${musicItem.artist}`} 93bf6e62f2S猫头猫 onPress={() => { 94e7fa3837S猫头猫 navigate(ROUTE_PATH.MUSIC_DETAIL); 95bf6e62f2S猫头猫 }}> 96bf6e62f2S猫头猫 <View style={style.artworkWrapper}> 97024e8a82S猫头猫 <FastImage 98024e8a82S猫头猫 style={style.artworkImg} 99024e8a82S猫头猫 uri={musicItem.artwork} 100024e8a82S猫头猫 emptySrc={ImgAsset.albumDefault} 1014060c00aS猫头猫 /> 102bf6e62f2S猫头猫 </View> 103bf6e62f2S猫头猫 <Text 104bf6e62f2S猫头猫 ellipsizeMode="tail" 1059dc4d3f3S猫头猫 accessible={false} 106bf6e62f2S猫头猫 style={style.textWrapper} 107bf6e62f2S猫头猫 numberOfLines={1}> 108277c5280S猫头猫 <ThemeText fontSize="content" fontColor="musicBarText"> 1095e267aa1S猫头猫 {musicItem?.title} 1104060c00aS猫头猫 </ThemeText> 111bf6e62f2S猫头猫 {musicItem?.artist && ( 1124060c00aS猫头猫 <ThemeText 1134060c00aS猫头猫 fontSize="description" 114277c5280S猫头猫 color={Color(colors.musicBarText) 115277c5280S猫头猫 .alpha(0.6) 116277c5280S猫头猫 .toString()}> 1171befdbcdS猫头猫 {' '} 1181befdbcdS猫头猫 -{musicItem.artist} 1191befdbcdS猫头猫 </ThemeText> 120bf6e62f2S猫头猫 )} 121bf6e62f2S猫头猫 </Text> 122bf6e62f2S猫头猫 <View style={style.actionGroup}> 123c9af9657S猫头猫 <CircularPlayBtn /> 124bf6e62f2S猫头猫 <Icon 1259dc4d3f3S猫头猫 accessible 1269dc4d3f3S猫头猫 accessibilityLabel="播放列表" 127bf6e62f2S猫头猫 name="playlist-music" 128bf6e62f2S猫头猫 size={rpx(56)} 129bf6e62f2S猫头猫 onPress={() => { 130bf6e62f2S猫头猫 showPanel('PlayList'); 131bf6e62f2S猫头猫 }} 132277c5280S猫头猫 style={[ 133277c5280S猫头猫 style.actionIcon, 134277c5280S猫头猫 {color: colors.musicBarText}, 135277c5280S猫头猫 ]} 1364060c00aS猫头猫 /> 137bf6e62f2S猫头猫 </View> 138bf6e62f2S猫头猫 </Pressable> 139bf6e62f2S猫头猫 )} 140c446f2b8S猫头猫 </> 141bf6e62f2S猫头猫 ); 142bf6e62f2S猫头猫} 143bf6e62f2S猫头猫 144bec1e603S猫头猫export default memo(MusicBar, () => true); 145bec1e603S猫头猫 146bf6e62f2S猫头猫const style = StyleSheet.create({ 147bf6e62f2S猫头猫 wrapper: { 148c446f2b8S猫头猫 width: '100%', 149e650bfb3S猫头猫 height: rpx(132), 150bf6e62f2S猫头猫 flexDirection: 'row', 151bf6e62f2S猫头猫 alignItems: 'center', 152bf6e62f2S猫头猫 paddingHorizontal: rpx(24), 153bf6e62f2S猫头猫 }, 154bf6e62f2S猫头猫 artworkWrapper: { 155bf6e62f2S猫头猫 height: rpx(120), 156bf6e62f2S猫头猫 width: rpx(120), 157e650bfb3S猫头猫 justifyContent: 'center', 158bf6e62f2S猫头猫 }, 159bf6e62f2S猫头猫 textWrapper: { 160bf6e62f2S猫头猫 flexGrow: 1, 161c446f2b8S猫头猫 flexShrink: 1, 162bf6e62f2S猫头猫 }, 163bf6e62f2S猫头猫 actionGroup: { 164bf6e62f2S猫头猫 width: rpx(200), 165bf6e62f2S猫头猫 justifyContent: 'flex-end', 166bf6e62f2S猫头猫 flexDirection: 'row', 167bf6e62f2S猫头猫 alignItems: 'center', 168bf6e62f2S猫头猫 }, 169bf6e62f2S猫头猫 actionIcon: { 170bf6e62f2S猫头猫 marginLeft: rpx(36), 171bf6e62f2S猫头猫 }, 172024e8a82S猫头猫 artworkImg: { 173024e8a82S猫头猫 width: rpx(96), 174024e8a82S猫头猫 height: rpx(96), 175024e8a82S猫头猫 borderRadius: rpx(48), 176024e8a82S猫头猫 }, 177bf6e62f2S猫头猫}); 178