1c446f2b8S猫头猫import React, {memo, useEffect, useState} from 'react'; 2f511aee9S猫头猫import {Keyboard, StyleSheet, View} from 'react-native'; 3bf6e62f2S猫头猫import rpx from '@/utils/rpx'; 4bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator'; 5bf6e62f2S猫头猫 6c446f2b8S猫头猫import {useSafeAreaInsets} from 'react-native-safe-area-context'; 7c15039e2S猫头猫import {showPanel} from '../panels/usePanel'; 8e650bfb3S猫头猫import useColors from '@/hooks/useColors'; 9e650bfb3S猫头猫import IconButton from '../base/iconButton'; 105500cea7S猫头猫import TrackPlayer from '@/core/trackPlayer'; 115500cea7S猫头猫import {musicIsPaused} from '@/utils/trackUtils'; 12f511aee9S猫头猫import MusicInfo from './musicInfo'; 135589cdf3S猫头猫import Icon from '@/components/base/icon.tsx'; 14bf6e62f2S猫头猫 15c9af9657S猫头猫function CircularPlayBtn() { 165500cea7S猫头猫 const progress = TrackPlayer.useProgress(); 175500cea7S猫头猫 const musicState = TrackPlayer.useMusicState(); 18e650bfb3S猫头猫 const colors = useColors(); 19c9af9657S猫头猫 209dc4d3f3S猫头猫 const isPaused = musicIsPaused(musicState); 219dc4d3f3S猫头猫 22c9af9657S猫头猫 return ( 23c9af9657S猫头猫 <CircularProgressBase 24c9af9657S猫头猫 activeStrokeWidth={rpx(4)} 25c9af9657S猫头猫 inActiveStrokeWidth={rpx(2)} 26c9af9657S猫头猫 inActiveStrokeOpacity={0.2} 27c9af9657S猫头猫 value={ 28c9af9657S猫头猫 progress?.duration 29c9af9657S猫头猫 ? (100 * progress.position) / progress.duration 30c9af9657S猫头猫 : 0 31c9af9657S猫头猫 } 32c9af9657S猫头猫 duration={100} 33c9af9657S猫头猫 radius={rpx(36)} 34277c5280S猫头猫 activeStrokeColor={colors.musicBarText} 35277c5280S猫头猫 inActiveStrokeColor={colors.textSecondary}> 36c9af9657S猫头猫 <IconButton 3795270b83S猫头猫 accessibilityLabel={'播放或暂停歌曲'} 38e650bfb3S猫头猫 name={isPaused ? 'play' : 'pause'} 39e650bfb3S猫头猫 sizeType={'normal'} 40*42a9f3e6Smaotoumao hitSlop={{ 41*42a9f3e6Smaotoumao top: 10, 42*42a9f3e6Smaotoumao left: 10, 43*42a9f3e6Smaotoumao right: 10, 44*42a9f3e6Smaotoumao bottom: 10, 45*42a9f3e6Smaotoumao }} 46277c5280S猫头猫 color={colors.musicBarText} 47c9af9657S猫头猫 onPress={async () => { 489dc4d3f3S猫头猫 if (isPaused) { 495500cea7S猫头猫 await TrackPlayer.play(); 509dc4d3f3S猫头猫 } else { 515500cea7S猫头猫 await TrackPlayer.pause(); 529dc4d3f3S猫头猫 } 53c9af9657S猫头猫 }} 54c9af9657S猫头猫 /> 55c9af9657S猫头猫 </CircularProgressBase> 56c9af9657S猫头猫 ); 57c9af9657S猫头猫} 58bec1e603S猫头猫function MusicBar() { 595500cea7S猫头猫 const musicItem = TrackPlayer.useCurrentMusic(); 60c9af9657S猫头猫 6100d0309bS猫头猫 const [showKeyboard, setKeyboardStatus] = useState(false); 62c15039e2S猫头猫 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 && ( 83f511aee9S猫头猫 <View 84bf6e62f2S猫头猫 style={[ 85bf6e62f2S猫头猫 style.wrapper, 864060c00aS猫头猫 { 87e650bfb3S猫头猫 backgroundColor: colors.musicBar, 883b155a65S猫头猫 paddingRight: safeAreaInsets.right + rpx(24), 894060c00aS猫头猫 }, 90bf6e62f2S猫头猫 ]} 919dc4d3f3S猫头猫 accessible 929dc4d3f3S猫头猫 accessibilityLabel={`歌曲: ${musicItem.title} 歌手: ${musicItem.artist}`} 93f511aee9S猫头猫 // onPress={() => { 94f511aee9S猫头猫 // navigate(ROUTE_PATH.MUSIC_DETAIL); 95f511aee9S猫头猫 // }} 96f511aee9S猫头猫 > 97f511aee9S猫头猫 <MusicInfo musicItem={musicItem} /> 98bf6e62f2S猫头猫 <View style={style.actionGroup}> 99c9af9657S猫头猫 <CircularPlayBtn /> 100bf6e62f2S猫头猫 <Icon 1019dc4d3f3S猫头猫 accessible 1029dc4d3f3S猫头猫 accessibilityLabel="播放列表" 1035589cdf3S猫头猫 name="playlist" 104bf6e62f2S猫头猫 size={rpx(56)} 105bf6e62f2S猫头猫 onPress={() => { 106bf6e62f2S猫头猫 showPanel('PlayList'); 107bf6e62f2S猫头猫 }} 1085589cdf3S猫头猫 color={colors.musicBarText} 1095589cdf3S猫头猫 style={[style.actionIcon]} 1104060c00aS猫头猫 /> 111bf6e62f2S猫头猫 </View> 112f511aee9S猫头猫 </View> 113bf6e62f2S猫头猫 )} 114c446f2b8S猫头猫 </> 115bf6e62f2S猫头猫 ); 116bf6e62f2S猫头猫} 117bf6e62f2S猫头猫 118bec1e603S猫头猫export default memo(MusicBar, () => true); 119bec1e603S猫头猫 120bf6e62f2S猫头猫const style = StyleSheet.create({ 121bf6e62f2S猫头猫 wrapper: { 122c446f2b8S猫头猫 width: '100%', 123e650bfb3S猫头猫 height: rpx(132), 124bf6e62f2S猫头猫 flexDirection: 'row', 125bf6e62f2S猫头猫 alignItems: 'center', 126f511aee9S猫头猫 paddingRight: rpx(24), 127bf6e62f2S猫头猫 }, 128bf6e62f2S猫头猫 actionGroup: { 129bf6e62f2S猫头猫 width: rpx(200), 130bf6e62f2S猫头猫 justifyContent: 'flex-end', 131bf6e62f2S猫头猫 flexDirection: 'row', 132bf6e62f2S猫头猫 alignItems: 'center', 133bf6e62f2S猫头猫 }, 134bf6e62f2S猫头猫 actionIcon: { 135bf6e62f2S猫头猫 marginLeft: rpx(36), 136bf6e62f2S猫头猫 }, 137bf6e62f2S猫头猫}); 138