import { Group, Stack } from '@mantine/core'; import { closeAllModals, openModal } from '@mantine/modals'; import { forwardRef, Fragment, Ref } from 'react'; import { RiMoreFill } from 'react-icons/ri'; import { generatePath, useNavigate, useParams } from 'react-router'; import { Link } from 'react-router-dom'; import { DropdownMenu, Button, ConfirmModal, toast, Text } from '/@/renderer/components'; import { usePlayQueueAdd } from '/@/renderer/features/player'; import { UpdatePlaylistForm } from './update-playlist-form'; import { useDeletePlaylist } from '/@/renderer/features/playlists/mutations/delete-playlist-mutation'; import { usePlaylistDetail } from '/@/renderer/features/playlists/queries/playlist-detail-query'; import { LibraryHeader, PlayButton, PLAY_TYPES } from '/@/renderer/features/shared'; import { AppRoute } from '/@/renderer/router/routes'; import { usePlayButtonBehavior } from '/@/renderer/store/settings.store'; import { LibraryItem, Play } from '/@/renderer/types'; import { formatDurationString } from '/@/renderer/utils'; interface PlaylistDetailHeaderProps { background: string; imagePlaceholderUrl?: string | null; imageUrl?: string | null; } export const PlaylistDetailHeader = forwardRef( ( { background, imageUrl, imagePlaceholderUrl }: PlaylistDetailHeaderProps, ref: Ref, ) => { const navigate = useNavigate(); const { playlistId } = useParams() as { playlistId: string }; const detailQuery = usePlaylistDetail({ id: playlistId }); const handlePlayQueueAdd = usePlayQueueAdd(); const playButtonBehavior = usePlayButtonBehavior(); const handlePlay = (playType?: Play) => { handlePlayQueueAdd?.({ byItemType: { id: [playlistId], type: LibraryItem.PLAYLIST, }, play: playType || playButtonBehavior, }); }; const openUpdatePlaylistModal = () => { openModal({ children: ( ), title: 'Edit playlist', }); }; const deletePlaylistMutation = useDeletePlaylist(); const handleDeletePlaylist = () => { deletePlaylistMutation.mutate( { query: { id: playlistId } }, { onError: (err) => { toast.error({ message: err.message, title: 'Error deleting playlist', }); }, onSuccess: () => { toast.success({ message: `${detailQuery?.data?.name} was successfully deleted`, title: 'Playlist deleted', }); closeAllModals(); navigate(AppRoute.PLAYLISTS); }, }, ); }; const openDeletePlaylist = () => { openModal({ children: ( Are you sure you want to delete this playlist? ), title: 'Delete playlist', }); }; const metadataItems = [ { id: 'songCount', secondary: false, value: `${detailQuery?.data?.songCount || 0} songs`, }, { id: 'duration', secondary: true, value: detailQuery?.data?.duration && formatDurationString(detailQuery.data.duration), }, ]; return ( {metadataItems.map((item, index) => ( {index > 0 && } {item.value} ))} {detailQuery?.data?.description} handlePlay()} /> {PLAY_TYPES.filter((type) => type.play !== playButtonBehavior).map((type) => ( handlePlay(type.play)} > {type.label} ))} Edit playlist Delete playlist ); }, );