mirror of
https://github.com/ikun0014/lx-music-mobile.git
synced 2025-07-03 19:22:10 +08:00
139 lines
3.5 KiB
TypeScript
139 lines
3.5 KiB
TypeScript
import { useImperativeHandle, forwardRef, useState, useCallback } from 'react'
|
|
import { View } from 'react-native'
|
|
import { createStyle } from '@/utils/tools'
|
|
import InputItem from './InputItem'
|
|
import { useI18n } from '@/lang'
|
|
import TextAreaItem from './TextAreaItem'
|
|
import PicItem from './PicItem'
|
|
import { useTheme } from '@/store/theme/hook'
|
|
import ParseName from './ParseName'
|
|
|
|
export interface Metadata {
|
|
name: string // 歌曲名
|
|
singer: string // 艺术家名
|
|
albumName: string // 歌曲专辑名称
|
|
pic: string
|
|
lyric: string
|
|
}
|
|
export const defaultData = {
|
|
name: '',
|
|
singer: '',
|
|
albumName: '',
|
|
pic: '',
|
|
lyric: '',
|
|
}
|
|
|
|
export interface MetadataFormType {
|
|
setForm: (path: string, metadata: Metadata) => void
|
|
getForm: () => Metadata
|
|
}
|
|
export default forwardRef<MetadataFormType, {}>((props, ref) => {
|
|
const t = useI18n()
|
|
const [path, setPath] = useState('')
|
|
const [data, setData] = useState({ ...defaultData })
|
|
const theme = useTheme()
|
|
|
|
useImperativeHandle(ref, () => ({
|
|
setForm(path, data) {
|
|
setPath(path)
|
|
setData(data)
|
|
},
|
|
getForm() {
|
|
return {
|
|
...data,
|
|
name: data.name.trim(),
|
|
singer: data.singer.trim(),
|
|
albumName: data.albumName.trim(),
|
|
}
|
|
},
|
|
}))
|
|
|
|
const handleUpdateName = useCallback((name: string) => {
|
|
if (name.length > 150) name = name.substring(0, 150)
|
|
setData(data => {
|
|
return { ...data, name }
|
|
})
|
|
}, [])
|
|
const handleUpdateSinger = useCallback((singer: string) => {
|
|
if (singer.length > 150) singer = singer.substring(0, 150)
|
|
setData(data => {
|
|
return { ...data, singer }
|
|
})
|
|
}, [])
|
|
const handleUpdateAlbumName = useCallback((albumName: string) => {
|
|
if (albumName.length > 150) albumName = albumName.substring(0, 150)
|
|
setData(data => {
|
|
return { ...data, albumName }
|
|
})
|
|
}, [])
|
|
const handleUpdatePic = useCallback((path: string) => {
|
|
setData(data => {
|
|
return { ...data, pic: path }
|
|
})
|
|
}, [])
|
|
const handleUpdateLyric = useCallback((lyric: string) => {
|
|
setData(data => {
|
|
return { ...data, lyric }
|
|
})
|
|
}, [])
|
|
|
|
return (
|
|
<View style={styles.container}>
|
|
<TextAreaItem
|
|
value={path}
|
|
label={global.i18n.t('metadata_edit_modal_file_path')}
|
|
numberOfLines={3}
|
|
scrollEnabled
|
|
style={{ ...styles.pathText, color: theme['c-primary-font'] }}
|
|
/>
|
|
|
|
<InputItem
|
|
value={data.name}
|
|
label={t('metadata_edit_modal_form_name')}
|
|
onChanged={handleUpdateName}
|
|
keyboardType="name-phone-pad" />
|
|
<InputItem
|
|
value={data.singer}
|
|
label={t('metadata_edit_modal_form_singer')}
|
|
onChanged={handleUpdateSinger}
|
|
keyboardType="name-phone-pad" />
|
|
<ParseName
|
|
path={path}
|
|
onNameChanged={handleUpdateName}
|
|
onSingerChanged={handleUpdateSinger}
|
|
/>
|
|
<InputItem
|
|
value={data.albumName}
|
|
label={t('metadata_edit_modal_form_album_name')}
|
|
onChanged={handleUpdateAlbumName}
|
|
keyboardType="name-phone-pad" />
|
|
|
|
<PicItem
|
|
value={data.pic}
|
|
label={t('metadata_edit_modal_form_pic')}
|
|
onChanged={handleUpdatePic} />
|
|
<TextAreaItem
|
|
value={data.lyric}
|
|
label={t('metadata_edit_modal_form_lyric')}
|
|
onChanged={handleUpdateLyric}
|
|
numberOfLines={6}
|
|
keyboardType="default" />
|
|
</View>
|
|
)
|
|
})
|
|
|
|
const styles = createStyle({
|
|
container: {
|
|
flexGrow: 1,
|
|
flexShrink: 1,
|
|
flexDirection: 'column',
|
|
width: 360,
|
|
maxWidth: '100%',
|
|
},
|
|
pathText: {
|
|
height: 60,
|
|
},
|
|
})
|
|
|
|
|