reimplement smart playlists

This commit is contained in:
jeffvli
2025-11-28 21:27:27 -08:00
parent 9d3c44ef15
commit 06d0c715af
8 changed files with 381 additions and 193 deletions
@@ -8,6 +8,7 @@ import { AppRoute } from '/@/renderer/router/routes';
import { useCurrentServerId } from '/@/renderer/store';
import { ContextMenu } from '/@/shared/components/context-menu/context-menu';
import { ConfirmModal } from '/@/shared/components/modal/modal';
import { Text } from '/@/shared/components/text/text';
import { toast } from '/@/shared/components/toast/toast';
import { Playlist } from '/@/shared/types/domain-types';
@@ -21,31 +22,30 @@ export const DeletePlaylistAction = ({ items }: DeletePlaylistActionProps) => {
const serverId = useCurrentServerId();
const deletePlaylistMutation = useDeletePlaylist({});
const handleDeletePlaylist = useCallback(() => {
const handleDeletePlaylist = useCallback(async () => {
if (items.length === 0 || !serverId) return;
const playlist = items[0];
try {
await Promise.all(
items.map((playlist) =>
deletePlaylistMutation.mutateAsync({
apiClientProps: { serverId },
query: { id: playlist.id },
}),
),
);
navigate(AppRoute.PLAYLISTS, { replace: true });
toast.success({
message: t('action.deletePlaylist', { postProcess: 'sentenceCase' }),
});
} catch (err: any) {
toast.error({
message: err.message,
title: t('error.genericError', { postProcess: 'sentenceCase' }),
});
}
deletePlaylistMutation.mutate(
{
apiClientProps: { serverId },
query: { id: playlist.id },
},
{
onError: (err) => {
toast.error({
message: err.message,
title: t('error.genericError', { postProcess: 'sentenceCase' }),
});
},
onSuccess: () => {
navigate(AppRoute.PLAYLISTS, { replace: true });
toast.success({
message: t('action.deletePlaylist', { postProcess: 'sentenceCase' }),
});
},
},
);
closeAllModals();
}, [deletePlaylistMutation, items, navigate, serverId, t]);
@@ -55,7 +55,7 @@ export const DeletePlaylistAction = ({ items }: DeletePlaylistActionProps) => {
openModal({
children: (
<ConfirmModal onConfirm={handleDeletePlaylist}>
{t('common.areYouSure', { postProcess: 'sentenceCase' })}
<Text>{t('common.areYouSure', { postProcess: 'sentenceCase' })}</Text>
</ConfirmModal>
),
title: t('form.deletePlaylist.title', { postProcess: 'sentenceCase' }),