xref: /MusicFree/src/components/panels/types/setLyricOffset.tsx (revision 5589cdf32b2bb0f641e5ac7bf1f6152cd6b9b70e)
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