diff --git a/packages/app/app/components/PlaylistView/index.tsx b/packages/app/app/components/PlaylistView/index.tsx index a9d783692d..651fc80497 100644 --- a/packages/app/app/components/PlaylistView/index.tsx +++ b/packages/app/app/components/PlaylistView/index.tsx @@ -4,8 +4,15 @@ import { useTranslation } from 'react-i18next'; import { useHistory } from 'react-router'; import { Icon } from 'semantic-ui-react'; -import { Playlist } from '@nuclear/core'; -import { Button, ContextPopup, PopupButton, InputDialog, timestampToTimeString, Tooltip } from '@nuclear/ui'; +import { Playlist, PlaylistTrack } from '@nuclear/core'; +import { + Button, + ContextPopup, + PopupButton, + InputDialog, + timestampToTimeString, + Tooltip +} from '@nuclear/ui'; import { Track } from '@nuclear/ui/lib/types'; import artPlaceholder from '../../../resources/media/art_placeholder.png'; @@ -26,7 +33,7 @@ export type PlaylistViewProps = { onReorderTracks: (isource: number, idest: number) => void; isExternal?: boolean; externalSourceName?: string; -} +}; const PlaylistView: React.FC = ({ playlist, @@ -45,16 +52,42 @@ const PlaylistView: React.FC = ({ const { t, i18n } = useTranslation('playlists'); const history = useHistory(); - const onRenamePlaylist = useCallback((name: string) => { - const updatedPlaylist = { - ...playlist, - name - }; - updatePlaylist(updatedPlaylist); - }, [playlist, updatePlaylist]); + const onRenamePlaylist = useCallback( + (name: string) => { + const updatedPlaylist = { + ...playlist, + name + }; + updatePlaylist(updatedPlaylist); + }, + [playlist, updatePlaylist] + ); + const onUpdateTrack = useCallback( + (index: number, updatedTrack: Track) => { + const updatedTracks = playlist.tracks.map((track, i) => { + if (i === index) { + return { + ...updatedTrack, + stream: (track as PlaylistTrack).stream + } as PlaylistTrack; + } + return track; + }); + + const updatedPlaylist = { + ...playlist, + tracks: updatedTracks + } as Playlist; - const onAddAll = useCallback(() => addTracks(playlist.tracks), - [addTracks, playlist]); + updatePlaylist(updatedPlaylist); + }, + [playlist, updatePlaylist] + ); + + const onAddAll = useCallback( + () => addTracks(playlist.tracks), + [addTracks, playlist] + ); const onPlayAll = useCallback(() => { clearQueue(); @@ -64,13 +97,16 @@ const PlaylistView: React.FC = ({ }, [addTracks, clearQueue, playlist, selectSong, startPlayback]); const onDeleteTrack = !isExternal - ? useCallback((trackToRemove: Track, trackIndex: number) => { - const newPlaylist = { - ...playlist, - tracks: playlist.tracks.filter((_, index) => index !== trackIndex) - }; - updatePlaylist(newPlaylist); - }, [playlist, updatePlaylist]) + ? useCallback( + (trackToRemove: Track, trackIndex: number) => { + const newPlaylist = { + ...playlist, + tracks: playlist.tracks.filter((_, index) => index !== trackIndex) + }; + updatePlaylist(newPlaylist); + }, + [playlist, updatePlaylist] + ) : undefined; const onDeletePlaylist = useCallback(() => { @@ -94,27 +130,30 @@ const PlaylistView: React.FC = ({ }, [exportPlaylist, playlist, t]); return ( -
+
- { - isExternal && + {isExternal && (
+
{externalSourceName}
@@ -122,9 +161,11 @@ const PlaylistView: React.FC = ({ position='bottom center' />
- } + )}
- +
{playlist.name} = ({ initialString={playlist.name} onAccept={onRenamePlaylist} trigger={ - !isExternal && -
@@ -149,18 +191,18 @@ const PlaylistView: React.FC = ({ {`${playlist.tracks.length} ${t('number-of-tracks')}`} - { - playlist.lastModified && + {playlist.lastModified && ( <> - - · - + · - {`${t('modified-at')}${timestampToTimeString(playlist.lastModified, i18n.language)}`} + {`${t('modified-at')}${timestampToTimeString( + playlist.lastModified, + i18n.language + )}`} - } + )}
diff --git a/packages/app/app/containers/AlbumViewContainer/__snapshots__/AlbumViewContainer.test.tsx.snap b/packages/app/app/containers/AlbumViewContainer/__snapshots__/AlbumViewContainer.test.tsx.snap index e3d17fecb1..626465eb94 100644 --- a/packages/app/app/containers/AlbumViewContainer/__snapshots__/AlbumViewContainer.test.tsx.snap +++ b/packages/app/app/containers/AlbumViewContainer/__snapshots__/AlbumViewContainer.test.tsx.snap @@ -294,40 +294,44 @@ exports[`Album view container should display an album 1`] = `
- - test track 1 - - -