mirror of
https://github.com/ikun0014/lx-music-mobile.git
synced 2025-05-23 22:37:41 +08:00
87 lines
2.6 KiB
TypeScript
87 lines
2.6 KiB
TypeScript
import React, { forwardRef, useImperativeHandle, useRef, useState } from 'react'
|
|
import Dialog, { type DialogType } from '@/components/common/Dialog'
|
|
import { toast } from '@/utils/tools'
|
|
import Title from './Title'
|
|
import List from './List'
|
|
import { useI18n } from '@/lang'
|
|
import { addListMusics, moveListMusics } from '@/core/list'
|
|
import settingState from '@/store/setting/state'
|
|
|
|
export interface SelectInfo {
|
|
musicInfo: LX.Music.MusicInfo | null
|
|
listId: string
|
|
isMove: boolean
|
|
// single: boolean
|
|
}
|
|
const initSelectInfo = {}
|
|
|
|
// export interface MusicAddModalProps {
|
|
// onRename: (listInfo: LX.List.UserListInfo) => void
|
|
// onImport: (listInfo: LX.List.MyListInfo, index: number) => void
|
|
// onExport: (listInfo: LX.List.MyListInfo, index: number) => void
|
|
// onSync: (listInfo: LX.List.UserListInfo) => void
|
|
// onRemove: (listInfo: LX.List.UserListInfo) => void
|
|
// }
|
|
export interface MusicAddModalType {
|
|
show: (info: SelectInfo) => void
|
|
}
|
|
|
|
export default forwardRef<MusicAddModalType, {}>((props, ref) => {
|
|
const t = useI18n()
|
|
const dialogRef = useRef<DialogType>(null)
|
|
const [selectInfo, setSelectInfo] = useState<SelectInfo>(initSelectInfo as SelectInfo)
|
|
|
|
useImperativeHandle(ref, () => ({
|
|
show(selectInfo) {
|
|
setSelectInfo(selectInfo)
|
|
|
|
requestAnimationFrame(() => {
|
|
dialogRef.current?.setVisible(true)
|
|
})
|
|
},
|
|
}))
|
|
|
|
const handleHide = () => {
|
|
requestAnimationFrame(() => {
|
|
setSelectInfo({ ...selectInfo, musicInfo: null })
|
|
})
|
|
}
|
|
|
|
const handleSelect = (listInfo: LX.List.MyListInfo) => {
|
|
dialogRef.current?.setVisible(false)
|
|
if (selectInfo.isMove) {
|
|
void moveListMusics(selectInfo.listId, listInfo.id,
|
|
[selectInfo.musicInfo as LX.Music.MusicInfo],
|
|
settingState.setting['list.addMusicLocationType'],
|
|
).then(() => {
|
|
toast(t('list_edit_action_tip_move_success'))
|
|
}).catch(() => {
|
|
toast(t('list_edit_action_tip_move_failed'))
|
|
})
|
|
} else {
|
|
void addListMusics(listInfo.id,
|
|
[selectInfo.musicInfo as LX.Music.MusicInfo],
|
|
settingState.setting['list.addMusicLocationType'],
|
|
).then(() => {
|
|
toast(t('list_edit_action_tip_add_success'))
|
|
}).catch(() => {
|
|
toast(t('list_edit_action_tip_add_failed'))
|
|
})
|
|
}
|
|
}
|
|
|
|
return (
|
|
<Dialog ref={dialogRef} onHide={handleHide}>
|
|
{
|
|
selectInfo.musicInfo
|
|
? (<>
|
|
<Title musicInfo={selectInfo.musicInfo} isMove={selectInfo.isMove} />
|
|
<List musicInfo={selectInfo.musicInfo} onPress={handleSelect} />
|
|
</>)
|
|
: null
|
|
}
|
|
</Dialog>
|
|
)
|
|
})
|
|
|