2023-02-18 00:07:14 +08:00

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>
)
})