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'; 13*5589cdf3S猫头猫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'} 40277c5280S猫头猫 color={colors.musicBarText} 41c9af9657S猫头猫 onPress={async () => { 429dc4d3f3S猫头猫 if (isPaused) { 435500cea7S猫头猫 await TrackPlayer.play(); 449dc4d3f3S猫头猫 } else { 455500cea7S猫头猫 await TrackPlayer.pause(); 469dc4d3f3S猫头猫 } 47c9af9657S猫头猫 }} 48c9af9657S猫头猫 /> 49c9af9657S猫头猫 </CircularProgressBase> 50c9af9657S猫头猫 ); 51c9af9657S猫头猫} 52bec1e603S猫头猫function MusicBar() { 535500cea7S猫头猫 const musicItem = TrackPlayer.useCurrentMusic(); 54c9af9657S猫头猫 5500d0309bS猫头猫 const [showKeyboard, setKeyboardStatus] = useState(false); 56c15039e2S猫头猫 57e650bfb3S猫头猫 const colors = useColors(); 58c446f2b8S猫头猫 const safeAreaInsets = useSafeAreaInsets(); 59bf6e62f2S猫头猫 6000d0309bS猫头猫 useEffect(() => { 6100d0309bS猫头猫 const showSubscription = Keyboard.addListener('keyboardDidShow', () => { 6200d0309bS猫头猫 setKeyboardStatus(true); 6300d0309bS猫头猫 }); 6400d0309bS猫头猫 const hideSubscription = Keyboard.addListener('keyboardDidHide', () => { 6500d0309bS猫头猫 setKeyboardStatus(false); 6600d0309bS猫头猫 }); 6700d0309bS猫头猫 6800d0309bS猫头猫 return () => { 6900d0309bS猫头猫 showSubscription.remove(); 7000d0309bS猫头猫 hideSubscription.remove(); 7100d0309bS猫头猫 }; 7200d0309bS猫头猫 }, []); 7300d0309bS猫头猫 74bf6e62f2S猫头猫 return ( 75c446f2b8S猫头猫 <> 7600d0309bS猫头猫 {musicItem && !showKeyboard && ( 77f511aee9S猫头猫 <View 78bf6e62f2S猫头猫 style={[ 79bf6e62f2S猫头猫 style.wrapper, 804060c00aS猫头猫 { 81e650bfb3S猫头猫 backgroundColor: colors.musicBar, 823b155a65S猫头猫 paddingRight: safeAreaInsets.right + rpx(24), 834060c00aS猫头猫 }, 84bf6e62f2S猫头猫 ]} 859dc4d3f3S猫头猫 accessible 869dc4d3f3S猫头猫 accessibilityLabel={`歌曲: ${musicItem.title} 歌手: ${musicItem.artist}`} 87f511aee9S猫头猫 // onPress={() => { 88f511aee9S猫头猫 // navigate(ROUTE_PATH.MUSIC_DETAIL); 89f511aee9S猫头猫 // }} 90f511aee9S猫头猫 > 91f511aee9S猫头猫 <MusicInfo musicItem={musicItem} /> 92bf6e62f2S猫头猫 <View style={style.actionGroup}> 93c9af9657S猫头猫 <CircularPlayBtn /> 94bf6e62f2S猫头猫 <Icon 959dc4d3f3S猫头猫 accessible 969dc4d3f3S猫头猫 accessibilityLabel="播放列表" 97*5589cdf3S猫头猫 name="playlist" 98bf6e62f2S猫头猫 size={rpx(56)} 99bf6e62f2S猫头猫 onPress={() => { 100bf6e62f2S猫头猫 showPanel('PlayList'); 101bf6e62f2S猫头猫 }} 102*5589cdf3S猫头猫 color={colors.musicBarText} 103*5589cdf3S猫头猫 style={[style.actionIcon]} 1044060c00aS猫头猫 /> 105bf6e62f2S猫头猫 </View> 106f511aee9S猫头猫 </View> 107bf6e62f2S猫头猫 )} 108c446f2b8S猫头猫 </> 109bf6e62f2S猫头猫 ); 110bf6e62f2S猫头猫} 111bf6e62f2S猫头猫 112bec1e603S猫头猫export default memo(MusicBar, () => true); 113bec1e603S猫头猫 114bf6e62f2S猫头猫const style = StyleSheet.create({ 115bf6e62f2S猫头猫 wrapper: { 116c446f2b8S猫头猫 width: '100%', 117e650bfb3S猫头猫 height: rpx(132), 118bf6e62f2S猫头猫 flexDirection: 'row', 119bf6e62f2S猫头猫 alignItems: 'center', 120f511aee9S猫头猫 paddingRight: rpx(24), 121bf6e62f2S猫头猫 }, 122bf6e62f2S猫头猫 actionGroup: { 123bf6e62f2S猫头猫 width: rpx(200), 124bf6e62f2S猫头猫 justifyContent: 'flex-end', 125bf6e62f2S猫头猫 flexDirection: 'row', 126bf6e62f2S猫头猫 alignItems: 'center', 127bf6e62f2S猫头猫 }, 128bf6e62f2S猫头猫 actionIcon: { 129bf6e62f2S猫头猫 marginLeft: rpx(36), 130bf6e62f2S猫头猫 }, 131bf6e62f2S猫头猫}); 132