xref: /MusicFree/src/components/dialogs/components/editSheetDetail.tsx (revision 953686533e4555bd85920153cde941607b67f7d1)
1e26be108S猫头猫import React, {useState} from 'react';
2e26be108S猫头猫import useColors from '@/hooks/useColors';
3e26be108S猫头猫import rpx from '@/utils/rpx';
4e26be108S猫头猫import {StyleSheet, View} from 'react-native';
5e26be108S猫头猫import ThemeText from '@/components/base/themeText';
6e26be108S猫头猫import {ImgAsset} from '@/constants/assetsConst';
7476c9cacS猫头猫import {TouchableOpacity} from 'react-native';
8e26be108S猫头猫import {launchImageLibrary} from 'react-native-image-picker';
9e26be108S猫头猫import pathConst from '@/constants/pathConst';
10e26be108S猫头猫import Image from '@/components/base/image';
1129fe487bS猫头猫import {copyFile, exists, unlink} from 'react-native-fs';
12e26be108S猫头猫import MusicSheet from '@/core/musicSheet';
1329fe487bS猫头猫import {addFileScheme, addRandomHash} from '@/utils/fileUtils';
1429fe487bS猫头猫import Toast from '@/utils/toast';
1575d76114S猫头猫import {hideDialog} from '../useDialog';
16e650bfb3S猫头猫import Dialog from './base';
17e650bfb3S猫头猫import Input from '@/components/base/input';
18e650bfb3S猫头猫import {fontSizeConst} from '@/constants/uiConst';
19e26be108S猫头猫
20e26be108S猫头猫interface IEditSheetDetailProps {
21e26be108S猫头猫    musicSheet: IMusic.IMusicSheetItem;
22e26be108S猫头猫}
23e26be108S猫头猫export default function EditSheetDetailDialog(props: IEditSheetDetailProps) {
24e26be108S猫头猫    const {musicSheet} = props;
25e26be108S猫头猫    const colors = useColors();
26e26be108S猫头猫
27e26be108S猫头猫    const [coverImg, setCoverImg] = useState(musicSheet?.coverImg);
28e26be108S猫头猫    const [title, setTitle] = useState(musicSheet?.title);
29e26be108S猫头猫
30e26be108S猫头猫    // onCover
31e26be108S猫头猫
32e26be108S猫头猫    const onChangeCoverPress = async () => {
33e26be108S猫头猫        try {
34e26be108S猫头猫            const result = await launchImageLibrary({
35e26be108S猫头猫                mediaType: 'photo',
36e26be108S猫头猫            });
37e26be108S猫头猫            const uri = result.assets?.[0].uri;
38e26be108S猫头猫            if (!uri) {
39e26be108S猫头猫                return;
40e26be108S猫头猫            }
41e26be108S猫头猫            console.log(uri);
42e26be108S猫头猫            setCoverImg(uri);
43e26be108S猫头猫        } catch (e) {
44e26be108S猫头猫            console.log(e);
45e26be108S猫头猫        }
46e26be108S猫头猫    };
47e26be108S猫头猫
48e26be108S猫头猫    function onTitleChange(_: string) {
49e26be108S猫头猫        setTitle(_);
50e26be108S猫头猫    }
51e26be108S猫头猫
52e26be108S猫头猫    async function onConfirm() {
53e26be108S猫头猫        // 判断是否相同
54e26be108S猫头猫        if (coverImg === musicSheet?.coverImg && title === musicSheet?.title) {
55e26be108S猫头猫            hideDialog();
567a69a1e8S猫头猫            return;
57e26be108S猫头猫        }
58e26be108S猫头猫
59e26be108S猫头猫        let _coverImg = coverImg;
6029fe487bS猫头猫        if (_coverImg && _coverImg !== musicSheet?.coverImg) {
61e26be108S猫头猫            _coverImg = addFileScheme(
627a69a1e8S猫头猫                `${pathConst.dataPath}sheet${
637a69a1e8S猫头猫                    musicSheet.id
647a69a1e8S猫头猫                }${_coverImg.substring(_coverImg.lastIndexOf('.'))}`,
65e26be108S猫头猫            );
6629fe487bS猫头猫            try {
6729fe487bS猫头猫                if (await exists(_coverImg)) {
6829fe487bS猫头猫                    await unlink(_coverImg);
6929fe487bS猫头猫                }
70e26be108S猫头猫                await copyFile(coverImg!, _coverImg);
7129fe487bS猫头猫            } catch (e) {
7229fe487bS猫头猫                console.log(e);
7329fe487bS猫头猫            }
74e26be108S猫头猫        }
75e26be108S猫头猫        let _title = title;
7629fe487bS猫头猫        if (!_title?.length) {
77e26be108S猫头猫            _title = musicSheet.title;
78e26be108S猫头猫        }
79e26be108S猫头猫        // 更新歌单信息
80e26be108S猫头猫        MusicSheet.updateAndSaveSheet(musicSheet.id, {
81e26be108S猫头猫            basic: {
822aa88193S猫头猫                coverImg: _coverImg ? addRandomHash(_coverImg) : undefined,
83e26be108S猫头猫                title: _title,
84e26be108S猫头猫            },
8529fe487bS猫头猫        }).then(() => {
8629fe487bS猫头猫            Toast.success('更新歌单信息成功~');
87e26be108S猫头猫        });
88e26be108S猫头猫        hideDialog();
89e26be108S猫头猫    }
90e26be108S猫头猫
91e26be108S猫头猫    return (
92e650bfb3S猫头猫        <Dialog onDismiss={hideDialog}>
93*95368653S猫头猫            <Dialog.Content>
94e26be108S猫头猫                <View style={style.row}>
95e650bfb3S猫头猫                    <ThemeText>封面</ThemeText>
96e26be108S猫头猫                    <TouchableOpacity
97e26be108S猫头猫                        onPress={onChangeCoverPress}
98e26be108S猫头猫                        onLongPress={() => {
99e26be108S猫头猫                            setCoverImg(undefined);
100e26be108S猫头猫                        }}>
101e26be108S猫头猫                        <Image
102e26be108S猫头猫                            style={style.coverImg}
103e26be108S猫头猫                            uri={coverImg}
104e26be108S猫头猫                            emptySrc={ImgAsset.albumDefault}
105e26be108S猫头猫                        />
106e26be108S猫头猫                    </TouchableOpacity>
107e26be108S猫头猫                </View>
108e26be108S猫头猫                <View style={style.row}>
109e650bfb3S猫头猫                    <ThemeText>歌单名</ThemeText>
110e650bfb3S猫头猫                    <Input
111e650bfb3S猫头猫                        numberOfLines={1}
112e650bfb3S猫头猫                        textAlign="right"
113e26be108S猫头猫                        value={title}
114e650bfb3S猫头猫                        hasHorizonalPadding={false}
115e26be108S猫头猫                        onChangeText={onTitleChange}
116e26be108S猫头猫                        style={{
117e650bfb3S猫头猫                            height: fontSizeConst.content * 2.5,
118e650bfb3S猫头猫                            width: '50%',
119e650bfb3S猫头猫                            borderBottomWidth: 1,
120e26be108S猫头猫                            includeFontPadding: false,
121e650bfb3S猫头猫                            borderBottomColor: colors.text,
122e26be108S猫头猫                        }}
123e26be108S猫头猫                    />
124e26be108S猫头猫                </View>
125e26be108S猫头猫            </Dialog.Content>
126*95368653S猫头猫            <Dialog.Actions
127*95368653S猫头猫                actions={[
128*95368653S猫头猫                    {
129*95368653S猫头猫                        title: '取消',
130*95368653S猫头猫                        type: 'normal',
131*95368653S猫头猫                        onPress: hideDialog,
132*95368653S猫头猫                    },
133*95368653S猫头猫                    {
134*95368653S猫头猫                        title: '确认',
135*95368653S猫头猫                        type: 'primary',
136*95368653S猫头猫                        onPress: onConfirm,
137*95368653S猫头猫                    },
138*95368653S猫头猫                ]}
139*95368653S猫头猫            />
140e26be108S猫头猫        </Dialog>
141e26be108S猫头猫    );
142e26be108S猫头猫}
143e26be108S猫头猫
144e26be108S猫头猫const style = StyleSheet.create({
145e26be108S猫头猫    row: {
146e26be108S猫头猫        marginTop: rpx(28),
147e26be108S猫头猫        height: rpx(120),
148e26be108S猫头猫        flexDirection: 'row',
149e26be108S猫头猫        justifyContent: 'space-between',
150e26be108S猫头猫        alignItems: 'center',
151e26be108S猫头猫        paddingBottom: rpx(12),
152e26be108S猫头猫    },
153e26be108S猫头猫    coverImg: {
154e26be108S猫头猫        width: rpx(100),
155e26be108S猫头猫        height: rpx(100),
156e26be108S猫头猫        borderRadius: rpx(28),
157e26be108S猫头猫    },
158e26be108S猫头猫});
159