maintain playlist order on header play (#1318)

This commit is contained in:
jeffvli
2025-12-04 19:50:48 -08:00
parent c27a9bf95b
commit 7ac47377f1
4 changed files with 21 additions and 11 deletions
+2
View File
@@ -6,8 +6,10 @@ interface ListContextProps {
customFilters?: Record<string, unknown>; customFilters?: Record<string, unknown>;
id?: string; id?: string;
itemCount?: number; itemCount?: number;
listData?: unknown[];
pageKey: ItemListKey | string; pageKey: ItemListKey | string;
setItemCount?: (itemCount: number) => void; setItemCount?: (itemCount: number) => void;
setListData?: (items: unknown[]) => void;
} }
export const ListContext = createContext<ListContextProps>({ export const ListContext = createContext<ListContextProps>({
@@ -12,7 +12,7 @@ import { ListSearchInput } from '/@/renderer/features/shared/components/list-sea
import { useCurrentServer } from '/@/renderer/store'; import { useCurrentServer } from '/@/renderer/store';
import { formatDurationString } from '/@/renderer/utils'; import { formatDurationString } from '/@/renderer/utils';
import { Stack } from '/@/shared/components/stack/stack'; import { Stack } from '/@/shared/components/stack/stack';
import { LibraryItem } from '/@/shared/types/domain-types'; import { LibraryItem, Song } from '/@/shared/types/domain-types';
interface PlaylistDetailSongListHeaderProps { interface PlaylistDetailSongListHeaderProps {
isSmartPlaylist?: boolean; isSmartPlaylist?: boolean;
@@ -26,7 +26,7 @@ export const PlaylistDetailSongListHeader = ({
}: PlaylistDetailSongListHeaderProps) => { }: PlaylistDetailSongListHeaderProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { playlistId } = useParams() as { playlistId: string }; const { playlistId } = useParams() as { playlistId: string };
const { itemCount } = useListContext(); const { itemCount, listData } = useListContext();
const server = useCurrentServer(); const server = useCurrentServer();
const location = useLocation(); const location = useLocation();
@@ -43,8 +43,8 @@ export const PlaylistDetailSongListHeader = ({
<PageHeader> <PageHeader>
<LibraryHeaderBar ignoreMaxWidth> <LibraryHeaderBar ignoreMaxWidth>
<LibraryHeaderBar.PlayButton <LibraryHeaderBar.PlayButton
ids={[playlistId]}
itemType={LibraryItem.PLAYLIST} itemType={LibraryItem.PLAYLIST}
songs={listData as Song[]}
/> />
<LibraryHeaderBar.Title>{detailQuery?.data?.name}</LibraryHeaderBar.Title> <LibraryHeaderBar.Title>{detailQuery?.data?.name}</LibraryHeaderBar.Title>
{isSmartPlaylist && ( {isSmartPlaylist && (
@@ -1,4 +1,5 @@
import { forwardRef, useMemo } from 'react'; import { forwardRef, useMemo } from 'react';
import { useEffect } from 'react';
import { useItemListColumnReorder } from '/@/renderer/components/item-list/helpers/use-item-list-column-reorder'; import { useItemListColumnReorder } from '/@/renderer/components/item-list/helpers/use-item-list-column-reorder';
import { useItemListColumnResize } from '/@/renderer/components/item-list/helpers/use-item-list-column-resize'; import { useItemListColumnResize } from '/@/renderer/components/item-list/helpers/use-item-list-column-resize';
@@ -6,6 +7,7 @@ import { useItemListScrollPersist } from '/@/renderer/components/item-list/helpe
import { ItemTableList } from '/@/renderer/components/item-list/item-table-list/item-table-list'; import { ItemTableList } from '/@/renderer/components/item-list/item-table-list/item-table-list';
import { ItemTableListColumn } from '/@/renderer/components/item-list/item-table-list/item-table-list-column'; import { ItemTableListColumn } from '/@/renderer/components/item-list/item-table-list/item-table-list-column';
import { ItemControls, ItemListTableComponentProps } from '/@/renderer/components/item-list/types'; import { ItemControls, ItemListTableComponentProps } from '/@/renderer/components/item-list/types';
import { useListContext } from '/@/renderer/context/list-context';
import { usePlayer } from '/@/renderer/features/player/context/player-context'; import { usePlayer } from '/@/renderer/features/player/context/player-context';
import { usePlaylistSongListFilters } from '/@/renderer/features/playlists/hooks/use-playlist-song-list-filters'; import { usePlaylistSongListFilters } from '/@/renderer/features/playlists/hooks/use-playlist-song-list-filters';
import { useSearchTermFilter } from '/@/renderer/features/shared/hooks/use-search-term-filter'; import { useSearchTermFilter } from '/@/renderer/features/shared/hooks/use-search-term-filter';
@@ -55,21 +57,24 @@ export const PlaylistDetailSongListTable = forwardRef<any, PlaylistDetailSongLis
const { searchTerm } = useSearchTermFilter(); const { searchTerm } = useSearchTermFilter();
const { query } = usePlaylistSongListFilters(); const { query } = usePlaylistSongListFilters();
const { setListData } = useListContext();
const filterSortedSongs = useMemo(() => { const songData = useMemo(() => {
let items = data?.items || []; let items = data?.items || [];
if (searchTerm) { if (searchTerm) {
if (searchTerm) { items = searchLibraryItems(items, searchTerm, LibraryItem.SONG);
items = searchLibraryItems(items, searchTerm, LibraryItem.SONG);
}
return sortSongList(items, query.sortBy, query.sortOrder);
} }
return sortSongList(items, query.sortBy, query.sortOrder); return sortSongList(items, query.sortBy, query.sortOrder);
}, [data?.items, searchTerm, query.sortBy, query.sortOrder]); }, [data?.items, searchTerm, query.sortBy, query.sortOrder]);
useEffect(() => {
if (setListData) {
setListData(songData);
}
}, [songData, setListData]);
const player = usePlayer(); const player = usePlayer();
const currentSong = usePlayerSong(); const currentSong = usePlayerSong();
@@ -97,7 +102,7 @@ export const PlaylistDetailSongListTable = forwardRef<any, PlaylistDetailSongLis
autoFitColumns={autoFitColumns} autoFitColumns={autoFitColumns}
CellComponent={ItemTableListColumn} CellComponent={ItemTableListColumn}
columns={columns} columns={columns}
data={filterSortedSongs} data={songData}
enableAlternateRowColors={enableAlternateRowColors} enableAlternateRowColors={enableAlternateRowColors}
enableExpansion={false} enableExpansion={false}
enableHorizontalBorders={enableHorizontalBorders} enableHorizontalBorders={enableHorizontalBorders}
@@ -405,16 +405,19 @@ const PlaylistDetailSongListRoute = () => {
}; };
const [itemCount, setItemCount] = useState<number | undefined>(undefined); const [itemCount, setItemCount] = useState<number | undefined>(undefined);
const [listData, setListData] = useState<unknown[]>([]);
const providerValue = useMemo(() => { const providerValue = useMemo(() => {
return { return {
customFilters: undefined, customFilters: undefined,
id: playlistId, id: playlistId,
itemCount, itemCount,
listData,
pageKey: ItemListKey.PLAYLIST_SONG, pageKey: ItemListKey.PLAYLIST_SONG,
setItemCount, setItemCount,
setListData,
}; };
}, [playlistId, itemCount]); }, [playlistId, itemCount, listData]);
return ( return (
<AnimatedPage key={`playlist-detail-songList-${playlistId}`}> <AnimatedPage key={`playlist-detail-songList-${playlistId}`}>