1import React, {useState} from 'react'; 2import {StyleSheet, View} from 'react-native'; 3import rpx from '@/utils/rpx'; 4import ThemeText from '@/components/base/themeText'; 5 6import PanelBase from '../base/panelBase'; 7import MediaExtra from '@/core/mediaExtra'; 8import {iconSizeConst} from '@/constants/uiConst'; 9import PanelHeader from '../base/panelHeader'; 10import {TouchableOpacity} from 'react-native-gesture-handler'; 11import {hidePanel} from '../usePanel'; 12import useColors from '@/hooks/useColors'; 13import Icon from '@/components/base/icon.tsx'; 14 15interface IProps { 16 musicItem: IMusic.IMusicItem; 17 /** 点击回调 */ 18 onSubmit?: (offset: number) => void; 19} 20 21export default function SetLyricOffset(props: IProps) { 22 const {musicItem, onSubmit} = props ?? {}; 23 24 const [offset, setOffset] = useState( 25 MediaExtra.get(musicItem)?.lyricOffset ?? 0, 26 ); 27 28 const colors = useColors(); 29 30 let titleStr = 31 offset === 0 32 ? '正常' 33 : offset < 0 34 ? `延后${(-offset).toFixed(1)}s` 35 : `提前${offset.toFixed(1)}s`; 36 37 return ( 38 <PanelBase 39 height={rpx(520)} 40 keyboardAvoidBehavior="none" 41 renderBody={() => ( 42 <> 43 <PanelHeader 44 title={`设置歌词进度 (${titleStr})`} 45 onOk={() => { 46 onSubmit?.(offset); 47 }} 48 onCancel={hidePanel} 49 /> 50 <View style={styles.container}> 51 <TouchableOpacity 52 style={styles.btn} 53 onPress={() => { 54 setOffset(prev => prev - 0.2); 55 }}> 56 <Icon 57 name="minus" 58 size={iconSizeConst.big} 59 color={colors.text} 60 /> 61 <ThemeText>-0.2s</ThemeText> 62 </TouchableOpacity> 63 <TouchableOpacity 64 style={styles.btn} 65 onPress={() => { 66 setOffset(0); 67 }}> 68 <Icon 69 name="arrow-uturn-left" 70 size={iconSizeConst.big} 71 color={colors.text} 72 /> 73 <ThemeText>重置</ThemeText> 74 </TouchableOpacity> 75 <TouchableOpacity 76 style={styles.btn} 77 onPress={() => { 78 setOffset(prev => prev + 0.2); 79 }}> 80 <Icon 81 name="plus" 82 size={iconSizeConst.big} 83 color={colors.text} 84 /> 85 <ThemeText>+0.2s</ThemeText> 86 </TouchableOpacity> 87 </View> 88 </> 89 )} 90 /> 91 ); 92} 93 94const styles = StyleSheet.create({ 95 header: { 96 width: '100%', 97 flexDirection: 'row', 98 padding: rpx(24), 99 }, 100 container: { 101 flex: 1, 102 paddingHorizontal: rpx(24), 103 paddingBottom: rpx(36), 104 width: '100%', 105 flexDirection: 'row', 106 alignItems: 'center', 107 justifyContent: 'space-around', 108 }, 109 btn: { 110 width: rpx(144), 111 height: rpx(144), 112 alignItems: 'center', 113 justifyContent: 'space-around', 114 }, 115}); 116