xref: /MusicFree/src/components/dialogs/components/editSheetDetail.tsx (revision ab5f994a52bee1ac7c89f2ccf9b6ca60d362890a)
1e26be108S猫头猫import React, {useState} from 'react';
2e26be108S猫头猫import useColors from '@/hooks/useColors';
3e26be108S猫头猫import rpx from '@/utils/rpx';
45589cdf3S猫头猫import {StyleSheet, TouchableOpacity, View} from 'react-native';
5e26be108S猫头猫import ThemeText from '@/components/base/themeText';
6e26be108S猫头猫import {ImgAsset} from '@/constants/assetsConst';
7e26be108S猫头猫import {launchImageLibrary} from 'react-native-image-picker';
8e26be108S猫头猫import pathConst from '@/constants/pathConst';
9e26be108S猫头猫import Image from '@/components/base/image';
1029fe487bS猫头猫import {addFileScheme, addRandomHash} from '@/utils/fileUtils';
1129fe487bS猫头猫import Toast from '@/utils/toast';
1275d76114S猫头猫import {hideDialog} from '../useDialog';
13e650bfb3S猫头猫import Dialog from './base';
14e650bfb3S猫头猫import Input from '@/components/base/input';
15e650bfb3S猫头猫import {fontSizeConst} from '@/constants/uiConst';
1600ebdfd8S猫头猫import {copyAsync, deleteAsync, getInfoAsync} from 'expo-file-system';
17740e3947S猫头猫import MusicSheet from '@/core/musicSheet';
18e26be108S猫头猫
19e26be108S猫头猫interface IEditSheetDetailProps {
20e26be108S猫头猫    musicSheet: IMusic.IMusicSheetItem;
21e26be108S猫头猫}
22e26be108S猫头猫export default function EditSheetDetailDialog(props: IEditSheetDetailProps) {
23e26be108S猫头猫    const {musicSheet} = props;
24e26be108S猫头猫    const colors = useColors();
25e26be108S猫头猫
26e26be108S猫头猫    const [coverImg, setCoverImg] = useState(musicSheet?.coverImg);
27e26be108S猫头猫    const [title, setTitle] = useState(musicSheet?.title);
28e26be108S猫头猫
29e26be108S猫头猫    // onCover
30e26be108S猫头猫
31e26be108S猫头猫    const onChangeCoverPress = async () => {
32e26be108S猫头猫        try {
33e26be108S猫头猫            const result = await launchImageLibrary({
34e26be108S猫头猫                mediaType: 'photo',
35e26be108S猫头猫            });
36e26be108S猫头猫            const uri = result.assets?.[0].uri;
37e26be108S猫头猫            if (!uri) {
38e26be108S猫头猫                return;
39e26be108S猫头猫            }
40e26be108S猫头猫            console.log(uri);
41e26be108S猫头猫            setCoverImg(uri);
42e26be108S猫头猫        } catch (e) {
43e26be108S猫头猫            console.log(e);
44e26be108S猫头猫        }
45e26be108S猫头猫    };
46e26be108S猫头猫
47e26be108S猫头猫    function onTitleChange(_: string) {
48e26be108S猫头猫        setTitle(_);
49e26be108S猫头猫    }
50e26be108S猫头猫
51e26be108S猫头猫    async function onConfirm() {
52e26be108S猫头猫        // 判断是否相同
53e26be108S猫头猫        if (coverImg === musicSheet?.coverImg && title === musicSheet?.title) {
54e26be108S猫头猫            hideDialog();
557a69a1e8S猫头猫            return;
56e26be108S猫头猫        }
57e26be108S猫头猫
5800ebdfd8S猫头猫        let newCoverImg = coverImg;
5900ebdfd8S猫头猫        if (coverImg && coverImg !== musicSheet?.coverImg) {
6000ebdfd8S猫头猫            newCoverImg = addFileScheme(
6100ebdfd8S猫头猫                `${pathConst.dataPath}sheet${musicSheet.id}${coverImg.substring(
6200ebdfd8S猫头猫                    coverImg.lastIndexOf('.'),
6300ebdfd8S猫头猫                )}`,
64e26be108S猫头猫            );
6529fe487bS猫头猫            try {
6600ebdfd8S猫头猫                if ((await getInfoAsync(newCoverImg)).exists) {
6700ebdfd8S猫头猫                    await deleteAsync(newCoverImg, {
6800ebdfd8S猫头猫                        idempotent: true, // 报错时不抛异常
6900ebdfd8S猫头猫                    });
7029fe487bS猫头猫                }
7100ebdfd8S猫头猫                await copyAsync({
7200ebdfd8S猫头猫                    from: coverImg,
7300ebdfd8S猫头猫                    to: newCoverImg,
7400ebdfd8S猫头猫                });
7529fe487bS猫头猫            } catch (e) {
7629fe487bS猫头猫                console.log(e);
7729fe487bS猫头猫            }
78e26be108S猫头猫        }
79e26be108S猫头猫        let _title = title;
8029fe487bS猫头猫        if (!_title?.length) {
81e26be108S猫头猫            _title = musicSheet.title;
82e26be108S猫头猫        }
83e26be108S猫头猫        // 更新歌单信息
84740e3947S猫头猫        MusicSheet.updateMusicSheetBase(musicSheet.id, {
8500ebdfd8S猫头猫            coverImg: newCoverImg ? addRandomHash(newCoverImg) : undefined,
86e26be108S猫头猫            title: _title,
8729fe487bS猫头猫        }).then(() => {
8829fe487bS猫头猫            Toast.success('更新歌单信息成功~');
89e26be108S猫头猫        });
90e26be108S猫头猫        hideDialog();
91e26be108S猫头猫    }
92e26be108S猫头猫
93e26be108S猫头猫    return (
94e650bfb3S猫头猫        <Dialog onDismiss={hideDialog}>
9595368653S猫头猫            <Dialog.Content>
96e26be108S猫头猫                <View style={style.row}>
97e650bfb3S猫头猫                    <ThemeText>封面</ThemeText>
98e26be108S猫头猫                    <TouchableOpacity
99e26be108S猫头猫                        onPress={onChangeCoverPress}
100e26be108S猫头猫                        onLongPress={() => {
101e26be108S猫头猫                            setCoverImg(undefined);
102e26be108S猫头猫                        }}>
103e26be108S猫头猫                        <Image
104e26be108S猫头猫                            style={style.coverImg}
105e26be108S猫头猫                            uri={coverImg}
106e26be108S猫头猫                            emptySrc={ImgAsset.albumDefault}
107e26be108S猫头猫                        />
108e26be108S猫头猫                    </TouchableOpacity>
109e26be108S猫头猫                </View>
110e26be108S猫头猫                <View style={style.row}>
111e650bfb3S猫头猫                    <ThemeText>歌单名</ThemeText>
112e650bfb3S猫头猫                    <Input
113e650bfb3S猫头猫                        numberOfLines={1}
114e650bfb3S猫头猫                        textAlign="right"
115e26be108S猫头猫                        value={title}
116*ab5f994aSmaotoumao                        hasHorizontalPadding={false}
117e26be108S猫头猫                        onChangeText={onTitleChange}
118e26be108S猫头猫                        style={{
119e650bfb3S猫头猫                            height: fontSizeConst.content * 2.5,
120e650bfb3S猫头猫                            width: '50%',
121e650bfb3S猫头猫                            borderBottomWidth: 1,
122e26be108S猫头猫                            includeFontPadding: false,
123e650bfb3S猫头猫                            borderBottomColor: colors.text,
124e26be108S猫头猫                        }}
125e26be108S猫头猫                    />
126e26be108S猫头猫                </View>
127e26be108S猫头猫            </Dialog.Content>
12895368653S猫头猫            <Dialog.Actions
12995368653S猫头猫                actions={[
13095368653S猫头猫                    {
13195368653S猫头猫                        title: '取消',
13295368653S猫头猫                        type: 'normal',
13395368653S猫头猫                        onPress: hideDialog,
13495368653S猫头猫                    },
13595368653S猫头猫                    {
13695368653S猫头猫                        title: '确认',
13795368653S猫头猫                        type: 'primary',
13895368653S猫头猫                        onPress: onConfirm,
13995368653S猫头猫                    },
14095368653S猫头猫                ]}
14195368653S猫头猫            />
142e26be108S猫头猫        </Dialog>
143e26be108S猫头猫    );
144e26be108S猫头猫}
145e26be108S猫头猫
146e26be108S猫头猫const style = StyleSheet.create({
147e26be108S猫头猫    row: {
148e26be108S猫头猫        marginTop: rpx(28),
149e26be108S猫头猫        height: rpx(120),
150e26be108S猫头猫        flexDirection: 'row',
151e26be108S猫头猫        justifyContent: 'space-between',
152e26be108S猫头猫        alignItems: 'center',
153e26be108S猫头猫        paddingBottom: rpx(12),
154e26be108S猫头猫    },
155e26be108S猫头猫    coverImg: {
156e26be108S猫头猫        width: rpx(100),
157e26be108S猫头猫        height: rpx(100),
158e26be108S猫头猫        borderRadius: rpx(28),
159e26be108S猫头猫    },
160e26be108S猫头猫});
161