1c446f2b8S猫头猫import React, {memo, useEffect, useState} from 'react'; 2*f511aee9S猫头猫import {Keyboard, StyleSheet, 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'; 6bf6e62f2S猫头猫 7c446f2b8S猫头猫import {useSafeAreaInsets} from 'react-native-safe-area-context'; 8c15039e2S猫头猫import {showPanel} from '../panels/usePanel'; 9e650bfb3S猫头猫import useColors from '@/hooks/useColors'; 10e650bfb3S猫头猫import IconButton from '../base/iconButton'; 115500cea7S猫头猫import TrackPlayer from '@/core/trackPlayer'; 125500cea7S猫头猫import {musicIsPaused} from '@/utils/trackUtils'; 13*f511aee9S猫头猫import MusicInfo from './musicInfo'; 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 379dc4d3f3S猫头猫 accessibilityLabel={isPaused ? '播放' : '暂停'} 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 && ( 77*f511aee9S猫头猫 <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}`} 87*f511aee9S猫头猫 // onPress={() => { 88*f511aee9S猫头猫 // navigate(ROUTE_PATH.MUSIC_DETAIL); 89*f511aee9S猫头猫 // }} 90*f511aee9S猫头猫 > 91*f511aee9S猫头猫 <MusicInfo musicItem={musicItem} /> 92bf6e62f2S猫头猫 <View style={style.actionGroup}> 93c9af9657S猫头猫 <CircularPlayBtn /> 94bf6e62f2S猫头猫 <Icon 959dc4d3f3S猫头猫 accessible 969dc4d3f3S猫头猫 accessibilityLabel="播放列表" 97bf6e62f2S猫头猫 name="playlist-music" 98bf6e62f2S猫头猫 size={rpx(56)} 99bf6e62f2S猫头猫 onPress={() => { 100bf6e62f2S猫头猫 showPanel('PlayList'); 101bf6e62f2S猫头猫 }} 102277c5280S猫头猫 style={[ 103277c5280S猫头猫 style.actionIcon, 104277c5280S猫头猫 {color: colors.musicBarText}, 105277c5280S猫头猫 ]} 1064060c00aS猫头猫 /> 107bf6e62f2S猫头猫 </View> 108*f511aee9S猫头猫 </View> 109bf6e62f2S猫头猫 )} 110c446f2b8S猫头猫 </> 111bf6e62f2S猫头猫 ); 112bf6e62f2S猫头猫} 113bf6e62f2S猫头猫 114bec1e603S猫头猫export default memo(MusicBar, () => true); 115bec1e603S猫头猫 116bf6e62f2S猫头猫const style = StyleSheet.create({ 117bf6e62f2S猫头猫 wrapper: { 118c446f2b8S猫头猫 width: '100%', 119e650bfb3S猫头猫 height: rpx(132), 120bf6e62f2S猫头猫 flexDirection: 'row', 121bf6e62f2S猫头猫 alignItems: 'center', 122*f511aee9S猫头猫 paddingRight: rpx(24), 123bf6e62f2S猫头猫 }, 124bf6e62f2S猫头猫 actionGroup: { 125bf6e62f2S猫头猫 width: rpx(200), 126bf6e62f2S猫头猫 justifyContent: 'flex-end', 127bf6e62f2S猫头猫 flexDirection: 'row', 128bf6e62f2S猫头猫 alignItems: 'center', 129bf6e62f2S猫头猫 }, 130bf6e62f2S猫头猫 actionIcon: { 131bf6e62f2S猫头猫 marginLeft: rpx(36), 132bf6e62f2S猫头猫 }, 133bf6e62f2S猫头猫}); 134