-
- {media && {media.total ? `${media.total} 首 · ${formatSize(media.totalBytes)}` : '0 首'}}
-
- {failed
- ?
- : !media
- ?
- : !media.items.length
- ? 还没有存储任何歌曲。
- : (
-
- {media.items.map(item => (
- -
-
-
{item.title}
-
{item.link}
-
- {`${item.source === 'bilibili' ? '哔哩哔哩 · ' : ''}${formatSize(item.size)} · 存入于 ${formatDateTime(item.storedAtMs)} · ${item.lastPlayedAtMs === null ? '还没有播放过' : `最近播放于 ${formatDateTime(item.lastPlayedAtMs)}`}`}
-
-
- setDeleting(item)} />
-
- ))}
-
- )}
+
+ {chosen.length > 0 && (
+
+
+ {`已选 ${chosen.length} 首 · ${formatSize(chosen.reduce((sum, item) => sum + item.size, 0))}`}
+
+
+
+
+ )}
+ 0 || undefined}>
+ onNavigate({ q: next, sort, page: 1 })} />
+
+ {content()}
{deleting && (
1 ? `删除 ${deleting.length} 首` : '删除'}
danger
onConfirm={async () => {
- const result = await adminStore.call(() => api.adminRemoveMedia({ media: [{ key: deleting.key }] }))
- if (result === null)
+ const before = list?.items.map(item => item.key) ?? []
+ const keys = deleting.map(item => item.key)
+ const result = await store.remove(keys)
+ if (!result)
return
- if (result.inUse.length) {
- notificationStore.error('这首歌还在房间的播放列表中,不能删除')
- return
- }
+ nextFocusRef.current = rowAfterRemoval(before, store.state.list?.items.map(item => item.key) ?? [], keys)
setDeleting(null)
- setFailed(false)
- setReload(n => n + 1)
+ const message = removalMessage(deleting.length, result.inUse.length)
+ if (result.inUse.length)
+ notificationStore.info(message, 5000)
+ else
+ notificationStore.success(message)
}}
onClose={() => setDeleting(null)}
+ returnFocus={() => rowOrHeading('admin-media-title', nextFocusRef.current)}
>
- {`删除${bookTitle(deleting.title)}的音频和封面后,再点这首歌会重新下载。`}
+ {deleteConfirmText(deleting)}
)}