1import React, {useState} from 'react'; 2import {Button, Dialog, TextInput} from 'react-native-paper'; 3import useColors from '@/hooks/useColors'; 4import rpx from '@/utils/rpx'; 5import {StyleSheet, View} from 'react-native'; 6import useDialog from '../useDialog'; 7import ThemeText from '@/components/base/themeText'; 8import {ImgAsset} from '@/constants/assetsConst'; 9import {TouchableOpacity} from 'react-native-gesture-handler'; 10import {launchImageLibrary} from 'react-native-image-picker'; 11import pathConst from '@/constants/pathConst'; 12import Image from '@/components/base/image'; 13import {copyFile, exists, unlink} from 'react-native-fs'; 14import MusicSheet from '@/core/musicSheet'; 15import {addFileScheme, addRandomHash} from '@/utils/fileUtils'; 16import Toast from '@/utils/toast'; 17 18interface IEditSheetDetailProps { 19 musicSheet: IMusic.IMusicSheetItem; 20} 21export default function EditSheetDetailDialog(props: IEditSheetDetailProps) { 22 const {musicSheet} = props; 23 const colors = useColors(); 24 const {hideDialog} = useDialog(); 25 26 const [coverImg, setCoverImg] = useState(musicSheet?.coverImg); 27 const [title, setTitle] = useState(musicSheet?.title); 28 29 // onCover 30 31 const onChangeCoverPress = async () => { 32 try { 33 const result = await launchImageLibrary({ 34 mediaType: 'photo', 35 }); 36 const uri = result.assets?.[0].uri; 37 if (!uri) { 38 return; 39 } 40 console.log(uri); 41 setCoverImg(uri); 42 } catch (e) { 43 console.log(e); 44 } 45 }; 46 47 function onTitleChange(_: string) { 48 setTitle(_); 49 } 50 51 async function onConfirm() { 52 // 判断是否相同 53 if (coverImg === musicSheet?.coverImg && title === musicSheet?.title) { 54 hideDialog(); 55 return; 56 } 57 58 let _coverImg = coverImg; 59 if (_coverImg && _coverImg !== musicSheet?.coverImg) { 60 _coverImg = addFileScheme( 61 `${pathConst.dataPath}sheet${ 62 musicSheet.id 63 }${_coverImg.substring(_coverImg.lastIndexOf('.'))}`, 64 ); 65 try { 66 if (await exists(_coverImg)) { 67 await unlink(_coverImg); 68 } 69 await copyFile(coverImg!, _coverImg); 70 } catch (e) { 71 console.log(e); 72 } 73 } 74 let _title = title; 75 if (!_title?.length) { 76 _title = musicSheet.title; 77 } 78 // 更新歌单信息 79 MusicSheet.updateAndSaveSheet(musicSheet.id, { 80 basic: { 81 coverImg: _coverImg ? addRandomHash(_coverImg) : undefined, 82 title: _title, 83 }, 84 }).then(() => { 85 Toast.success('更新歌单信息成功~'); 86 }); 87 hideDialog(); 88 } 89 90 return ( 91 <Dialog 92 visible={true} 93 onDismiss={hideDialog} 94 style={{backgroundColor: colors.primary}}> 95 <Dialog.Content style={style.content}> 96 <View style={style.row}> 97 <ThemeText fontSize="subTitle">封面</ThemeText> 98 <TouchableOpacity 99 onPress={onChangeCoverPress} 100 onLongPress={() => { 101 setCoverImg(undefined); 102 }}> 103 <Image 104 style={style.coverImg} 105 uri={coverImg} 106 emptySrc={ImgAsset.albumDefault} 107 /> 108 </TouchableOpacity> 109 </View> 110 <View style={style.row}> 111 <ThemeText fontSize="subTitle">歌单名</ThemeText> 112 <TextInput 113 value={title} 114 onChangeText={onTitleChange} 115 mode="outlined" 116 outlineColor="transparent" 117 dense 118 style={{ 119 includeFontPadding: false, 120 }} 121 /> 122 </View> 123 </Dialog.Content> 124 <Dialog.Actions> 125 <Button color={colors.textHighlight} onPress={onConfirm}> 126 确认 127 </Button> 128 <Button color={colors.text} onPress={hideDialog}> 129 取消 130 </Button> 131 </Dialog.Actions> 132 </Dialog> 133 ); 134} 135 136const style = StyleSheet.create({ 137 content: { 138 height: rpx(450), 139 }, 140 row: { 141 marginTop: rpx(28), 142 height: rpx(120), 143 flexDirection: 'row', 144 justifyContent: 'space-between', 145 alignItems: 'center', 146 paddingBottom: rpx(12), 147 }, 148 coverImg: { 149 width: rpx(100), 150 height: rpx(100), 151 borderRadius: rpx(28), 152 marginRight: rpx(16), 153 }, 154}); 155