1*bf6e62f2S猫头猫import React, {Fragment, useEffect, useState} from 'react'; 2*bf6e62f2S猫头猫import {Pressable, StyleSheet, Text, ToastAndroid, View} from 'react-native'; 3*bf6e62f2S猫头猫import rpx from '@/utils/rpx'; 4*bf6e62f2S猫头猫import Icon from 'react-native-vector-icons/MaterialCommunityIcons'; 5*bf6e62f2S猫头猫import useTextColor from '@/hooks/useTextColor'; 6*bf6e62f2S猫头猫import MusicQueue from '@/common/musicQueue'; 7*bf6e62f2S猫头猫import {Avatar, IconButton, Portal, useTheme} from 'react-native-paper'; 8*bf6e62f2S猫头猫import {CircularProgressBase} from 'react-native-circular-progress-indicator'; 9*bf6e62f2S猫头猫import {useNavigation} from '@react-navigation/native'; 10*bf6e62f2S猫头猫import {ROUTE_PATH} from '@/entry/router'; 11*bf6e62f2S猫头猫 12*bf6e62f2S猫头猫import musicIsPaused from '@/utils/musicIsPaused'; 13*bf6e62f2S猫头猫import usePanelShow from '../panels/usePanelShow'; 14*bf6e62f2S猫头猫import {fontSizeConst} from '@/constants/uiConst'; 15*bf6e62f2S猫头猫import Color from 'color'; 16*bf6e62f2S猫头猫import ThemeText from '../themeText'; 17*bf6e62f2S猫头猫 18*bf6e62f2S猫头猫interface IProps {} 19*bf6e62f2S猫头猫export default function (props: IProps) { 20*bf6e62f2S猫头猫 // const currentMusicState = useAtomValue(loadableCurrentMusicStateAtom); 21*bf6e62f2S猫头猫 const musicItem = MusicQueue.useCurrentMusicItem(); 22*bf6e62f2S猫头猫 const musicState = MusicQueue.usePlaybackState(); 23*bf6e62f2S猫头猫 const {showPanel} = usePanelShow(); 24*bf6e62f2S猫头猫 const navigation = useNavigation<any>(); 25*bf6e62f2S猫头猫 const progress = MusicQueue.useProgress(); 26*bf6e62f2S猫头猫 const {colors} = useTheme(); 27*bf6e62f2S猫头猫 28*bf6e62f2S猫头猫 return ( 29*bf6e62f2S猫头猫 <Fragment> 30*bf6e62f2S猫头猫 {musicItem && ( 31*bf6e62f2S猫头猫 <Pressable 32*bf6e62f2S猫头猫 style={[ 33*bf6e62f2S猫头猫 style.wrapper, 34*bf6e62f2S猫头猫 {backgroundColor: Color(colors.primary).alpha(0.66).toString()}, 35*bf6e62f2S猫头猫 ]} 36*bf6e62f2S猫头猫 onPress={() => { 37*bf6e62f2S猫头猫 navigation.navigate(ROUTE_PATH.MUSIC_DETAIL); 38*bf6e62f2S猫头猫 }}> 39*bf6e62f2S猫头猫 <View style={style.artworkWrapper}> 40*bf6e62f2S猫头猫 <Avatar.Image 41*bf6e62f2S猫头猫 size={rpx(96)} 42*bf6e62f2S猫头猫 source={{ 43*bf6e62f2S猫头猫 uri: musicItem.artwork, 44*bf6e62f2S猫头猫 }}></Avatar.Image> 45*bf6e62f2S猫头猫 </View> 46*bf6e62f2S猫头猫 <Text 47*bf6e62f2S猫头猫 ellipsizeMode="tail" 48*bf6e62f2S猫头猫 style={style.textWrapper} 49*bf6e62f2S猫头猫 numberOfLines={1}> 50*bf6e62f2S猫头猫 <ThemeText style={style.title}>{musicItem.title}</ThemeText> 51*bf6e62f2S猫头猫 {musicItem?.artist && ( 52*bf6e62f2S猫头猫 <ThemeText type="secondary"> -{musicItem.artist}</ThemeText> 53*bf6e62f2S猫头猫 )} 54*bf6e62f2S猫头猫 </Text> 55*bf6e62f2S猫头猫 <View style={style.actionGroup}> 56*bf6e62f2S猫头猫 <CircularProgressBase 57*bf6e62f2S猫头猫 activeStrokeWidth={rpx(4)} 58*bf6e62f2S猫头猫 inActiveStrokeWidth={rpx(2)} 59*bf6e62f2S猫头猫 inActiveStrokeOpacity={0.2} 60*bf6e62f2S猫头猫 value={ 61*bf6e62f2S猫头猫 progress?.duration 62*bf6e62f2S猫头猫 ? (100 * progress.position) / progress.duration 63*bf6e62f2S猫头猫 : 0 64*bf6e62f2S猫头猫 } 65*bf6e62f2S猫头猫 duration={100} 66*bf6e62f2S猫头猫 radius={rpx(36)} 67*bf6e62f2S猫头猫 activeStrokeColor={colors.text} 68*bf6e62f2S猫头猫 inActiveStrokeColor={Color(colors.text).alpha(0.5).toString()}> 69*bf6e62f2S猫头猫 {musicIsPaused(musicState) ? ( 70*bf6e62f2S猫头猫 <IconButton 71*bf6e62f2S猫头猫 icon="play" 72*bf6e62f2S猫头猫 size={rpx(48)} 73*bf6e62f2S猫头猫 onPress={async () => { 74*bf6e62f2S猫头猫 await MusicQueue.play(); 75*bf6e62f2S猫头猫 }} 76*bf6e62f2S猫头猫 /> 77*bf6e62f2S猫头猫 ) : ( 78*bf6e62f2S猫头猫 <IconButton 79*bf6e62f2S猫头猫 icon="pause" 80*bf6e62f2S猫头猫 size={rpx(48)} 81*bf6e62f2S猫头猫 onPress={async () => { 82*bf6e62f2S猫头猫 await MusicQueue.pause(); 83*bf6e62f2S猫头猫 }} 84*bf6e62f2S猫头猫 /> 85*bf6e62f2S猫头猫 )} 86*bf6e62f2S猫头猫 </CircularProgressBase> 87*bf6e62f2S猫头猫 88*bf6e62f2S猫头猫 <Icon 89*bf6e62f2S猫头猫 name="playlist-music" 90*bf6e62f2S猫头猫 size={rpx(56)} 91*bf6e62f2S猫头猫 onPress={() => { 92*bf6e62f2S猫头猫 showPanel('PlayList'); 93*bf6e62f2S猫头猫 }} 94*bf6e62f2S猫头猫 style={[style.actionIcon, {color: colors.text}]}></Icon> 95*bf6e62f2S猫头猫 </View> 96*bf6e62f2S猫头猫 </Pressable> 97*bf6e62f2S猫头猫 )} 98*bf6e62f2S猫头猫 </Fragment> 99*bf6e62f2S猫头猫 ); 100*bf6e62f2S猫头猫} 101*bf6e62f2S猫头猫 102*bf6e62f2S猫头猫const style = StyleSheet.create({ 103*bf6e62f2S猫头猫 wrapper: { 104*bf6e62f2S猫头猫 width: rpx(750), 105*bf6e62f2S猫头猫 height: rpx(120), 106*bf6e62f2S猫头猫 flexDirection: 'row', 107*bf6e62f2S猫头猫 alignItems: 'center', 108*bf6e62f2S猫头猫 paddingHorizontal: rpx(24), 109*bf6e62f2S猫头猫 }, 110*bf6e62f2S猫头猫 artworkWrapper: { 111*bf6e62f2S猫头猫 height: rpx(120), 112*bf6e62f2S猫头猫 width: rpx(120), 113*bf6e62f2S猫头猫 }, 114*bf6e62f2S猫头猫 textWrapper: { 115*bf6e62f2S猫头猫 flexGrow: 1, 116*bf6e62f2S猫头猫 maxWidth: rpx(382), 117*bf6e62f2S猫头猫 }, 118*bf6e62f2S猫头猫 title: { 119*bf6e62f2S猫头猫 fontSize: fontSizeConst.normal, 120*bf6e62f2S猫头猫 }, 121*bf6e62f2S猫头猫 author: { 122*bf6e62f2S猫头猫 fontSize: fontSizeConst.smaller, 123*bf6e62f2S猫头猫 }, 124*bf6e62f2S猫头猫 actionGroup: { 125*bf6e62f2S猫头猫 width: rpx(200), 126*bf6e62f2S猫头猫 justifyContent: 'flex-end', 127*bf6e62f2S猫头猫 flexDirection: 'row', 128*bf6e62f2S猫头猫 alignItems: 'center', 129*bf6e62f2S猫头猫 }, 130*bf6e62f2S猫头猫 actionIcon: { 131*bf6e62f2S猫头猫 marginLeft: rpx(36), 132*bf6e62f2S猫头猫 }, 133*bf6e62f2S猫头猫}); 134