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